[SPRING] Spring Util : 빈에 대한 주석을 통한 속성 주입
SPRINGSpring 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.
@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.이 질문에는 많은 히트가 있습니다. 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.@PropertySource를 사용할 수 있습니다.
@PropertySource를 사용할 수 있습니다.
@Configuration @PropertySource(name = "someName", value = {"classpath:a.properties", "classpath:b.properties"}) public class MyConfiguration { }
-
==============================
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.대부분의 경우 모든 속성을 하나의 유틸리티로 캡슐화하고 내 응용 프로그램에서 사용했습니다. 그렇게하면 앱 계층의 각 속성 파일을 걱정하거나 관리 할 필요가 없습니다. 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); } }
from https://stackoverflow.com/questions/7219097/spring-utilproperties-injection-via-annotations-into-a-bean by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 여러 모듈에서 Spring 캐시 주석 사용하기 (0) | 2019.03.03 |
---|---|
[SPRING] 누락 된 CrudRepository # findOne 메소드 (0) | 2019.03.03 |
[SPRING] 봄 3.0.5 라이브러리 항아리 (0) | 2019.03.03 |
[SPRING] J2EE 웹 애플리케이션의 표준 프로젝트 / 패키지 구조 (0) | 2019.03.03 |
[SPRING] 바람둥이 클러스터에있는 Spring Websocket (0) | 2019.03.03 |