方案一:直接获取bean
java
@Service
public class ClassA extends BaseClass{
@Transactional(propagation = Propagation.REQUIRES_NEW) @Override
public void methodA(){
}
/**
* 这里调用methodA() 的事务将会失效
*/
public void methodB(){
//使用getBean
((BaseClass)SpringUtil.getBean("classA")).methodA();
}
}方案二:使用cglib代理
第一步:
SpringBoot:注解开启cglib代理,开启 exposeProxy = true,暴露代理对象 (否则AopContext.currentProxy()) 会抛出异常
java
@EnableAspectJAutoProxy(exposeProxy = true)
public class Application{
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}xml模式
xml
<aop:aspectj-autoproxy expose-proxy="true"/>第二步:
(需要保证Spring对这个bean创建了代理对象,基本上涉及到Aop的方法的类,都会创建代理对象) 可以用以下代码判断
java
@Service("classImplProxy")
@Scope(proxyMode = ScopedProxyMode.INTERFACES)
public class ClassImplProxy implements IClass {
@Override
@Transactional
public void sysout() {
}
//是否代理对象
@Override
public boolean isAopProxy() {
return AopUtils.isAopProxy(AopContext.currentProxy());
}
//是否cglib 代理对象
@Override
public boolean isCglibProxy() {
return AopUtils.isCglibProxy(AopContext.currentProxy());
}
//是否jdk动态代理
@Override
public boolean isJdkDynamicProxy() {
return AopUtils.isJdkDynamicProxy(AopContext.currentProxy());
}
}java
@Service
public class ClassA{
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodA(){
}
public void methodB(){
//手动获取此对象Spring的代理类
((ClassA)AopContext.currentProxy()).methodA();
}
}方案三:
直接在当前类@Autowire 或者@Resource 注入自己,然后用注入的bean 调用方法