[java] Spring에서 자체 인스턴스화 된 객체에 종속성을 주입하는 방법은 무엇입니까?
수업이 있다고 가정 해 봅시다.
public class MyClass {
@Autowired private AnotherBean anotherBean;
}
그런 다음이 클래스의 객체를 만들었습니다 (또는 다른 프레임 워크에서이 클래스의 인스턴스를 만들었습니다).
MyClass obj = new MyClass();
여전히 의존성을 주입 할 수 있습니까? 다음과 같은 것 :
applicationContext.injectDependencies(obj);
(Google Guice에는 이와 같은 것이 있다고 생각합니다)
답변
의 autowireBean()
방법을 사용하여이 작업을 수행 할 수 있습니다 AutowireCapableBeanFactory
. 당신은 임의의 객체를 전달하고 Spring은 그것을 스스로 만든 것처럼 취급하고 다양한 자동 배선 비트와 조각을 적용합니다.
의 정보를 얻으려면 AutowireCapableBeanFactory
다음을 자동 연결하십시오.
private @Autowired AutowireCapableBeanFactory beanFactory;
public void doStuff() {
MyBean obj = new MyBean();
beanFactory.autowireBean(obj);
// obj will now have its dependencies autowired.
}
답변
@Configurable 주석으로 MyClass를 표시 할 수도 있습니다.
@Configurable
public class MyClass {
@Autowired private AnotherClass instance
}
그런 다음 생성시 종속성을 자동으로 주입합니다. 또한 <context:spring-configured/>
응용 프로그램 컨텍스트 xml에 있어야합니다 .
답변
방금 같은 요구가 있었고 내 경우에는 이미 Spring이 관리 할 수없는 Java 클래스의 논리에 액세스했습니다 ApplicationContext
. 스카프 맨에서 영감을 얻었습니다. 해결 방법 :
AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
factory.autowireBean(manuallyCreatedInstance);
답변
나는 다음 내 솔루션 공유하기를 원해요 @Configurable
으로 접근을 briefly
glaz666 @에서 언급 한 대답 때문에를
- @skaffman 의 답변 은 거의 10 살이며 충분하지 않거나 작동하지 않는다는 의미는 아닙니다.
- @ glaz666의 대답은 간단하고 실제로 문제를 해결하는 데 도움이되지는 않았지만 올바른 방향으로 나를 가리 켰습니다.
내 설정
- Spring Boot 2.0.3 with
Spring Neo4j & Aop starts
(어쨌든 관련이 없음) - 접근 방식을 사용하여
Spring Boot
준비가 되면 Bean을 인스턴스화하십시오@Configurable
(ApplicationRunner
) - 그레들 & 이클립스
단계
작동하려면 아래 단계를 따라야했습니다.
- 은
@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = false)
당신의 상단에 배치하는Bean
수동으로 인스턴스화하는 것입니다. 내 경우에는Bean
수동으로 인스턴스화 해야하는@Autowired
서비스가 있으므로 위의 주석에 소품이 있습니다. - 봄 부팅의 주요 주석
XXXApplicaiton.java
(주석 또는 파일을@SpringBootApplication
사용)@EnableSpringConfigured
및@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
- (즉, build.gradle 또는의 pom.xml하는 일에 사용 따라) 빌드 파일의 종속성을 추가
compile('org.springframework.boot:spring-boot-starter-aop')
하고compile('org.springframework:spring-aspects:5.0.7.RELEASE')
- 어디서나
Bean
주석이 달린 새로운 기능 +@Configurable
의존성이 자동 배선되어야합니다.
* 위의 3 번 지점과 관련하여 필자는 org.springframework.boot:spring-boot-starter-aop
전 이적으로 spring-aop
(여기에 표시된 것처럼 mavencentral )를 가져 오는 것을 알고 있지만 Eclipse의 경우 @EnableSpringConfigured
주석 을 해결하지 못했기 때문에 spring-aop
스타터 외에도 종속성을 명시 적으로 추가 한 이유는 무엇입니까? 같은 문제에 직면하면 의존성을 선언하거나 알아내는 모험을 떠나십시오.
- 버전 충돌이 있습니까
org.springframework.context.annotation.aspect.*
사용할 수없는 이유- IDE 설정이 올바르게되어 있습니까
- 등