@Order and @Primary of the Spring and the @Priority javax.annotation-api [] or the like after Spring4.1 multiple injection control relies implemented (rpm)

@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

 

Guess you like

Origin www.cnblogs.com/muxi0407/p/11764162.html