ris*_*p89 0 spring annotations autowired
//我的工厂课
@Component
public class UserRewardAccountValidatorFactory {
@Autowired
private VirginAmericaValidator virginAmericaValidator;
private static class SingletonHolder {
static UserRewardAccountValidatorFactory instance = new UserRewardAccountValidatorFactory();
}
public static UserRewardAccountValidatorFactory getInstance() {
return SingletonHolder.instance;
}
private UserRewardAccountValidatorFactory() {}
public PartnerValidator getPartnerValidator(Partner partner){
return virginAmericaValidator;
}
}
Run Code Online (Sandbox Code Playgroud)
//我的Validator类
@Service
public class VirginAmericaValidator implements PartnerValidator {
@Override
public void validate(String code) throws InvalidCodeException{
//do some processing if processing fails throw exception
if (code.equals("bad".toString())){
throw new InvalidCodeException();
}
}
}
Run Code Online (Sandbox Code Playgroud)
//用法:
PartnerValidator pv = UserRewardAccountValidatorFactory.getInstance().getPartnerValidator(partner);
if (pv != null){
try {
pv.validate(userRewardAccount);
} catch (InvalidCodeException e){
return buildResponse(ResponseStatus.INVALID_USER_REWARD_ACCOUNT, e.getMessage());
}
}
Run Code Online (Sandbox Code Playgroud)
我的包扫描级别更高.发生的事情是我的virginAmericaValidator总是空的.为什么@Autowired注释不起作用.
您当前的方法不适用于Spring,因为您最终new UserRewardAccountValidatorFactory用于创建实际上完全绕过Spring上下文的实例.应该可行的两种方法是:
一个.使用factory-method和使用xml来定义bean:
<bean class="package.UserRewardAccountValidatorFactory" name="myfactory" factory-method="getInstance"/>
Run Code Online (Sandbox Code Playgroud)
这将基本上返回您作为Spring bean创建的实例,并且应该干净地自动装配.
湾 使用@Configuration基于Java 的机制:
@Configuration
public class MyBeanConfiguration {
@Bean
public UserRewardAccountValidatorFactory myFactory() {
return UserRewardAccountValidatorFactory.getInstance();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1546 次 |
| 最近记录: |