Spring 관리 컨텍스트 외부의 클래스에 콩 주입
저는 저희 회사 제품 중 하나의 최종 사용자입니다.스프링에 통합하기에는 적합하지 않지만, 상황을 파악하고 필요한 콩을 이름으로 검색할 수 있습니다.하지만 Spring 자체에서 수업을 진행하지는 않지만 이 수업에 콩을 주입하는 것이 가능한지 알고 싶습니다.
명확화:일부 클래스 MyClass의 라이프사이클을 관리하는 동일한 애플리케이션이 Spring 컨텍스트의 라이프사이클도 관리합니다.Spring은 MyClass의 인스턴스에 대한 지식이 없으며 컨텍스트에 인스턴스를 제공하고 싶지만 컨텍스트 자체에서 인스턴스를 생성할 수 없습니다.
다음을 수행할 수 있습니다.
ApplicationContext ctx = ...
YourClass someBeanNotCreatedBySpring = ...
ctx.getAutowireCapableBeanFactory().autowireBeanProperties(
someBeanNotCreatedBySpring,
AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT, true);
사용할 수 있습니다.@Autowired
내부 등YourClass
주입할 필드 등을 지정합니다.
콩의 제조가 외부임에도 불구하고 봄에 콩을 가져오는 한 가지 방법은 다음과 같이 표시된 도우미 클래스를 사용하는 것입니다.@Configuration
방법(표시)이 있는 콩@Bean
)는 실제로 인스턴스를 만들고 Spring을 통해 반환합니다(Spring은 해당 시점에서 속성 주입 및 프록시 생성을 수행합니다).
어떤 범위가 필요한지 잘 모르겠습니다.prototype
당신은 각각의 장소에서 신선한 콩을 얻을 것입니다.
@Configuration
public class FooBarMaker {
@Bean(autowire = Autowire.BY_TYPE)
@Scope("prototype")
public FooBar makeAFooBar() {
// You probably need to do some more work in here, I imagine
return new FooBar();
}
}
제조에 필요한 속성을 에 주입할 수 있습니다.@Configuration
bean. (이를 사용하여 인스턴스화할 클래스의 이름이 런타임에 정의되는 인터페이스의 인스턴스를 만듭니다.)
다음과 같은 종속성 체인이 있다고 가정합니다.
A --> B --> C --> x --> y --> Z
A, B, C는 스프링 관리 콩(스프링 프레임워크에 의해 생성 및 관리됨) x, y는 스프링 지원 없이 애플리케이션에 의해 생성되는 정말 단순한 POJO입니다.
이제 y가 스프링을 사용하여 Z에 대한 참조를 얻으려면 스프링 Application Context에 대한 '핸들'이 있어야 합니다.
한 가지 방법은 ApplicationContextAware 인터페이스를 구현하는 것입니다.이 경우 A, B 또는 C 중 하나가 이 인터페이스를 구현하고 applicationContext 참조를 정적 멤버에 저장할 것을 제안합니다.
클래스 C를 예로 들어 보겠습니다.
class C implmenets ApplicationContextAware{
public static ApplicationContex ac;
void setApplicationContext(ApplicationContext applicationContext) {
ac = applicationContext;
}
.............
}
자, 수업시간에 당신은 다음을 가져야 합니다.
(Z)(C.ac.getBean("classZ")).doSomething()
HTH - 요나탄
이를 위한 또 다른 방법은 AspectJ를 사용하는 것입니다.이 방법은 Spring bean을 사용하여 생성된 관리되지 않는 개체에 주입하는 것이 좋습니다.new
하십시오.자세한 내용은 다음을 참조하십시오.
http://www.javacodegeeks.com/2011/02/domain-driven-design-spring-aspectj.html
끝없는 오토와이어 조합을 검색하는 것은 pojo 애플리케이션 컨텍스트 인식 비나웨어 등에 스프링빈을 주입하는 것과 같은 것들이 나를 여기로 돌게 했지만, 이것은 나에게 충분한 해결책을 제공하지 못했습니다.
이것은 이 IMO의 훨씬 더 나은 구현/튜토리얼입니다. 저는 그것이 마침내 저에게 도움이 된 것처럼 모두에게 도움이 되기를 바랍니다.
Spring 컨텍스트 외부에서 Spring Bean에 액세스
Spring의 가장 오래된 버전에서는 bean factory http://jira.springframework.org/browse/SPR-4672 에 스레드 세이프 문제가 있음을 주의하십시오.
Spring 컨텍스트 외부에 개체를 만들고 해당 개체를 Spring 컨텍스트에 있는 다른 콩에 주입할 수 있도록 하려면 이 문서의 단계를 수행합니다.
기본적으로 상위 응용프로그램 컨텍스트를 만들고 외부 개체를 이 상위 컨텍스트에 싱글톤으로 밀어넣습니다.그런 다음 상위 응용프로그램 컨텍스트를 상위 응용프로그램 컨텍스트로 사용하여 기본 응용프로그램 컨텍스트(예: xml 파일)를 생성합니다.
Object externalObject = ...
GenericApplicationContext parent = new StaticApplicationContext();
parent.getBeanFactory().registerSingleton( "externalObject", externalObject );
parent.refresh();
ApplicationContext appContext = new ClassPathXmlApplicationContext( ... , parent);
Spring 구성 클래스에서 비 Spring 클래스에 콩이 필요한 정적 필드를 설정합니다.
Liquibase 질문에 대한 답변에 예를 들어 보겠습니다. https://stackoverflow.com/a/71191546/5499391
언급URL : https://stackoverflow.com/questions/310271/injecting-beans-into-a-class-outside-the-spring-managed-context
'programing' 카테고리의 다른 글
div의 내용을 백분율로 확대하시겠습니까? (0) | 2023.08.24 |
---|---|
Android에서 대화 상자가 해제되거나 취소되는 차이점은 무엇입니까? (0) | 2023.08.24 |
도커는 영원히 "도커는 시작합니다...윈도우즈 태스크에서 (0) | 2023.08.24 |
Firefox용 사용자 지정 CSS 스크롤 막대 (0) | 2023.08.24 |
Maria 백업 중에 mysqld 오류가 발생하는 이유 (0) | 2023.08.24 |