• java接口多实现注入方法总结


    1. 单实现接口注入方法

    1.1 构造注入(推荐)

    @RequiredArgsConstructor
    public class TestController {
    
        // 其只有一个具体的实现类
        private final DemoService demoService;
    }
    

    1.2 全参构造注入

    @AllArgsConstructor
    public class TestController {
    
        DemoService demoService;
    }
    

    注: 当需要注入的全部是service时候, 这两种没有区别, 但是如果要使用@Value等其他注解时, 全参注入会报null. (@Value只是举例, @Value可以使用hutool中的SpringUtil方法代替)

    1.3 @Autowired(Spring提供) 与 @Resource(J2EE提供)直接用即可

    2. 多实现接口注入方法

    public interface BaseService {
    
        /**
         * 创建对象
         *
         * @param obj 对象
         * @return 成功返回id
         */
        public int crate(String obj);
    }
    
    import org.springframework.stereotype.Service;
    @Service("baseStudent")
    public class BaseStudentServiceImpl implements BaseService {
    
        @Override
        public int crate() {
            System.err.println("添加学生");
            return 1;
        }
    }
    
    import org.springframework.stereotype.Service;
    @Service("baseTeacher")
    public class BaseTeacherServiceImpl implements BaseService {
    
        @Override
        public int crate() {
            System.err.println("添加老师");
            return 2;
        }
    }
    

    2.1 错误尝试

    如果还使用以上任意一种方法进行注入的话, 都会报found 2 异常, 具体描述可能不同.

    2.2 @Service上添加各自的名称,

    注入时候使用@Qualifier("baseStudent")进行指定.

    public class TestController {
    
        @Autowired
        @Qualifier("baseStudent")
        private BaseService baseService;
    }
    

    2.3 使用@Resource指定.

    public class TestController {
    
        @Resource(name = "baseStudent")
        private BaseService baseService;
    }
    

    2.4 尝试参数注入方法

    • @Setter(onMethod_ = {@Qualifier("")}, onParam = @__(@Qualifier("")))

    • @RequiredArgsConstructor(onConstructor_ = {@Qualifier("")})

    都没有成功, 可能是方向错了.

    2.5 变量名指定

    @RequiredArgsConstructor
    public class TestController {
    
        // 与1.1和1.2用法相同, 变量名为Service的名字
        private final BaseService baseStudent;
    }
    

    2.6 使用@Primary在实现类上指定

    // 当其他位置不指定不生效时候默认这个(优先级最低,除了2.5)
    @Primary
    @Service("baseTeacher")
    public class BaseTeacherServiceImpl implements BaseService {
    
        @Override
        public int crate() {
            System.err.println("添加老师");
            return 2;
        }
    }
    

    3. 微服务下的注册与使用

    3.1 注册时添加分组名称

    public interface BaseService {
    
        /**
         * 创建对象
         *
         * @param obj 对象
         * @return 成功返回id
         */
        public int crate(String obj);
    }
    
    import com.alibaba.dubbo.config.annotation.Service;;
    @Service(group = "baseStudent")
    public class BaseStudentServiceImpl implements BaseService {
    
        @Override
        public int crate() {
            System.err.println("添加学生");
            return 1;
        }
    }
    
    import com.alibaba.dubbo.config.annotation.Service;e;
    @Service(group = "baseTeacher")
    public class BaseTeacherServiceImpl implements BaseService {
    
        @Override
        public int crate() {
            System.err.println("添加老师");
            return 2;
        }
    }
    

    3.2 使用时使用分组名称进行指定

    import com.alibaba.dubbo.config.annotation.Reference;
    public class TestController {
    
        @Reference(group = "baseStudent")
        private BaseService baseService;
    }
    

    2.几中的方法并非尝试

    4. 参考

    注: 第二个是第一个翻译

  • 相关阅读:
    教会他人,让其成为你的接棒人
    2015年看的52部电影计划
    我的2015年读书计划,每两周读完一本书!
    拯救你的电脑之文件命名规范与目录规划
    出租WiFi到底靠不靠谱?
    使用观察者模式更新Fragment的内容
    android静默安装和智能安装(转)
    Android拨打电话不弹出系统拨号界面总结
    Android通过AIDL和反射调用系统拨打电话和挂断电话
    Android设为系统默认的短信应用
  • 原文地址:https://www.cnblogs.com/Ddlm2wxm/p/16308464.html
Copyright © 2020-2023  润新知