2013-07-31 76 views
0

//我的工廠類春@Autowired註釋對象值爲null

@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; 
    } 
} 

//我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(); 
     } 
    } 
} 

//用法:

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()); 
     } 
    } 

我的包掃描級別是在更高的水平。發生什麼事是我的維珍美國驗證員總是空着的。爲什麼@Autowired註釋不起作用。

回答

5

由於您最終使用new UserRewardAccountValidatorFactory來創建基本上繞過Spring上下文的實例,因此您當前的方法不適用於Spring。應該可能有兩種方法可行:

a。使用factory-method,並使用XML來定義你的bean:

<bean class="package.UserRewardAccountValidatorFactory" name="myfactory" factory-method="getInstance"/> 

這將從根本上返回您正在創建回爲一個Spring bean,並應得到乾淨自動裝配實例。

b。使用基於Java @Configuration機制:

@Configuration 
public class MyBeanConfiguration { 
    @Bean 
    public UserRewardAccountValidatorFactory myFactory() { 
     return UserRewardAccountValidatorFactory.getInstance(); 
    } 
} 
+0

或c)使用@Configurable和AspectJ,那麼Spring即使在由'new'創建的實例注入(我提到這一點,只爲完成,並且因爲反對這一傳聞打擊這種Spring不能注入由'new'生成的類 - 因爲它是錯誤的) – Ralph

+0

如果我讓VirginAmericaValidator從另一個抽象類擴展並在那裏實現接口,是否會爲我製作spring autowire? – riship89

+0

不,這也不會工作,因爲問題仍然以創建UserRewardAccountValidatorFactory的方式進行,而不是在驗證程序中。您應該能夠使用我提到的兩個選項之一來工作。拉爾夫提到的方法也很棒,但它需要完整的AspectJ編織來實現它。 –