1. 程式人生 > >spring學習 十三 註解AOP

spring學習 十三 註解AOP

RoCE ron nbsp 尋找 system -a aspect auto com

  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");
        }
        
        
        
}

spring學習 十三 註解AOP