복붙노트

[SPRING] 봄 한정자 및 속성 자리 표시 자

SPRING

봄 한정자 및 속성 자리 표시 자

한정자에서 표현식으로 속성 자리 표시자를 사용할 수 있어야하는지 아는 사람 있습니까? 나는이 일을 할 수없는 것 같습니다.

나는 봄 3.0.4를 사용하고있다.

@Controller
public class MyController {
   @Autowired
   @Qualifier("${service.class}")
   Service service;
}

@Service
@Qualifier("ServiceA")
ServiceA implements Service {
   public void print() {
       System.out.println("printing ServiceA.print()");
   } 
}

@Service
@Qualifier("ServiceB")
ServiceB implements Service {
   public void print() {
      System.out.println("printing ServiceB.print()");
   } 
}

XML :

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="file:/etc/config.properties"/>
</bean>

config.properties:

config.properties
service.class=serviceB

해결법

  1. ==============================

    1.이 작동합니다. 기본 스프링 빈 이름을 사용한다면 서비스 이름을 생략 할 수 있습니다. serviceA 대 ServiceA 등

    이 작동합니다. 기본 스프링 빈 이름을 사용한다면 서비스 이름을 생략 할 수 있습니다. serviceA 대 ServiceA 등

    @Controller
    class MyController {
    @Autowired(required=false)
    @Qualifier("Service")
    Service service;
    
    public static void main(String[] args) {
       ApplicationContext context = new ClassPathXmlApplicationContext("app-ctx.xml", MyController.class);
       for(String s:context.getBeanDefinitionNames()){
           System.out.println(s);
           for(String t:context.getAliases(s)){
               System.out.println("\t" + t);
           }
       }
       context.getBean(MyController.class).service.print();
      }
    }
    
    public interface Service {
        void print();
    }
    
    @Service(value="ServiceA")
    public class ServiceA implements example.Service {
        public void print() {
            System.out.println("printing ServiceA.print()");
        } 
    }
    
    @Service(value="ServiceB")
    public class ServiceB implements example.Service {
        public void print() {
            System.out.println("printing ServiceB.print()");
        } 
    }
    

    XML :

    <beans>
        <alias name="${service.class}" alias="Service"/>
        <context:property-placeholder location="example/app.properties"/>
        <context:component-scan base-package="example"/>
    <beans>
    

    소품:

    service.class=ServiceB
    
  2. ==============================

    2.나는 그 대답이 '아니오'라고 추측하려고 노력할 것인데, 단지 몇 가지 javadoc 페이지에 글을 올리는 것에 기반하고있다. 예를 들어 @Value에 대한 문서를 참조하십시오.

    나는 그 대답이 '아니오'라고 추측하려고 노력할 것인데, 단지 몇 가지 javadoc 페이지에 글을 올리는 것에 기반하고있다. 예를 들어 @Value에 대한 문서를 참조하십시오.

    http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/beans/factory/annotation/Value.html

    그들은 주석에서 표현식을 사용하는 것에 대해 특별한 언급을합니다. 비교를 위해 @Qualifier에 대한 문서 :

    http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/beans/factory/annotation/Qualifier.html

    어떤 표현을 언급하지 않습니다. 명백히 확실한 대답은 아닙니다 (그러나 스프링은 일반적으로 문서화에 매우 유용합니다). 또한 @Qualifier 주석에서 표현식이 지원된다면 @Value 주석과 동일한 방식으로 작동 할 것으로 기대할 수 있습니다 (스프링이 매우 일관된 프레임 워크에 기반 함).

    Spring 3.1은 당신이하려고하는 것과 같은 것을 성취 할 수있는 것처럼 보이는 새로운 프로파일 빈 기능을 가지고있다. 여기 그것에 대한 글이 있습니다.

    http://blog.springsource.com/2011/02/14/spring-3-1-m1-introducing-profile/

  3. ==============================

    3.이 솔루션은 XML 및 속성 파일없이 작동합니다.

    이 솔루션은 XML 및 속성 파일없이 작동합니다.

    너의 수업 개선 :

    MyController.java:

    @Controller
    public class MyController {
        @Autowired
        public MyController(@Qualifier("MyServiceAlias") MyService myService) {
            myService.print();
        }
    }
    

    ServiceA.java:

    @Service("serviceA")
    public class ServiceA implements MyService {
        @Override
        public void print() {
            System.out.println("printing ServiceA.print()");
        }
    }
    

    ServiceB.java:

    @Service("serviceB")
    public class ServiceB implements MyService {
        @Override
        public void print() {
            System.out.println("printing ServiceB.print()");
        }
    }
    

    application.properties (여기서로드 할 클래스를 변경할 수 있습니다) :

    service.class=serviceA
    

    중요한 구성 파일 AppConfig.java :

    @Configuration
    public class AppConfig {
    
        @Autowired
        private ApplicationContext context;
    
        @Bean
        public MyService MyServiceAlias(@Value("${service.class}") String qualifier) {
            return (MyService) context.getBean(qualifier);
        }
    }
    

    추가 설명 :

  4. ==============================

    4.어쩌면 이것에 소용돌이 치는 소리를 내십시오.

    어쩌면 이것에 소용돌이 치는 소리를 내십시오.

    @Controller
    public class MyController {
    
       private String serviceId;
    
       @Value("${serviceId}")
       public void setServiceId(String serviceId) {
          this.serviceId = serviceId;
       }
    
       @Autowired
       @Qualifier(serviceId)
       Service service;
    }
    
  5. from https://stackoverflow.com/questions/7812745/spring-qualifier-and-property-placeholder by cc-by-sa and MIT license