在实际项目中,这种写法其实很少使用。假设你写了一个SecurityAspect

    基本能实现无差别全覆盖,即某个包下面的所有Bean的所有方法都会被这个check()方法拦截。

    还有的童鞋喜欢用方法名前缀进行拦截:

    1. @Around("execution(public * update*(..))")
    2. public Object doLogging(ProceedingJoinPoint pjp) throws Throwable {
    3. // 对update开头的方法切换数据源:
    4. String old = setCurrentDataSource("master");
    5. Object retVal = pjp.proceed();
    6. return retVal;
    7. }

    这种非精准打击误伤面更大,因为从方法前缀区分是否是数据库操作是非常不可取的。

    我们在使用AOP时,要注意到虽然Spring容器可以把指定的方法通过AOP规则装配到指定的Bean的指定方法前后,但是,如果自动装配时,因为不恰当的范围,容易导致意想不到的结果,即很多不需要AOP代理的Bean也被自动代理了,并且,后续新增的Bean,如果不清楚现有的AOP装配规则,容易被强迫装配。

    或者直接在class级别注解,表示“所有public方法都被安排了”:

    1. @Component
    2. public class UserService {
    3. ...
    4. }

    通过@Transactional,某个方法是否启用了事务就一清二楚了。因此,装配AOP的时候,使用注解是最好的方式。

    我们以一个实际例子演示如何使用注解实现AOP装配。为了监控应用程序的性能,我们定义一个性能监控的注解:

    在需要被监控的关键方法上标注该注解:

    1. @Component
    2. // 监控register()方法性能:
    3. @MetricTime("register")
    4. public User register(String email, String password, String name) {
    5. ...
    6. }
    7. ...
    8. }

    然后,我们定义:

    有了@MetricTime注解,再配合MetricAspect,任何Bean,只要方法标注了@MetricTime注解,就可以自动实现性能监控。运行代码,输出结果如下:

    1. Welcome, Bob!

    从下载练习:使用注解+AOP实现性能监控 (推荐使用快速下载)

    使用注解实现AOP需要先定义注解,然后使用@Around("@annotation(name)")实现装配;

    使用注解既简单,又能明确标识AOP装配,是使用AOP推荐的方式。

    使用注解装配AOP - 图1