使用注解装配AOP


在实际项目中,这种写法其实很少使用。假设你写了一个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!

下载练习: (推荐使用IDE练习插件快速下载)

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

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

使用注解装配AOP - 图2