복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    3.이 질문을하는 사람은 @Autowired 주석을 선택 사항으로 설정하는 것이 트릭을 수행한다는 것을 명심하십시오 (즉, 적절한 Bean이 없으면 Spring은 참조 null을 남겨 둡니다).

    이 질문을하는 사람은 @Autowired 주석을 선택 사항으로 설정하는 것이 트릭을 수행한다는 것을 명심하십시오 (즉, 적절한 Bean이 없으면 Spring은 참조 null을 남겨 둡니다).

    @Autowired(required = false)
    private SomeClass someBean
    

    빈이 참조되는 모든 곳에서이 작업을 수행해야합니다. 위에서 언급 한 것처럼 null factory를 만드는 것보다 더 큰 번거 로움이 될 수 있습니다.

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

    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. ==============================

    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. ==============================

    6.특별한 빈 요소를 사용할 수 있습니까? 예 :

    특별한 빈 요소를 사용할 수 있습니까? 예 :

    <bean class="ExampleBean">
    <property name="email"><null/></property>
    </bean>
    

    문서의 3.3.2.5 절

  7. from https://stackoverflow.com/questions/2163182/intentionally-setting-a-spring-bean-to-null by cc-by-sa and MIT license