[SPRING] Spring 컨텍스트에 커스텀 빈을 추가한다.
SPRINGSpring 컨텍스트에 커스텀 빈을 추가한다.
나는 커스텀 어노테이션을 가진 클래스를 인스턴스화해서는 안된다. (추상 클래스는 진짜 bean을위한 서브 컴포넌트이다.) 하지만이 클래스의 맨 위에는 런타임시 컨텍스트 초기화 단계에서 추가 빈을 응용 프로그램 컨텍스트에 넣고 싶습니다.
그래서, 기본적으로 classpath를 스캔하고, 결과를 처리하고, 현재의 어플리케이션 컨텍스트에 새로운 빈을 도입 할 필요가 있습니다.
봄 - mvc, 봄 - 과제 및 봄 통합이 일을하고있는 것 같습니다 (나는 그것을 소스에서 배우려고 노력했다. - 운이 없다)
나는 내 자신의 BeanFactoryPostProcessor를 만들고, 클래스 패스를 검사하고, 커스텀 빈에 대한 registerSingleton을 호출 할 수 있다는 것을 발견했다. 하지만 새로운 빈을 도입 할 때 좋은 방법이라고 확신하지 못합니다. (단지 빈을 사후 처리하는 경우에만 사용됩니다.) 그리고 프로세스를 단순화하기 위해 재사용 할 수있는 Spring 내부 도구가 있다고 생각합니다.
Spring 컨텍스트 초기화에 추가 빈을 도입하는 일반적인 방법은 무엇입니까?
해결법
-
==============================
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.커스텀 어노테이션이 적용된 클래스를 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.BeanDefinitionRegistryPostProcessor를 찾고 있습니다.
BeanDefinitionRegistryPostProcessor를 찾고 있습니다.
Spring Web App Context에 Bean을 프로그램 적으로 추가한다.
-
==============================
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
from https://stackoverflow.com/questions/15720579/add-custom-beans-to-spring-context by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 봄, POST를 사용하여 외부 URL로 리디렉션 (0) | 2019.02.19 |
---|---|
[SPRING] 정적 컨텐츠를 제공하는 Tomcat (0) | 2019.02.19 |
[SPRING] 웹 응용 프로그램을 통해 메일 서버와 통신하는 방법 (0) | 2019.02.19 |
[SPRING] 파일을 다운로드하는 스프링 부트 서비스 (0) | 2019.02.19 |
[SPRING] 이클립스 롬복 주석은 컴파일되지 않았습니다 ... 왜? (0) | 2019.02.19 |