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一个来讲很关键。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
在 Java 8 ,你可以使用 `@Transactional` 注解将事务管理应用于切面。`@Transactional` 注解用于将方法标记为事务性方法,以便在方法执行期间启动、提交或回滚事务。 要在切面使用 `@Transactional` 注解,首先需要确保你的项目已经添了相关的依赖。通常,你需要添 Spring 的事务管理依赖,例如: ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.3.10</version> </dependency> ``` 接下来,你可以在切面方法上添 `@Transactional` 注解来启用事务管理。例如: ```java @Aspect @Component public class MyAspect { @Autowired private SomeService someService; @Around("@annotation(org.springframework.transaction.annotation.Transactional)") public Object aroundTransactionalMethod(ProceedingJoinPoint joinPoint) throws Throwable { try { // 在方法执行前启动事务 someService.startTransaction(); // 执行被切入的方法 Object result = joinPoint.proceed(); // 在方法执行后提交事务 someService.commitTransaction(); return result; } catch (Exception e) { // 在发生异常时回滚事务 someService.rollbackTransaction(); throw e; } } } ``` 在上面的示例切面类 `MyAspect` 使用 `@Around` 注解来定义一个环绕通知,该通知会在标记了 `@Transactional` 注解的方法执行前后进行处理。你可以根据实际需求来自定义切面类的逻辑。 请确保在应用程序的配置文件启用了切面自动代理,以便使切面生效。例如,在 Spring Boot ,你可以使用 `@EnableAspectJAutoProxy` 注解来启用自动代理。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zlp1992

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值