Spring Qualifier,应用程序启动时的服务实现

时间:2015-06-08 15:28:06

标签: java spring

(春季版是4.1.6) 我有一个服务接口“ ContractService ”,它可以检索一个人的合同。 2个服务类 ContratServiceImpl & ContratServiceImplWeb 实现此接口。 ContratServiceImpl 调用dao来检索数据 ContratServiceImplWeb 调用Web服务...

接口 ContractService 由另一个服务(UTService)使用:

 @org.springframework.stereotype.Service
    @Transactional(value="transactionManager")
    public class UTServiceImpl implements UTService {

        @Autowired @Qualifier(...<variable.propeties>...)
        private ContractService contractService;
   ...
}

以下是实现可以在

中的界面的服务
@Service("ContratServiceImplWeb") @Transactional(value="transactionManager")
class ContratServiceImplWeb implements ContratService {
...
}

@Service("ContratServiceImpl") @Transactional(value="transactionManager")
class ContratServiceImpl implements ContratService {
...
}

Configuration class
@Configuration
@EnableTransactionManagement
@ImportResource(value={ "classpath:sessionFactory-datasource-spring.xml", "classpath:contrat_factories.xml"} )
@ComponentScan(basePackages = { "com.xxx.core.service.impl"
                              , "com.xxx.core.dao.impl"}
)
public class ContextCoreServiceConfiguration {

}

当我的应用程序启动时,我希望使用ContratServiceImpl或ContratServiceImplWeb“合格”ContractService,具体取决于设置bean名称的外部配置文件(.properties或XML)。

我该怎么做?

-----最后的评论------- contractServiceImpl&amp; contractServiceImplWeb设置为@service并按配置扫描。

在“UTServiceImple”类中,2个类中的1个需要使用区分参数@autowired(可能是Profile?)。这不是唯一关注的类组。

从一对夫妇到另一对夫妇的档案不应该相同。 那么,我必须为每组课程设置一个配置文件?

3 个答案:

答案 0 :(得分:1)

我认为Spring配置文件正是您所寻找的。

它们允许您根据参数(活动配置文件)动态选择特定的bean实现。

有关详细信息,请查看here if you are using boothere if using raw spring

答案 1 :(得分:0)

你很亲密。您希望ContractService声明看起来更像这样:

@Autowired
private @Qualifier("contractServiceImpl") ContractService contractServive;

这当然假定您的ContractServiceImpl bean已正确配置和创建,可以手动配置,也可以使用课程中的@Service@Component注释进行配置。

答案 2 :(得分:0)

我发布了解决方案。我使用了@Profiles。它真的满足了我的需求。 谢谢你给了我这个信息。

@org.springframework.stereotype.Service
@Transactional(value="transactionManager")
public class UTServiceImpl implements UTService {

    private static final Logger logger = Logger.getLogger(UTServiceImpl.class);

    // SERVICES
    @Autowired
    private VerificationHabilitationService verificationHabilitationService;

    @Autowired
    private ContratService contratService;
...
}

主服务中引用的接口

public interface ContratService {

    Set rechercheIdentifiantAdherent(String numeroImmatriculation);
...
}

数据库服务

@Service("ContratServiceDb") @Transactional(value="transactionManager") @Profile("contratServiceDb")
class ContratServiceImplDb implements ContratService {

    private Logger logger = null;

    @Autowired
    private ContratFactory contratFactory;
...
}

网络服务

@Service("ContratServiceWeb") @Transactional(value="transactionManager") @Profile("contratServiceWeb")
class ContratServiceImplWeb implements ContratService {

    private Logger logger = Logger.getLogger(ContratServiceImplWeb.class);

    @Autowired
    private ContratFactory contratFactory;
...
}

配置

@Configuration
@EnableTransactionManagement
@ImportResource(value={ "classpath:sessionFactory-datasource-spring.xml", "classpath:contrat_factories.xml"} )
@ComponentScan(basePackages = { "com.xxx.core.service.impl"
                              , "com.xxx.core.dao.impl"}
)
public class ContextCoreServiceConfiguration {

}

对于每个实现classe,我定义了一个Pofile:contratServiceDb,contratServiceWeb。初始化上下文时,我设置了活动配置文件(使用外部属性文件)。然后,自动装配匹配配置文件的服务。见下文:

String configCoreClass = servlet.getInitParameter("contextCoreConfigurationClass");
            String[] profiles = { PropertiesHelper.getProperty(PropertiesHelper.PROPERTY_SERVICE_CONTRAT)
                                 ,PropertiesHelper.getProperty(PropertiesHelper.PROPERTY_SERVICE_ADHERENT) 
            };
            AnnotationContextCoreLocator.getInstance().getEnvironment().setActiveProfiles(profiles);
            AnnotationContextCoreLocator.getInstance().register( Class.forName(configCoreClass) );
            AnnotationContextCoreLocator.getInstance().refresh();