1

我的 aop 配置如下

aop:config>
        <aop:aspect id="Intercepter" ref="aspect1">
            <aop:around pointcut="execution(* *..*ServiceImpl.*(..))"
                method="serviceIntercept" />

        </aop:aspect>
    </aop:config>

 <bean id="aspect1" class=Intercepter">

    </bean>

public class Intercepter

{
private String variable1;

    public Intercepter()
    {
    }

    public Object serviceIntercept(ProceedingJoinPoint pjp)
        throws Throwable
    {
 Object retVal = null;
        //Method M1 set value of variable1
        M1();
  // call actual Method on ServiceImpl
 retVal = pjp.proceed();
    }

public class AServiceImpl  {
Method1();
Method1(){
call Method2 on BServiceImpl from AServiceImpl
 BServiceImpl.Method2()
}

}

public class BServiceImpl  {
Method2();

}

Main(){
// call AServiceImpl assuming it is single threaded.
 AServiceImpl() 


}

所以顺序如下

1.首先从Main()调用AServiceImpl()被拦截,变量variable1设置为variable1="test";2.现在调用 AServiceImpl 上的实际方法 Method1()。

3.从Method1()再次调用BServiceImpl上的Method2()。所以又被拦截了。之前variable1的值设置为“test”,现在设置为“”。所以每次拦截的值变量1已更改

那么,编写 aop 以使其免受多线程和单线程程序的影响的最佳实践是什么?

.在这种情况下,它是单例,因为类拦截器是单例和单线程的。所以我可以看到将方面编写为单例的问题。类似的问题可能发生在多线程程序中。可能将方面类编写为不可变类或用原型替换单例可以是我理解的解决方案。但是,我想就人们在他们的程序中使用的不同方法获得更深入的想法、信息和解决方案。

4

1 回答 1

0

在多线程程序中保持单例状态的最简单方法是使用ThreadLocal变量。

在您的情况下,您必须替换String variable1ThreadLocal<String> variable1.

使用时ThreadLocal,您必须注意在不再使用时清除该值。一个好地方通常是一个finally子句,如:

try {
  variable1.set(...)
  pjp.proceed();
} finally {
  variable1.remove();
}
于 2013-06-26T07:38:05.493 回答