복붙노트

[SPRING] Spring Util : 빈에 대한 주석을 통한 속성 주입

SPRING

Spring Util : 빈에 대한 주석을 통한 속성 주입

스프링 XML에 2 개의 .properties 파일 설정이있는 경우

<util:properties id="serverProperties" location="file:./applications/MyApplication/server.properties"/>
<util:properties id="someConfig" location="file:./applications/MyApplication/config.properties"/>

주석을 통해 java.util.Properties가있는 빈에 이러한 등록 정보 파일을 어떻게 삽입 할 수 있습니까?

Spring 어노테이션을 통해 특정 속성을 잡는 방법은 무엇입니까?

건배!

해결법

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

    1.

    @Autowired
    @Qualifier("serverProperties")
    private Properties serverProperties;
    @Autowired
    @Qualifier("someConfig")
    private Properties otherProperties;
    

    또는

    @Resource(name = "serverProperties")
    private Properties serverProperties;
    @Resource(name = "someConfig")
    private Properties otherProperties;
    

    일반적으로 @Autowired는 Spring의 by-type autowiring에 사용되고 @Resource는 by-name에 사용됩니다. @ Autowired + @ Qualifier는 by-name autowiring의 두 배가 될 수 있지만 실제로는 형식을 세밀하게 조정할 수있는 by-type autowiring을 의미합니다.

  2. ==============================

    2.이 질문에는 많은 히트가 있습니다. SpEL (Spring Expression Language)을 사용하는 다른 옵션을 지적하는 것이 가치가 있다고 생각했습니다. 특정 속성이 필요하면 특정 Bean 속성에 @Value 주석을 사용하여 삽입 할 수 있습니다.

    이 질문에는 많은 히트가 있습니다. SpEL (Spring Expression Language)을 사용하는 다른 옵션을 지적하는 것이 가치가 있다고 생각했습니다. 특정 속성이 필요하면 특정 Bean 속성에 @Value 주석을 사용하여 삽입 할 수 있습니다.

    class SomeClass {
       @Value("#{serverProperties['com.svr.prop']}")
       private String aServerCfgProperty;
    
       @Value("#{someConfig['another.config.setting']}")
       private String someOtherProperty;
    }
    

    인덱스 구문 [ 'index.val']을 사용할 필요가 없습니다. 직접 가져올 수 있습니다.

    @Value("#{someConfig}")
    private Properties someConfig
    
    @Value("#{serverProperties}")
    private Properties svrProps;
    

    이 방법이 유용하다는 것을 알았고 @ Resource / @ Autowired를 통해 직접 주입 된 속성 개체를 사용하지 못하게되었습니다.

    인덱싱 된 Properties 개체와 함께 @Value를 사용하는 또 다른 좋은 이유는 프로젝트에 .properties 파일이 있으면 일부 IDE (예 : IntelliJ)가 실제 속성 이름을 리팩터링 할 수 있다는 것입니다. 또 다른 팁은 Spring의 PropertiesPlaceholderConfigurer 클래스를 사용하지 않고 속성 파일에 포함 / 중첩 / 대체를 원할 경우 EProperties (기본 Java Properties 객체를 확장)와 같은 것을 사용하는 것입니다 (슬프게도 속성을 공개하지 않음 - SpEL 인덱싱 [ 'key '] bean은 Map <> 즉 Java Properties 객체가하는 확장 맵의 인스턴스 여야합니다.) ...

    마지막으로, SpEL의 또 다른 멋진 기능은 콩의 속성에 직접 액세스 할 수 있다는 것입니다. 예를 들어 위의 예제에서 SomeClass가 Spring bean 인 경우를 예로 들어 보겠습니다. someClass 다음에 AnotherBeanClass에있을 수 있습니다.

    @Value("#{someClass.someOtherProperty}")
    private String injectedBeanProp
    

    getter 메소드를 호출 할 수도 있습니다.

    @Value("#{someClass.getSomeOtherProperty()}")
    private String injectedBeanProp
    

    여기 SpEL 가이드를 참조하십시오. http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#expressions

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

    3.@PropertySource를 사용할 수 있습니다.

    @PropertySource를 사용할 수 있습니다.

    @Configuration
    @PropertySource(name = "someName", value = {"classpath:a.properties", "classpath:b.properties"})
    public class MyConfiguration {
    }
    
  4. ==============================

    4.XMl 파일

    XMl 파일

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:mvc="http://www.springframework.org/schema/mvc"
     xmlns:util="http://www.springframework.org/schema/util"
     xsi:schemaLocation="
     http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context-4.0.xsd
     http://www.springframework.org/schema/mvc
     http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
     http://www.springframework.org/schema/util 
     http://www.springframework.org/schema/util/spring-util-4.0.xsd">
        <context:component-scan base-package="com.sha.home" />
        <mvc:annotation-driven/>
        <util:properties id="dbProp" location="classpath:db.properties" />
        <!-- <context:property-placeholder location="classpath:db.properties"/> -->
    
    </beans>
    

    자바 파일에서 @Value ( "# {dbProp}")     개인 속성 dbProperties;

    System.out.println ( "urllll"+ dbProperties.getProperty ( "jdbc.url"));

  5. ==============================

    5.대부분의 경우 모든 속성을 하나의 유틸리티로 캡슐화하고 내 응용 프로그램에서 사용했습니다. 그렇게하면 앱 계층의 각 속성 파일을 걱정하거나 관리 할 필요가 없습니다. Autowired setProps (...)는로드 된 모든 util : properties를 소품리스트에 읽습니다.

    대부분의 경우 모든 속성을 하나의 유틸리티로 캡슐화하고 내 응용 프로그램에서 사용했습니다. 그렇게하면 앱 계층의 각 속성 파일을 걱정하거나 관리 할 필요가 없습니다. Autowired setProps (...)는로드 된 모든 util : properties를 소품리스트에 읽습니다.

    import java.util.List;
    import java.util.Properties;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    @Component
    public class AppProperiesProcessor {
    
    private List<Properties> props;
    private Properties mergedProperties;
    
    @Autowired
    public final void setProps(List<Properties> props) {
        this.props = props;
    }
    
    public String getProp(final String keyVal) {
    
        if (null == this.mergedProperties) {
            this.mergedProperties = new Properties();
    
            for (Properties prop : this.props) {
                this.mergedProperties.putAll(prop);
            }
        }
        return mergedProperties.getProperty(keyVal);
      } 
    }
    
  6. from https://stackoverflow.com/questions/7219097/spring-utilproperties-injection-via-annotations-into-a-bean by cc-by-sa and MIT license