0

我有一个 Spring Web 应用程序,我正在尝试向我的服务对象添加一些方面。目标是仅通过单个请求范围维护方面的状态,并获取对方面实例的引用,以便我可以管理状态。我尝试了 3 种不同版本的代码,通过控制器发出请求:

  1. 与相关代码相同(见下文)。状态是通过多次调用来保留的,但是@Autowired TestAspect aspectAOP框架使用的实例并不相同。
  2. 添加factory-method="aspectOf"到 beans-context.xml 中的 testAspect bean 声明,状态保持如前,@Autowired TestAspect aspect实例与 AOP 框架使用的相同。虽然它有效,但我希望方面的范围是单个请求,而在这种情况下,我有一个应用程序范围的单例。
  3. 替换@Aspect@Aspect("perthis(participateAroundPointcut())")I 得到以下异常:Caused by: java.lang.IllegalArgumentException: Bean with name 'testAspect' is a singleton, but aspect instantiation model is not singleton,无论factory-method="aspectOf"有无。

如何获得@Autowired TestAspect aspectAOP 框架使用的相同方面实例的引用?是factory-method="aspectOf"唯一的方法吗?我怎样才能有一个请求范围的方面而不是一个单例?为什么我得到异常?

这是我的代码。服务:

@Service
public class TestService {

    @Autowired
    private TestAspect aspect;

    private static final Logger logger = LoggerFactory.getLogger(TestService.class);

    public void method(){
            logger.debug("Executing method");
    }

    public void service(){
        aspect.initialize();
        method();
    }
}

方面:(无("perthis(participateAroundPointcut())")

@Aspect
public class TestAspect {

    private static final Logger logger = LoggerFactory.getLogger(ParticipatoryAspect.class);

    private boolean initialized=false;

    @Pointcut("execution(* org.mose.emergencyalert.TestService.method(..))")
    public void participateAroundPointcut(){}

    @Around("participateAroundPointcut()")
    public void participateAround(ProceedingJoinPoint joinPoint) throws Throwable{
        logger.debug("Pre-execution; Initialized: "+initialized);
        joinPoint.proceed();
        logger.debug("Post-execution");
    }

    public void initialize(){
        this.initialized=true;
        logger.debug("Initialized: "+initialized);
    }
}

beans-context.xml(没有factory-method="aspectOf"):

<aop:aspectj-autoproxy />

<bean id="testAspect" class="org.mose.emergencyalert.aop.aspects.TestAspect"/>
4

0 回答 0