spring学习 十三 注解AOP

  spring 不会自动去寻找注解,必须告诉 spring 哪些包下的类中可能有注解,也就是要开启注解扫描,注解的包是spring-context.jar,所以在配置文件中还要引入context约束,也就是引入 xmlns:context命名空间

第一步开始注解,base-package的属性值指定哪些包下可能有注解,多个包用逗号隔开,也可以采用通配符进行配置

<!-- 开启注解 -->
    <context:component-scan base-package="com.airplan.pojo,com.airplan.bean"></context:component-scan>
    
    <!-- 
        AOP的注解方式都是采用cglib动态代理
         proxy-target-class="true"代表采用cglib动态代理
         false代表使用jdk的动态代理
     -->
    <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>

第二步:对要注册到spring器的类打上注解,例如@Service,@Component等

@Component  相当于<bean/>,如果没有参数,把类名首字母变小写,相当于<bean id=””/>,也可以@Component(“自定义名称”)

我们对通知类,以及切点所在的类要打上注解
切点类:在方法上添加@Pointcut(“”) 定义切点

package com.airplan.pojo;

import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component("pointCutClass")
public class PointCutClass {
    /**
     * 声明切点
     * @param name01
     */
    @Pointcut("execution(* com.airplan.pojo.PointCutClass.*(..))")
    public void pointCutFun() {
        
        System.out.println("切点执行");
    }
}

通知类:@Aspect 相当于<aop:aspect/>表示通知方法在当前类中,

@Before("com.bjsxt.test.Demo.demo1()")注解代表当前方法是前置通知,@Before注解中的值时切点的全路径

package com.airplan.pojo;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Component("advice")
@Aspect
public class Advice {
    
        @Before("com.airplan.pojo.PointCutClass.pointCutFun()")
        public void mybefore(String name){
            System.out.println("前置"+name );
            System.out.println("before");
        }
        
        
        
}
原文地址:https://www.cnblogs.com/cplinux/p/9742096.html