问题描述
写了个自定义注解,但是该注解只会出现在serviece层中的方法中。启动发现aop未拦截到
问题原因:
调用service中的xx()方法时,Spring的动态代理帮我们动态生成了一个代理的对象,暂且叫他$XxxxService。所以调用xx()方法实际上是代理对象$XxxxService调用的。但是在xx()方法内调用同一个类的另外一个注解方法子方法时,实际上是通过this.子方法()执行的, this 指的是XxxxService对象,并不是$XxxxService代理对象调用的,没有走代理。所以注解失效
解决:
通过实现ApplicationContext获取代理对象。新建获取代理对象的工具类SpringUtil
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
{
if (SpringUtil.applicationContext == null)
{
SpringUtil.applicationContext = applicationContext;
}
}
//获取applicationContext
public static ApplicationContext getApplicationContext()
{
return applicationContext;
}
//通过name获取 Bean.
public static Object getBean(String name)
{
return getApplicationContext().getBean(name);
}
//通过class获取Bean.
public static <T> T getBean(Class<T> clazz)
{
return getApplicationContext().getBean(clazz);
}
//通过name,以及Clazz返回指定的Bean
public static <T> T getBean(String name, Class<T> clazz)
{
return getApplicationContext().getBean(name, clazz);
}
}
调用:
@Service
public class XxxxServiceImpl implements IXxxService {
@Override
public void 方法1() {
List<XxxData> xxxDataList = xxMapper.selectList();
for(int i = 0; i< xxxDataList.size();i++){
SpringUtil.getBean(this.getClass()).方法2(xxxDataList.get(i));
}
}
@自定义注解
public void 方法2(XxxData xxxData){
//.....具体业务
}
}
标签:applicationContext,springboot,service,ApplicationContext,getBean,name,static,pub
From: https://blog.51cto.com/u_13002884/6506398