XML 없이 스프링이 있는 속성을 기반으로 런타임에 다른 서비스를 주입하는 방법
Java 스탠드아론 어플리케이션용 Spring Boot을 사용하고 있습니다.나는 서비스를 이용할 수 있는 콩을 가지고 있다.Spring을 사용하여 속성 파일의 속성을 기반으로 런타임에 해당 서비스의 다른 구현을 삽입하고 싶습니다(그건 4개).
이것은 공장 패턴처럼 들리지만, 스프링에서는 이와 같이 주석을 사용하여 문제를 해결할 수도 있습니다.
@Autowired @Qualifier("selectorProperty") private MyService myService;
그런 다음 beans.xml 파일에는 @Qualifier 속성을 사용할 수 있는 에일리어스가 있습니다.
<alias name="${selector.property}" alias="selectorProperty" />
또, 실장 마다, 다른 자격 조건을 갖게 됩니다.
@Component("Selector1")
public class MyServiceImpl1
@Component("Selector2")
public class MyServiceImpl2
application.properties
selector.property = Selector1
selector.property = Selector2
공장 패턴과 관련하여 봄에는 Service Locator Factory Bean을 사용하여 동일한 기능을 제공하는 공장을 만들 수 있습니다.
<bean
class="org.springframework.beans.factory.config.ServiceLocatorFactoryBean"
id="myServiceFactory">
<property
name="serviceLocatorInterface"
value="my.company.MyServiceFactory">
</property>
</bean>
public interface MyServiceFactory
{
MyService getMyService(String selector);
}
그리고 이러한 기능을 사용하여 속성 값에 따라 런타임에 올바르게 구현할 수 있습니다.
@Value("${selector.property}") private String selectorProperty;
@Autowired private MyServiceFactory myServiceFactory;
private MyService myService;
@PostConstruct
public void postConstruct()
{
this.myService = myServiceFactory.getMyService(selectorProperty);
}
그러나 이 솔루션의 문제는 XML을 사용하여 공장을 정의하는 것을 피할 수 없다는 것이며 주석만 사용하고 싶습니다.
질문은 주석만 사용하여 ServiceLocatorFactoryBean(또는 이와 동등한 것)을 사용하는 방법이 있는지, 아니면 XML에서 콩을 정의하지 않으려면 @Autowired @Qualifier 방법을 사용해야 하는지, 아니면 Spring 4를 사용하여 XML을 사용하지 않는 속성을 기반으로 런타임에 다른 서비스를 주입하는 다른 방법이 있는지 여부입니다.그냥 사용하시는 겁니다.@Autowired @Qualifier
에일리어스와 함께 그것이 잘 알려진 공장 패턴을 사용하는 것보다 좋은 이유를 알려주세요.
추가 XML 사용으로 인해 다음 명령을 사용할 수밖에 없습니다.@ImportResource("classpath:beans.xml")
내 런처 클래스에서도 사용하지 않는 것이 좋습니다.
감사해요.
실제로 Service Locator Factory를 설정 파일에서 빈으로 선언하면 XML 없이 사용할 수 있습니다.
@Bean
public ServiceLocatorFactoryBean myFactoryServiceLocatorFactoryBean()
{
ServiceLocatorFactoryBean bean = new ServiceLocatorFactoryBean();
bean.setServiceLocatorInterface(MyServiceFactory.class);
return bean;
}
@Bean
public MyServiceFactory myServiceFactory()
{
return (MyServiceFactory) myFactoryServiceLocatorFactoryBean().getObject();
}
그런 다음 공장 출하시를 정상적으로 사용할 수 있지만 XML은 관여하지 않습니다.
@Value("${selector.property}") private String selectorProperty;
@Autowired @Qualifier("myServiceFactory") private MyServiceFactory myServiceFactory;
private MyService myService;
@PostConstruct
public void postConstruct()
{
this.myService = myServiceFactory.getMyService(selectorProperty);
}
스프링 프로필을 사용하고 있습니다.
예를 들어 dataSources Using it 에서는 원하는 개수의 dataSources를 정의할 수 있습니다.
@Configuration
@Profile("dev")
public class StandaloneDataConfig {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.addScript("classpath:com/bank/config/sql/schema.sql")
.addScript("classpath:com/bank/config/sql/test-data.sql")
.build();
}
}
@Configuration
@Profile("cloud")
public class CloudDataConfig {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.addScript("classpath:com/bank/config/sql/schema.sql")
.addScript("classpath:com/bank/config/sql/test-data.sql")
.build();
}
}
또한 런타임에 다음을 지정함으로써
-Dspring.profiles.active="myProfile"
하나 또는 다른 구성을 활성화해야 합니다(모든 구성을 기본 구성으로 Import해야 합니다. 활성 프로파일에 따라 무시됩니다).
여기 좋은 기사가 있습니다.http://spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profile/
언급URL : https://stackoverflow.com/questions/26463393/how-to-inject-different-services-at-runtime-based-on-a-property-with-spring-with
'programing' 카테고리의 다른 글
애플리케이션 컨텍스트에서 일부 콩의 의존성이 사이클을 형성합니다. (0) | 2023.03.02 |
---|---|
jQuery Ajax가 404 오류를 반환하지만 올바른 응답입니다. (0) | 2023.03.02 |
Jersey JSON POJO 지원 사용방법 (0) | 2023.03.02 |
Windows 서비스로 MongoDB를 실행하려면 어떻게 해야 하나요? (0) | 2023.03.02 |
Word후크/필터를 눌러 게시물 내부의 링크를 처리합니다. (0) | 2023.03.02 |