欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring学习之AOP

程序员文章站 2022-05-24 23:44:27
...

学完了基础的AOP,感觉有几个要点要记住.
1.AspectJ自动代理要加上,不然@Aspect注解不起作用

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

2.环绕通知可以把其它通知的事情一块干了,比较简单方便


@Aspect
@Component
public class AudienceAround {
    @Pointcut("execution(* concert.Performance.perform(..))")
    public void performance(){}

    @Around("performance()")
    public void watchPerformance(ProceedingJoinPoint jp){

        try {
            System.out.println("Silencing cell phones 华为,中国的骄傲");
            System.out.println("Taking seats");
            jp.proceed();
            System.out.println("CLAP CLAP CLAP!!!");
        } catch (Throwable throwable) {
            System.out.println("Demanding a refund");
        }


    }
}

3.每一个Aspect都是一个bean,要加上 @Component 注解
4.注解可以变相的为代理对象添加新的功能,XML配置更加的清晰


    <aop:config>
        <aop:aspect>
            <aop:declare-parents types-matching="concertXML.Performance+"
                                 implement-interface="concertXML.Encoreable" default-impl="concertXML.DefaultEncoreable"/>
        </aop:aspect>
    </aop:config>

类的形式很容易就把人搞晕,所以建议用XML配置

@Aspect
@Component
public class EncoreableIntroducer {
    @DeclareParents(value = "concert.Performance+",defaultImpl = DefaultEncoreable.class)
    public static Encoreable encoreable;
}

5.添加的新功能使用的时候,是强制类型转换,这个一般人根本想不到,不是很直观

Performance p= (Performance) context.getBean(Performance.class);
((Encoreable)p).perfromEncore();

6.使用AOP实现权限控制,是练习重点