我刚刚在项目中开始使用Spring AOP,并且在使Spring AOP正常工作时遇到了一些问题。
我有两个对象,TransportImpl和SesssionImpl,我想通过AOP进行分析。两个对象(bean)都是通过Spring初始化的。这两种bean都是业务的实现 接口(传输和会话)。我可以将Aspects应用于TransportImpl bean以便正常工作,但是应用于SessionImpl的那些不会触发。我可以确认一下 “mySessionMonitor”Aspect由Spring初始化,并且SessionImpl对象也被初始化,没有任何异常或错误。
我已经将我的PointCuts和Aspect剥离到最基本的形式。我原本期望下面描述的PointCut sessionOperation 在初始化SessionImpl bean并调用init-method初始化时触发。但这从未发生过。这里可能出了什么问题?
从配置文件:
<bean id="MyTransport" class="my.app.transport.TransportImpl" scope="singleton" />
<bean id="MySession" class="my.app.session.SessionImpl" init-method="initialise" scope="singleton" />
<aop:aspectj-autoproxy proxy-target-class="true">
<aop:include name="myTransportMonitor" />
<aop:include name="mySessionMonitor" />
</aop:aspectj-autoproxy>
<bean id="myTransportMonitor" class="my.app.aspects.TransportMonitoringAspect"/>
<bean id="mySessionMonitor" class="my.app.aspects.SessionMonitoringAspect" />
方面代码
// Aspect monitoring code
@Aspect
public class SessionMonitoringAspect
{
private Logger fileLogger = Logger.getLogger("myLogger");
public void initialise()
{
fileLogger.info("Initialising SessionMonitoringAspect");
}
@Pointcut ("execution (public * *(..))")
private void anyPublicOperation(){}
@Pointcut ("within(my.app.session..*)")
private void inSession(){}
@Pointcut("anyPublicOperation() && inSession()")
private void sessionOperation(){}
@Before("sessionOperation()")
public void sessionOperationDetected(JoinPoint jp)
{
fileLogger.info("Session operation detected - signature: " + jp.getSignature());
}
}
答案 0 :(得分:3)
我个人更喜欢将Aspect切入点配置放在应用程序上下文中,并且您在aop:aspect中缺少ref。
<bean id="mySessionMonitor" class="my.app.aspects.SessionMonitoringAspect" />
<aop:config proxy-target-class="true">
<aop:aspect ref="mySessionMonitor">
<aop:pointcut id="around" expression="execution (public * *(..))"/></aop:pointcut>
<aop:around pointcut-ref="around" method="aroundAdvice"/>
</aop:aspect>
</aop:config>
答案 1 :(得分:0)
我希望initialise()
方法不属于my.app.session.SessionImpl
。如果是这样,您的Aspect的initialise()
方法将无法触发。因为你不能从bean类调用aspect的方法。否则,请附上my.app.session.SessionImpl
代码以获取详细信息。
答案 2 :(得分:0)
如果您更喜欢基于注释的配置,请参阅我写的this example。您在XML配置中所需要的只是<aop:aspectj-autoproxy />
。