[SPRING] 의도적으로 Spring 빈을 null로 설정
SPRING의도적으로 Spring 빈을 null로 설정
Spring을 사용하여 JMS 연결 팩토리를 Java 응용 프로그램에 주입합니다. 이 팩토리는 프로덕션 환경에서만 필요하기 때문에 개발 중이 라기보다는 bean 정의를 기본 applicationContext.xml에 포함 된 별도의 XML에 넣습니다. 프로덕션 환경에서는이 추가 파일에 일반 Bean 정의가 포함됩니다. 내 로컬 개발 환경 에서이 콩 null이 싶습니다. Spring 정의를 제거하기 만하면 Spring이 알지 못하는 참조 ID를 발견했을 때 오류가 발생했다.
그래서 단순히 null을 반환하는 factory bean을 만들려고했습니다. 이 작업을 수행하면 Spring (2.5.x)에서 FactoryBean 인터페이스의 Spring API 문서를 기반으로 작동하지만 null로 반환된다는 문구를 보았습니다 (Spring API doc 참조).
XML은 다음과 같이 보입니다.
<bean id="jmsConnectionFactoryFactory" class="de.airlinesim.jms.NullJmsConnectionFactoryFactory" />
<bean id="jmsConnectionFactory" factory-bean="jmsConnectionFactoryFactory" factory-method="getObject"/>
이것을하는 "올바른"방법은 무엇입니까?
해결법
-
==============================
1.factory-bean / factory-method는 null에서는 작동하지 않지만 사용자 정의 FactoryBean 구현은 잘 작동합니다.
factory-bean / factory-method는 null에서는 작동하지 않지만 사용자 정의 FactoryBean 구현은 잘 작동합니다.
public class NullFactoryBean implements FactoryBean<Void> { public Void getObject() throws Exception { return null; } public Class<? extends Void> getObjectType() { return null; } public boolean isSingleton() { return true; } }
<bean id="jmsConnectionFactory" class = "com.sample.NullFactoryBean" />
-
==============================
2.나는 스프링이 당신이 빈 id 나 별칭과 null을 연관시키는 것을 허용하지 않을 것이라고 확신한다. 속성을 null로 설정하여이를 처리 할 수 있습니다.
나는 스프링이 당신이 빈 id 나 별칭과 null을 연관시키는 것을 허용하지 않을 것이라고 확신한다. 속성을 null로 설정하여이를 처리 할 수 있습니다.
Spring 2.5에서 이렇게했다.
<bean class="ExampleBean"> <property name="email"><null/></property> </bean>
Spring 3.0에서는 Spring 표현식 언어 (SpEL)도 사용할 수 있어야한다. 예 :
<bean class="ExampleBean"> <property name="email" value="#{ null }"/> </bean>
또는 null로 평가되는 SpEL 식입니다.
플레이스 홀더 컨 피규 레이터를 사용한다면 다음과 같이 할 수도 있습니다 :
<bean class="ExampleBean"> <property name="email" value="#{ ${some.prop} }`"/> </bean>
some.prop은 다음과 같이 속성 파일에 정의 될 수 있습니다.
some.prop=null
또는
some.prop=some.bean.id
-
==============================
3.이 질문을하는 사람은 @Autowired 주석을 선택 사항으로 설정하는 것이 트릭을 수행한다는 것을 명심하십시오 (즉, 적절한 Bean이 없으면 Spring은 참조 null을 남겨 둡니다).
이 질문을하는 사람은 @Autowired 주석을 선택 사항으로 설정하는 것이 트릭을 수행한다는 것을 명심하십시오 (즉, 적절한 Bean이 없으면 Spring은 참조 null을 남겨 둡니다).
@Autowired(required = false) private SomeClass someBean
빈이 참조되는 모든 곳에서이 작업을 수행해야합니다. 위에서 언급 한 것처럼 null factory를 만드는 것보다 더 큰 번거 로움이 될 수 있습니다.
-
==============================
4.위에서 언급 한 것들 중 일부는, Axtact의 대답은 Autowiring 컨텍스트에서 작동하지 않는다. Spring은 getObjectType () 메소드의 올바른 정보에 의존 할 것이다. 따라서 다음과 같은 오류가 발생할 수 있습니다.
위에서 언급 한 것들 중 일부는, Axtact의 대답은 Autowiring 컨텍스트에서 작동하지 않는다. Spring은 getObjectType () 메소드의 올바른 정보에 의존 할 것이다. 따라서 다음과 같은 오류가 발생할 수 있습니다.
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [xxxxxxxxxxxxx] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=yyyyyyyyyyyyyyyy)} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:920) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:789) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotatio
그래서 여기에 사용자가 건설 중에 objectype을 강요하는 것을 허용하는 작은 변형이 있습니다. Spring이 컨텍스트에서 빈을 완전히 초기화하지 않기 때문에 constructor-arg 대신에 프로퍼티를 사용하는 것이 효과가 없다.
public class NullFactoryBean implements FactoryBean { private final Class<?> objectType; public NullFactoryBean(Class<?> objectType) { this.objectType = objectType; } @Override public Object getObject() throws Exception { return null; } @Override public Class<?> getObjectType() { return objectType; } @Override public boolean isSingleton() { return false; } }
-
==============================
5.테스트에서 null 빈은 다음과 같이 주입 될 수 있습니다 :
테스트에서 null 빈은 다음과 같이 주입 될 수 있습니다 :
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = NullTest.class) @Configuration public class NullTest { @Bean(name = "em") public IEntityManager em() { return null; } @Bean public PlatformTransactionManager tm() { return null; } @Resource private SomeBean someBean; // this would get em and tm fields autowired to nulls
-
==============================
6.특별한
빈 요소를 사용할 수 있습니까? 예 : 특별한
빈 요소를 사용할 수 있습니까? 예 : <bean class="ExampleBean"> <property name="email"><null/></property> </bean>
문서의 3.3.2.5 절
from https://stackoverflow.com/questions/2163182/intentionally-setting-a-spring-bean-to-null by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring Data JPA : 예제로 쿼리 하시겠습니까? (0) | 2019.01.02 |
---|---|
[SPRING] 사용자 권한 부여 된 권한은 항상 : ROLE_ANONYMOUS입니까? (0) | 2019.01.02 |
[SPRING] 최대 절전 모드 및 스프링을 사용하여 낙관적 인 잠금 구현 (0) | 2019.01.02 |
[SPRING] 스프링 자바 설정을 사용하여 싱글 톤 빈으로 프로토 타입 객체 생성하기 (0) | 2019.01.02 |
[SPRING] JsonMappingException : 프록시를 초기화 할 수 없습니다 - 세션 없음 (0) | 2019.01.02 |