一、出现问题的原因
当方法被代理时,其实生成了一个代理对象,代理对象去执行invoke方法,在调用被代理对象的方法来执行业务。
当在被代理对象中调用其他的方法时,其实没有用代理调用,执行invoke方法,而是被代理本身进行调用。
综上所述:在代理对象中调用其他方法,是不会被代理的。
public interface UserService {
void list();
}
public class UserServiceImpl implements UserService {
@Override
public void list() {
custom();
}
@Log
public void custom(){
System.out.println("查询用户数据!!!");
}
}
二、解决方案
通过实现ApplicationContext获取代理对象。
注意:如果使用的是若依框架,框架中会存在一个SpringUtils
的类,建议不要动它,可以在它下面新建一个类。
@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);
}
修改上面的代码,完美解决
public interface UserService {
void list();
}
public class UserServiceImpl implements UserService {
@Override
public void list() {
SpringUtil.getBean(this.getClass()).custom();
}
@Log
public void custom(){
System.out.println("查询用户数据!!!");
}
}