0

// 我的工厂类

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

// 我的验证器类

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

我的包裹扫描级别要高得多。发生的事情是我的virginAmericaValidator 总是空的。为什么@Autowired 注释不起作用。

4

1 回答 1

5

您当前的方法不适用于 Spring,因为您最终new UserRewardAccountValidatorFactory用于创建基本上完全绕过 Spring 上下文的实例。两种可能可行的方法是:

一个。使用 afactory-method和使用 xml 来定义你的 bean:

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

这实际上将返回您正在创建的实例作为 Spring bean,并且应该干净地自动装配。

湾。使用基于 Java@Configuration的机制:

@Configuration
public class MyBeanConfiguration {
   @Bean 
   public UserRewardAccountValidatorFactory myFactory() {
       return UserRewardAccountValidatorFactory.getInstance();
   }
}
于 2013-07-31T01:14:17.447 回答