복붙노트

[SPRING] Spring 컨텍스트에 커스텀 빈을 추가한다.

SPRING

Spring 컨텍스트에 커스텀 빈을 추가한다.

나는 커스텀 어노테이션을 가진 클래스를 인스턴스화해서는 안된다. (추상 클래스는 진짜 bean을위한 서브 컴포넌트이다.) 하지만이 클래스의 맨 위에는 런타임시 컨텍스트 초기화 단계에서 추가 빈을 응용 프로그램 컨텍스트에 넣고 싶습니다.

그래서, 기본적으로 classpath를 스캔하고, 결과를 처리하고, 현재의 어플리케이션 컨텍스트에 새로운 빈을 도입 할 필요가 있습니다.

봄 - mvc, 봄 - 과제 및 봄 통합이 일을하고있는 것 같습니다 (나는 그것을 소스에서 배우려고 노력했다. - 운이 없다)

나는 내 자신의 BeanFactoryPostProcessor를 만들고, 클래스 패스를 검사하고, 커스텀 빈에 대한 registerSingleton을 호출 할 수 있다는 것을 발견했다. 하지만 새로운 빈을 도입 할 때 좋은 방법이라고 확신하지 못합니다. (단지 빈을 사후 처리하는 경우에만 사용됩니다.) 그리고 프로세스를 단순화하기 위해 재사용 할 수있는 Spring 내부 도구가 있다고 생각합니다.

Spring 컨텍스트 초기화에 추가 빈을 도입하는 일반적인 방법은 무엇입니까?

해결법

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

    1.BeanFactoryPostProcessor는 실제로 BeanFactoryPostProcessor가 Bean 정의 / 인스턴스를 애플리케이션에서 사용 가능하게 만들기 전에 수정하는 메커니즘을 제공하는 두 가지 방법 중 하나이다 (다른 BeanPostProcessors 사용)

    BeanFactoryPostProcessor는 실제로 BeanFactoryPostProcessor가 Bean 정의 / 인스턴스를 애플리케이션에서 사용 가능하게 만들기 전에 수정하는 메커니즘을 제공하는 두 가지 방법 중 하나이다 (다른 BeanPostProcessors 사용)

    bean 정의를 추가 / 수정하기 위해 BeanFactoryPostProcessors를 절대적으로 사용할 수 있습니다. 여기에 사용자가 명시 적으로 지정하지 않은 경우 errorChannel을 추가하는 Spring Integration 코드베이스의 샘플이 있습니다. 새 bean을 등록 할 때 비슷한 코드를 사용할 수 있습니다.

        RootBeanDefinition errorChannelDef = new RootBeanDefinition();
        errorChannelDef.setBeanClassName(IntegrationNamespaceUtils.BASE_PACKAGE
                + ".channel.PublishSubscribeChannel");
        BeanDefinitionHolder errorChannelHolder = new BeanDefinitionHolder(errorChannelDef,
                IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME);
        BeanDefinitionReaderUtils.registerBeanDefinition(errorChannelHolder, registry);
    
  2. ==============================

    2.커스텀 어노테이션이 적용된 클래스를 bean 정의로 포함시키는 방법은 최소한 두 가지가 있습니다.

    커스텀 어노테이션이 적용된 클래스를 bean 정의로 포함시키는 방법은 최소한 두 가지가 있습니다.

    예 :

    <context:component-scan base-package="org.example">
            <context:include-filter type="annotation" expression="org.example.Annotation"/>
    </context:component-scan>
    

    그런 다음 BeanPostProcessor를 사용하여 인스턴스를 생성 할 수 있습니다 (예 :

    public class CustomAnnotationBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter
    
    
             @Override
                public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
                    if (beanClass.isAnnotationPresent(org.example.Annotation.class)) {
                        Object bean  = createBeanInstance();
                        ...
                        return bean:
                    }
                    return null;
                } 
        }
    

    또는 BeanFactoryPostProcessor를 사용하여 ScannedGenericBeanDefinitions를 처리하십시오.

    내부 스프링 주석 포스트 프로세서의 샘플 코드는 AnnotationConfigUtils.registerAnnotationConfigProcessors ()를 참조하십시오.

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

    3.BeanDefinitionRegistryPostProcessor를 찾고 있습니다.

    BeanDefinitionRegistryPostProcessor를 찾고 있습니다.

    Spring Web App Context에 Bean을 프로그램 적으로 추가한다.

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

    4.BeanPostProcessors 및 BeanFactoryPostProcessors에 대한이 링크를 참조하십시오. http://springindepth.com/book/in-depth-ioc-bean-post-processors-and-beanFactory-post-processors.html

    BeanPostProcessors 및 BeanFactoryPostProcessors에 대한이 링크를 참조하십시오. http://springindepth.com/book/in-depth-ioc-bean-post-processors-and-beanFactory-post-processors.html

  5. from https://stackoverflow.com/questions/15720579/add-custom-beans-to-spring-context by cc-by-sa and MIT license