博主的问题是 用this无法生效切面
public class ServiceImpl implements Service {
@Override
public T getAssetDetail() {
xxxxxx;
}
@Override
@TranslateRemoteField
public T selectConcreteRecordDetail(Long id) {
//正确写法
Service serviceTemp=ApplicationContextUtil.getBean(Service.class);
return serviceTemp.getAssetDetail(-1L, id, null, null);
//错误写法
return this.getAssetDetail(-1L, id, null, null);
}
ApplicationContextUtil
@Component
public class ApplicationContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
/**
* 获取applicationContext
* @return
*
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 通过name获取 Bean.
*
*/
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
/**
* 通过class获取Bean
* @param clazz
* @param <T>
* @return
*
*/
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
}
原理
真正使切面生效的就是:Service serviceTemp=ApplicationContextUtil.getBean(Service.class); 这一行代码。向spring容器拿的实例,实际上是代理类servciceProxy。调用代理类的getAssetDetail方法就会去先执行aop中前置切面代码,再会调用真正service实例的getAssetDetail方法。最终,aop才有效果了。需要理解基于动态代理的aop原理
博主公众号
求关注