2013-05-30 3 views
0

저는 스프링을 처음 사용합니다. autowired가 Spring 문맥에 존재하지 않는 보통 자바 빈에 사용될 대안이 있는가?@ 스프링 컨텍스트가 아닌 bean에 실려 있음

+0

그래서 스프링 관리 빈을 관리되지 않는 POJO에 주입하고 싶습니까? – WeMakeSoftware

+0

spring-container가 아니라 인스턴스화하는 bean에 대해 autowiring이 작동하도록 하시겠습니까? –

+0

@Funtik, 네, 맞습니다. –

답변

1

당신은 어떤 AspectJ 마법 봄 @Configurable를 사용하여 수행 할 수 있습니다. 당신은 자세한 설명이 필요한 경우

, 여기에 link입니다. 여기

그리고

는 달성 할 수있는 방법에 대한 간략한 개요입니다.

@Component 
public class InjectedClass { 
    // ... 
} 

그런 다음, 당신은 당신이 인스턴스화 할 것인지, 관리 - 봄 용기되지 않은 클래스가 :

먼저 당신은 당신이 어딘가에 주입하려는 일부 콩이있다. autowiring이이 클래스로 작업하기를 원합니다. 그것을 @Configurable으로 표시하십시오.

@Configurable 
public class NonContainerManagedClass { 

    @Autowired 
    private InjectedClass injected; 

    // ... 
} 

지금 당신은 당신이 일을 autowiring에이 관리 비 컨테이너를 원하는 봄을 말할 필요가있다. 그래서 당신은 당신의 봄 구성에 다음을 넣는다.

<context:load-time-weaver /> 
<context:spring-configured /> 

이제 이런 종류의 일이 당신의 @Configurable 클래스의 바이트 코드의 수정을 필요로하기 때문이다. 그래서 Tomcat에게 다른 classloader을 사용하라고 명령합니다. 애플리케이션의 META-INF 디렉터리에 context.xml을 만들고 거기에 다음을 입력하면됩니다.

<Context path="/youWebAppName"> 
    <Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader" 
     useSystemClassLoaderAsParent="false"/> 
</Context> 

이제, Tomcat은 그 classloader을 찾을 필요가있다. 당신은 넣어을 확인 할 수 있습니다 봄의 spring-tomcat-weaver.jar 톰캣 설치의 lib 디렉토리에 (아마도 org.springframework.instrument.tomcat-<version>.jar 이름), 짜잔, AspectJ의 마법이 작동을 시작합니다. @Configurable 주석이있는 클래스의 경우 @Autowired 종속성이 자동으로 해결됩니다. 인스턴스가 스프링 컨테이너 외부에서 생성 된 경우에도 마찬가지입니다.

이것은 아마도 깨끗한 방식으로, 봄과 함께 그 일을 할 수있는 유일한 방법입니다. classpath에 적절한 종속성이 있는지 확인하십시오.

또 다른 방법은 전체 AspectJ 기능과 모든 생성자의 주위에 사용자 정의 측면을 제공하고 의존성 주입 자신을 처리를 사용하는 것입니다.

관련 문제