Spring框架学习---Spring AOP纯xml模式

Spring框架学习—Spring AOP纯xml模式

spring中AOP的代理选择

  1. Spring 实现AOP思想使⽤的是动态代理技术
  2. 默认情况下,Spring会根据被代理对象是否实现接⼝来选择使⽤JDK还是CGLIB。当被代理对象没有实现任何接⼝时,Spring会选择CGLIB。当被代理对象实现了接⼝,Spring会选择JDK官⽅的代理技术,不过我们可以通过配置的⽅式,让Spring强制使⽤CGLIB。

spring中AOP的实现

Spring是模块化开发的框架,使⽤aop就引⼊aop的jar
  1. 引入jar
<!--spring aop的jar包支持-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>5.1.12.RELEASE</version>
    </dependency>

    <!--第三方的aop框架aspectj的jar-->
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.8.13</version>
    </dependency>

XML配置

  1. 进行aop相关的xml配置,配置aop的过程其实就是把aop相关术语落地

  2. 使用config标签表明开始aop配置,在内部配置切面aspect,切面(aspect)可以设置多个

  3. aspect = 切入点(锁定方法) + 方位点(锁定方法中的特殊时机)+ 横切逻辑

    
    <bean id="logUtils" class="com.lagou.edu.utils.LogUtils">bean>
    
    <aop:config>
    		
            <aop:aspect id="logAspect" ref="logUtils">
            
            <aop:pointcut id="pt1" expression="execution(* *..*.*(..))"/>
            <aop:pointcut id="pt1" expression="execution(* com.lagou.edu.service.impl.TransferServiceImpl.*(..))"/>
            
    		
    		<aop:before method="beforeMethod" pointcut-ref="pt1"/>
    		
    		
    		
            <aop:after-returning method="successMethod" returning="retValue"/>
    		
    aop:config>
    

将上述部分的XML配置转换成注解模式

  1. 这部分在LogUtils类上加@Component注解

    <bean id="logUtils" class="com.lagou.edu.utils.LogUtils">bean>
    
  2. 这段代码可以在LogUtils类上添加注解@Aspect

     <aop:aspect id="logAspect" ref="logUtils">
    
  3. 这段代码可以在LogUtils类上添加一个空的实现方法,并且在方法上架一个注解@Pointcut注解的值是express的值

    <aop:pointcut id="pt1" expression="execution(* com.lagou.edu.service.impl.TransferServiceImpl.*(..))"/>
    
    @Pointcut("execution(* com.lagou.edu.service.impl.TransferServiceImpl.*(..))")
        public void pt1(){
    
        }
    
  4. 前置通知,在方法上添加注解@Before( ) ,括号里面写切入点的方法名

    @Before("pt1()")
        public void beforeMethod(JoinPoint joinPoint) {
            Object[] args = joinPoint.getArgs();
            for (int i = 0; i < args.length; i++) {
                Object arg = args[i];
                System.out.println(arg);
            }
            System.out.println("业务逻辑开始执行之前执行.......");
        }
    
  5. 业务结束时通知注解@After( 切入点方法名 )

  6. 异常时执行通知注解@AfterThrowing( 切入点方法名 )

  7. 业务逻辑正常执行通知注解@AfterReturn( value = "pt1()",returning = "retVal" ),value:切入点方法,returning:返回值类型

  8. 环绕通知注解@Around("pt1()")和上面的通知注解不要通用

  9. 由于AOP的这些xml的配置都变成了注解,所以要在xml文件中加一句注解驱动的配置

    
        <aop:aspectj-autoproxy/> 
    
  10. @EnableAspectJAutoProxy 纯注解开启AOP注解驱动

你可能感兴趣的:(spring)