Loading

第二十章 AOP开发中的坑

  1. 问题

    //在同一个业务类中,一个业务方法调用另一个业务方法
    //问题: 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");
        }
    }
    
  2. 分析

    调用login方法的,是代理对象,而调用register方法的,是原始对象,所以没有加上额外功能
    
    能不能在login方法中再获取一个代理对象,从而使代理对象调用register方法呢?
    
    不能,我们知道Spring工厂是一个重量级资源,一个应用应当创建一个Spring工厂
    
  3. 解决

    使业务类再实现ApplicationContextAware接口
    实现接口的setApplicationContext方法,这个方法的作用是获取创建的Spring工厂对象
    
  4. 编码

    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");
        }
    }
    
posted @ 2022-07-24 17:22  苏无及  阅读(21)  评论(0编辑  收藏  举报