Spring @Aspect切面无法使用@Autowired注入以及获取被切方法中的某个参数

在Spring中一般使用@Aspect注解来定义一个切面,但是测试发现:

@Aspect
@Component
public class IpWhiteListAspect {
    @Autowired
    private IpWhiteListConfig ipWhiteListConfig;

使用上述代码,运行的时候发现 bean ipWhiteListConfignull,解决方法可以参见:
https://stackoverflow.com/questions/9633840/spring-autowired-bean-for-aspect-aspect-is-null,这里稍微解释下,切面bean是在Spring容器之外创建的且是单例,因此无法使用Spring的注入。

如果是采用xml配置的话:

<bean id="切面bean的id" class="切面的类" 
     factory-method="aspectOf" />

如果采用注解方式的话:

@Configuration
@ComponentScan("com.kirillch.eqrul")
public class AspectConfig {

    @Bean
    public EmailAspect theAspect() {
        EmailAspect aspect = Aspects.aspectOf(EmailAspect.class);
        return aspect;
    }

}

这样便可以在切面中自动注入了。

同时,当我们使用切面时,我们可能想获取被切方法里的某个变量(方法可能有多个变量),一种方案是遍历切面中的ProceedingJoinPoint对象获取参数,另外可以使用 args() 来获取,如下

@Pointcut("com.xyz.myapp.SystemArchitecture.dataAccessOperation() &&" + 
          "args(account,..)")
private void accountDataAccessOperation(Account account) {}

注意到 agrs中的account后面还有 ..,对于被切的方法参数中包含不只account一个来讲很关键。

阅读更多

没有更多推荐了,返回首页