代理模式
代理模式分为静态代理与动态代理(jdk动态代理,cglib动态代理)
一、静态代理
概念:若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的。 通常情况下, 静态代理中的代理类和目标类会实现同一接口或是派生自相同的父类。
1、定义接口
package com.sxt.service;
/**
* @author IF
*定义接口
*/
public interface Star {
public void run(String msg);
}
2、接口实现类
package com.sxt.service.impl;
import com.sxt.service.Star;
public class StarImpl implements Star{
@Override
public void run(String msg) {
System.out.println("林俊杰"+msg);
}
}
3、创建静态代理类
package com.sxt.proxy;
import com.sxt.service.Star;
/**
* @author IF
* 静态代理类
*/
public class StaticStarProxy {
private Star target;
public StaticStarProxy(Star target){
super();
this.target=target;
}
/**
* 代理方法
*/
public void run(String msg){
System.out.println("--目标对象执行之前--");
//目标对象增强
msg=msg.toUpperCase();
//执行目标对象的方法
target.run(msg);
System.out.println("--目标对象执行之后--");
}
}
4、测试
二、动态代理模式
代理类在程序运行时创建的代理方式被成为 动态代理。 也就是说,这种情况下,代理类并不是在Java代码中定义的,而是在运行时根据我们在Java代码中的“指示”动态生成的。
JDK动态代理
1、定义接口
package com.sxt.service;
public interface Star {
public void run(String msg);
}
2、接口实现类
package com.sxt.service.impl;
import com.sxt.service.Star;
public class StarImpl implements Star{
@Override
public void run(String msg) {
System.out.println("林俊杰"+msg);
}
}
3、JDK动态代理实现:
package com.sxt.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.sxt.service.Star;
import com.sxt.service.impl.StarImpl;
public class Test {
public static void main(String[] args) {
//1.获取目标对象
Star target=new StarImpl();
//2.通过jdk动态代理获取代理对象
Star proxy=(Star) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("----代理类执行之前----"+args[0]);
String msg=args[0].toString().toUpperCase();
//目标对象方法的执行
method.invoke(target, msg);
System.out.println("---代理类执行之后---");
return null;
}
});
//通过代理类增强目标对象
proxy.run("hello");
}
}
cglib动态代理
1、导入需要使用的jar包
2、创建目标类
package com.sxt.service.impl;
public class StarImpl {
public void run(String msg){
System.out.println("林俊杰:"+msg);
}
}
3、创建cglib工厂
package com.sxt.cglib;
import java.lang.reflect.Method;
import com.sxt.service.impl.StarImpl;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CglibFactory implements MethodInterceptor{
private StarImpl target;
public CglibFactory(StarImpl target){
super();
this.target=target;
}
public StarImpl newProxyInstance(){
//1.创建Enhancer对象
Enhancer e=new Enhancer();
//2.指定父类
e.setSuperclass(StarImpl.class);
//3.设置回调方法
e.setCallback(this);
return (StarImpl) e.create();
}
/**
* 增强目标方法
*/
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
System.out.println("--cglib 执行之前--");
String msg=arg2[0].toString().toUpperCase();
arg1.invoke(target, msg);//执行目标对象的方法
System.out.println("--cglib 执行之后--");
return null;
}
}