Spring下的@Order和@Primary与javax.annotation-api下@Priority【Spring4.1后】等方法控制多实现的依赖注入

@Order是控制配置类的加载顺序,还能控制List<XXX> 里面放的XXX的实现注入的顺序,下面介绍使用Spring下的@Order和@Primary与javax.annotation-api下@Priority【Spring4.1后,参考:https://jira.spring.io/browse/SPR-10548】控制多实现的依赖注入,因为在项目中可能会遇到接口多实现的问题,那么要具体注入那个接口的实现就需要我们来控制了,那么如何控制,请看下面的例子示例:

示例一:

public interface XStrategyService {
}

@Service
@Priority(1)
public class XStrategyServiceImpl01 implements XStrategyService {
}

@Service
@Priority(2)
public class XStrategyServiceImpl02 implements XStrategyService {
}

@Autowired
private XStrategyService xStrategyService;  // XStrategyServiceImpl01将被选择

示例二:

public interface XStrategyService {
}

@Service
@Primary
public class XStrategyServiceImpl01 implements XStrategyService {
}

@Service
public class XStrategyServiceImpl02 implements XStrategyService {
}

@Autowired
private XStrategyService xStrategyService;  // XStrategyServiceImpl01将被选择

示例三:

public interface XStrategyService {
}

@Service
@Order(1)
@Primary
public class XStrategyServiceImpl01 implements XStrategyService {
}

@Service
@Order(2)
public class XStrategyServiceImpl02 implements XStrategyService {
}

@Autowired
private XStrategyService xStrategyService;  // XStrategyServiceImpl01将被选择

注意,下面的是不能注入的,就是单独使用@Order(1), @Order(2) Order注解仅仅用于控制组件的加载顺序,不能控制注入优先级

public interface XStrategyService {
}

@Service
@Order(1)
public class XStrategyServiceImpl01 implements XStrategyService {
}

@Service
@Order(2)
public class XStrategyServiceImpl02 implements XStrategyService {
}

@Autowired
private XStrategyService xStrategyService;  // Error

 一些其他方法完成多实现的注入,使用@Qualifier限定符

public interface XStrategyService {
}

@Service
@Qualifier("defaultStrategyService")
public class XStrategyServiceImpl01 implements XStrategyService {
}

@Service
public class XStrategyServiceImpl02 implements XStrategyService {
}

@Autowired
@Qualifier("defaultStrategyService")
private XStrategyService xStrategyService;  // XStrategyServiceImpl01将被选择

使用@Resource,通过Bean的名称限定选择,和@Qualifier限定符类似

public interface XStrategyService {
}

@Service("xStrategyServiceImpl01")
public class XStrategyServiceImpl01 implements XStrategyService {
}

@Service("xStrategyServiceImpl02")
public class XStrategyServiceImpl02 implements XStrategyService {
}

@Resource(name = "xStrategyServiceImpl01")
private XStrategyService xStrategyService; // XStrategyServiceImpl01将被选择

特例:Spring4.0后的新特性,就是根据泛型类型可以自动选择注入 

public interface XStrategyService<T> {
}

@Service
public class XStrategyServiceImpl01 implements XStrategyService<XXX> {
}

@Service
public class XStrategyServiceImpl02 implements XStrategyService<YYY> {
}

@Autowired
private XStrategyService<XXX> xStrategyService; // XStrategyServiceImpl01将被选择

补充@Order结合@Bean的用法:

public interface XStrategyService {
}

@Service
public class XStrategyServiceImpl01 implements XStrategyService {
}

@Service
public class XStrategyServiceImpl02 implements XStrategyService {
}

@Bean
@Order(1)
XStrategyServiceImpl01 xStrategyServiceImpl01() {
	return new XStrategyServiceImpl01();
}
@Bean
@Order(2)
XStrategyServiceImpl02 xStrategyServiceImpl02() {
	return new XStrategyServiceImpl02();
}
@Autowired
private List<XStrategyService> xStrategyServices; // XStrategyServiceImpl01 first

********************************* 不积跬步无以至千里,不积小流无以成江海 ********************************* 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值