私はSpringWebアプリケーションを使用しており、サービスオブジェクトにいくつかの側面を追加しようとしています。目標は、単一のリクエストスコープを通じてのみアスペクトの状態を維持し、状態を管理できるようにアスペクトインスタンスへの参照を取得することです。私は3つの異なるバージョンのコードを試し、コントローラーを介してリクエストを行いました。
- 関連するコードと同じです(以下を参照)。状態は複数の呼び出しを通じて保持されますが、
@Autowired TestAspect aspect
インスタンスはAOPフレームワークによる同じ使用法ではありません。 factory-method="aspectOf"
Beans-context.xmlのtestAspectBean宣言に追加すると、状態は前のケースと同じように保持され、@Autowired TestAspect aspect
インスタンスはAOPフレームワークで使用されるものと同じです。それは機能しますが、アスペクトのスコープを単一のリクエストにしたいのですが、この場合、アプリケーションスコープのシングルトンがあります。- で置き換える
@Aspect
と@Aspect("perthis(participateAroundPointcut())")
、次の例外が発生します: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"/>