第二十章 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");
        }
    }
    

作者:苏无及

出处:https://www.cnblogs.com/suwuji/p/16514906.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   苏无及  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示