在Spring中一般使用@Aspect注解来定义一个切面,但是测试发现:
@Aspect
@Component
public class IpWhiteListAspect {
@Autowired
private IpWhiteListConfig ipWhiteListConfig;
使用上述代码,运行的时候发现 bean ipWhiteListConfig
为null
,解决方法可以参见:
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一个来讲很关键。