第二十章 AOP开发中的坑
-
问题
//在同一个业务类中,一个业务方法调用另一个业务方法 //问题: login方法添加有额外功能 // register方法没有添加额外功能 public class UserServiceImpl implements UserService { @Override public void login(String username, String password) { System.out.println("UserServiceImpl.login"); this.register(new User()); } @Override public void register(User user) { System.out.println("UserServiceImpl.register"); } }
-
分析
调用login方法的,是代理对象,而调用register方法的,是原始对象,所以没有加上额外功能 能不能在login方法中再获取一个代理对象,从而使代理对象调用register方法呢? 不能,我们知道Spring工厂是一个重量级资源,一个应用应当创建一个Spring工厂
-
解决
使业务类再实现ApplicationContextAware接口 实现接口的setApplicationContext方法,这个方法的作用是获取创建的Spring工厂对象
-
编码
public class UserServiceImpl implements UserService, ApplicationContextAware { private ApplicationContext context; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.context = applicationContext; } @Override public void login(String username, String password) { System.out.println("UserServiceImpl.login"); UserService userService = (UserService) context.getBean("userService"); userService.register(new User()); } @Override public void register(User user) { System.out.println("UserServiceImpl.register"); } }