(春季版是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?)。这不是唯一关注的类组。
从一对夫妇到另一对夫妇的档案不应该相同。 那么,我必须为每组课程设置一个配置文件?
答案 0 :(得分:1)
我认为Spring配置文件正是您所寻找的。 p>
它们允许您根据参数(活动配置文件)动态选择特定的bean实现。
有关详细信息,请查看here if you are using boot或here 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();