Spring的代理模式(静态,JDK,CGLIB)

一.静态代理
 
1.定义业务接口
1 public interface Subject {
2 void doSomeThing();
3 }
 
2.真实业务类实现接口
1 public class RealSubject implements Subject{
2 @Override
3 public void doSomeThing() {
4 System.out.println("真实业务");
5 }
6 }
 
3.代理类也实现业务接口,创建真实业务对象,在重写的方法中做方法增强
1 public class proxySubject implements Subject{
2 Subject proxy = new RealSubject();
3 @Override
4 public void doSomeThing() {
5 System.out.println("前置增强");
6 proxy.doSomeThing();
7 System.out.println("后置增强");
8 }
9 }
 
4.测试类执行结果
1 public class proxyTest {
2 public static void main(String [] args){
3 Subject proxy = new proxySubject();
4 proxy.doSomeThing();
5  
6 }

 

}
 
二.JDK动态代理
 
1.同样是需要接口和实现类
2.JDK动态代理实现方式
 1 //JDK动态代理
 2 //真实业务对象
 3 final Subject subject = new RealSubject();
 4 //动态代理对象
 5 Subject proxy = (Subject)Proxy.newProxyInstance(subject.getClass().getClassLoader(), subject.getClass().getInterfaces(), new InvocationHandler() {
 6 @Override
 7 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 8 //增强操作
 9 System.out.println("前置增强===");
10 //方法传入真实业务对象
11 Object invoke = method.invoke(subject, args);
12 System.out.println("后置增强===");
13 return invoke;
14 }
15 });
16 proxy.doSomeThing();
17  

 

3.执行结果
 
三.CGLIB动态代理
1.需要导入依赖
1 <dependency>
2 <groupId>cglib</groupId>
3 <artifactId>cglib</artifactId>
4 <version>2.2</version>
5 </dependency>
6  

 

2.具体实现方式(不需要接口也能实现)
 1 //真实业务对象
 2 final service ser = new service();
 3 /**
 4 * Enhancer是一个非常重要的类,它允许为非接口类型创建一个JAVA代理,
 5 * Enhancer动态的创建给定类的子类并且拦截代理类的所有的方法,
 6 * 和JDK动态代理不一样的是不管是接口还是类它都能正常工作。
 7 * */
 8 Enhancer enhancer = new Enhancer();
 9 //关联真实业务对象
10 enhancer.setSuperclass(ser.getClass());
11 /**
12 * MethodInterceptor,这是一个功能很强大的接口,它可以实现类似于AOP编程中的环绕增强(around-advice)。
13 * 它只有一个方法public Object intercept(Object obj, java.lang.reflect.Method method, Object[] args,MethodProxy proxy) throws Throwable;。
14 * 代理类的所有方法调用都会转而执行这个接口中的intercept方法而不是原方法。
15 * */
16 enhancer.setCallback(new MethodInterceptor() {
17 @Override
18 public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
19 System.out.println("***前置增强***");
20 Object invoke = methodProxy.invoke(ser, objects);
21 System.out.println("***后置增强***");
22 return invoke;
23 }
24 });
25 //通过字节码技术动态创建子类实例
26 service service = (service) enhancer.create();
27 service.doSome();
28  

 

3.执行结果
 
posted @ 2019-10-28 14:55  怀鑫  阅读(212)  评论(0编辑  收藏  举报