@Order can act class, method, properties. The impact load order. If left, spring loading sequence is random.
@Primary When injected into the bean conflict, in order to define @Primary prevail.
@Order control configuration class load order, but also the control List <XXX> XXX realized which put the injected sequence, are described below under @Order @Priority [Spring4 javax.annotation-api and @Primary with the use of Spring. 1, the reference: https:] control to achieve more than //jira.spring.io/browse/SPR-10548 dependency injection, you may experience problems because of the interface implemented in a multi-project, then injected to achieve that specific interface we need to control, and then how to control, consider the following example illustrates:
Example 1:
public interface XStrategyService { } @Service @Priority(1) public class XStrategyServiceImpl01 implements XStrategyService { } @Service @Priority(2) public class XStrategyServiceImpl02 implements XStrategyService { } @Autowired private XStrategyService xStrategyService; // XStrategyServiceImpl01将被选择
Example Two:
public interface XStrategyService { } @Service @Primary public class XStrategyServiceImpl01 implements XStrategyService { } @Service public class XStrategyServiceImpl02 implements XStrategyService { } @Autowired private XStrategyService xStrategyService; // XStrategyServiceImpl01将被选择
Example Three:
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将被选择
Note that the following is not injected, it is used alone @Order (1), @Order (2) Order annotation sequence control for loading only the components can not be controlled injection priority
public interface XStrategyService { } @Service @Order(1) public class XStrategyServiceImpl01 implements XStrategyService { } @Service @Order(2) public class XStrategyServiceImpl02 implements XStrategyService { } @Autowired private XStrategyService xStrategyService; // Error
Some other methods to achieve complete multi-injection, the use of @Qualifier 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将被选择
Use @Resource, defined by selecting the name of the Bean, and the like @Qualifier 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将被选择
Exception: new features after Spring4.0, is based on a generic type can be automatically selected injection
public interface XStrategyService<T> { } @Service public class XStrategyServiceImpl01 implements XStrategyService<XXX> { } @Service public class XStrategyServiceImpl02 implements XStrategyService<YYY> { } @Autowired private XStrategyService<XXX> xStrategyService; // XStrategyServiceImpl01将被选择
Supplementary @Order combined @Bean usage:
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
Original link: https: //blog.csdn.net/weixin_42465125/article/details/88574670