Spring基础-AOP-动态代理开发

第二章动态代理开发

1.动态代理概念

 通过代理类为原始类添加额外功能
 便于原始类的维护

2.开发环境

 <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-aop</artifactId>
     <version>5.1.14.RELEASE</version>
 </dependency>
 <dependency>
     <groupId>org.aspectj</groupId>
     <artifactId>aspectjrt</artifactId>
     <version>1.8.8</version>
  </dependency>
 <dependency>
     <groupId>org.aspectj</groupId>
     <artifactId>aspectjweaver</artifactId>
     <version>1.8.3</version>
 </dependency>

3.开发步骤

  1. 创建原始类/目标类

     public class UserServiceImpl implements UserService{
         public void register(User user) {
             System.out.println("UserServiceImpl.register()");
        }
     ​
         public boolean login(User user) {
             System.out.println("UserServiceImpl.login()");
             return false;
        }
     }
  2. 额外功能

    MethodBeforeAdvice接口

     public class Before implements MethodBeforeAdvice {
     
      // method 原始类中的原始方法
         // object 原始方法中的参数
         // o 原始对象
         public void before(Method method, Object[] objects, Object o) throws Throwable {
             System.out.println("---Before.log---");
        }
     }

    MethodInterceptor接口

     public class Around implements MethodInterceptor {
     ​
         // methodInvocation << 原始方法
         public Object invoke(MethodInvocation methodInvocation) throws Throwable {
             // 运行在原始方法之前
             System.out.println("----Around start-----");
             Object ret = methodInvocation.proceed();
             // 运行在原始方法之后
             System.out.println("----Around end-----");
             return ret;
        }
     }

     

  3. 定义切入点

     切入点:额外功能加入的位置
     目的:程序员自定义给哪个方法加入额外功能
     <aop:config>
         <aop:pointcut id="pc" expression="execution(* *(..))"/>
     </aop:config>
  4. 组装

     将第二步和第三步整合
      切入点 + 额外功能
     <aop:config>
         <aop:advisor advice-ref="before" pointcut-ref="pc"/>
     </aop:config>
  5. 调用

     目的:获得Spring工厂创建的动态代理对象
     注意:
      1.Spring工厂通过id属性获得的是代理对象
     ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext2.xml");
     UserService userService = ctx.getBean("userService", UserService.class);
     userService.login(new User());
     System.out.println(userService.getClass());
     // class com.sun.proxy.$Proxy7

4.动态代理细节分析

 1.Spring创建的代理类在什么地方
  Spring框架在运行时,通过动态字节码技术,在虚拟机内部,程序结束,动态代理类也会小时
  小心方法区OutOfMemory
 2.动态代理编程简化了代理开发
  切入点 + 额外功能
  类似于搭积木
 3.便于额外功能的维护

 

上一篇:微信iOS SDK文档总结


下一篇:微信公众平台开发