봄에 자기 인스턴스화 개체에 종속성을 주입하려면 어떻게 해야 합니까?
클래스가 있다고 합시다.
public class MyClass {
@Autowired private AnotherBean anotherBean;
}
그런 다음 이 클래스의 개체를 만들었습니다(또는 다른 프레임워크가 이 클래스의 인스턴스를 만들었습니다).
MyClass obj = new MyClass();
의존관계를 주입할 수 있습니까?예를 들어 다음과 같습니다.
applicationContext.injectDependencies(obj);
(Google Guice에는 이런 것이 있는 것 같습니다.)
이 조작은, 를 사용해 실시할 수 있습니다.autowireBean()
의 방법AutowireCapableBeanFactory
임의의 오브젝트를 전달하면 스프링은 그 오브젝트를 자신이 만든 것처럼 취급하여 다양한 자동배선 비트를 적용합니다.
문의처AutowireCapableBeanFactory
, 다음의 것을 자동 접속합니다.
private @Autowired AutowireCapableBeanFactory beanFactory;
public void doStuff() {
MyBean obj = new MyBean();
beanFactory.autowireBean(obj);
// obj will now have its dependencies autowired.
}
MyClass에 @Configurable 주석을 표시할 수도 있습니다.
@Configurable
public class MyClass {
@Autowired private AnotherClass instance
}
그런 다음 생성 시 종속성이 자동으로 주입됩니다.너도 그랬어야 했어<context:spring-configured/>
어플리케이션 컨텍스트xml
방금 같은 요구를 받았고, 제 경우엔 이미 스프링 관리 불가능한 자바 클래스 안에 있는 로직으로ApplicationContext
스캘프맨에서 영감을 얻었다.해결 방법:
AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
factory.autowireBean(manuallyCreatedInstance);
저는 다음에 이어지는 솔루션을 공유하고자 합니다.@Configurable
로서 접근하다.briefly
@glaz666에 기재되어 있는 이유는 다음과 같습니다.
- @skaffman의 답변은 10년 가까이 지났습니다.그것은 충분하지 않거나 효과가 없는 것을 의미합니다.
- @glaz666의 답변은 간결하고 문제 해결에 큰 도움이 되지 않았지만 올바른 방향을 제시해 주었습니다.
내 셋업
- 스프링 부트 2.0.3과
Spring Neo4j & Aop starts
(어쨌든 상관없다) - 콩을 인스턴스화하다
Spring Boot
사용할 수 있습니다.@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과 같이) 하지만, 제 경우, 이클립스는 문제를 해결하지 못했습니다.@EnableSpringConfigured
주석은 왜 , 주석은 왜 붙였는가.spring-aop
★★★★★★★★★★★★★★★★★★★★★★★★★★★하거나, 를 밝히거나, .
- 버전 충돌이 있습니까?
- ??
org.springframework.context.annotation.aspect.*
할 수 없습니다. - IDE가 올바르게 설정되어 있습니까?
- 기타 등
나는 다른 접근법을 썼다.저는 스프링 장전된 콩을 가지고 있었습니다.스프링 장전된 콩은 독자적인 스레드를 만드는 서드파티 라이브러리의 확장 클래스에서 호출하고 싶었습니다.
https://confluence.jaytaala.com/display/TKB/Super+simple+approach+to+accessing+Spring+beans+from+non-Spring+managed+classes+and+POJOs에서 찾은 접근방식을 사용하였습니다.
비관리 클래스의 경우:
{
[...]
SomeBean bc = (SomeBean) SpringContext.getBean(SomeBean.class);
[...]
bc.someMethod(...)
}
다음으로 메인 어플리케이션의 도우미 클래스로서 다음과 같이 합니다.
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringContext implements ApplicationContextAware
{
private static ApplicationContext context;
public static <T extends Object> T getBean(Class<T> beanClass)
{
return context.getBean(beanClass);
}
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException
{
SpringContext.context = context;
}
}
이 방법은 효과가 있었습니다.
@Configuration
public class AppConfig {
@Bean
public TransferService transferService() {
return new TransferServiceImpl();
}
}
자세한 것은, https://docs.spring.io/spring-javaconfig/docs/1.0.0.m3/reference/html/creating-bean-definitions.html 를 참조해 주세요.
언급URL : https://stackoverflow.com/questions/3813588/how-to-inject-dependencies-into-a-self-instantiated-object-in-spring
'it-source' 카테고리의 다른 글
전자 요구()가 정의되지 않았습니다. (0) | 2022.11.20 |
---|---|
np.array()와 np.asarray()의 차이점은 무엇입니까? (0) | 2022.11.20 |
행을 찾을 수 없는 경우 JOIN 조건의 폴백 값 (0) | 2022.11.20 |
특수한 포인터Collectors.toMap에 null 엔트리 값이 있는 예외가 있습니다. (0) | 2022.11.20 |
Gzip의 JavaScript 구현 (0) | 2022.11.20 |