我有一个 Spring Web 应用程序,我正在尝试向我的服务对象添加一些方面。目标是仅通过单个请求范围维护方面的状态,并获取对方面实例的引用,以便我可以管理状态。我尝试了 3 种不同版本的代码,通过控制器发出请求:
- 与相关代码相同(见下文)。状态是通过多次调用来保留的,但是
@Autowired TestAspect aspect
AOP框架使用的实例并不相同。 - 添加
factory-method="aspectOf"
到 beans-context.xml 中的 testAspect bean 声明,状态保持如前,@Autowired TestAspect aspect
实例与 AOP 框架使用的相同。虽然它有效,但我希望方面的范围是单个请求,而在这种情况下,我有一个应用程序范围的单例。 - 替换
@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 aspect
AOP 框架使用的相同方面实例的引用?是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"/>