2013-07-31 53 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编织来实现它。 –