it-source

봄에 자기 인스턴스화 개체에 종속성을 주입하려면 어떻게 해야 합니까?

criticalcode 2022. 11. 20. 12:17
반응형

봄에 자기 인스턴스화 개체에 종속성을 주입하려면 어떻게 해야 합니까?

클래스가 있다고 합시다.

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의 답변은 간결하고 문제 해결에 큰 도움이 되지 않았지만 올바른 방향을 제시해 주었습니다.

내 셋업

  1. 스프링 부트 2.0.3과Spring Neo4j & Aop starts(어쨌든 상관없다)
  2. 콩을 인스턴스화하다Spring Boot사용할 수 있습니다.@Configurable어프로치(사용ApplicationRunner)
  3. 그래들 & 이클립스

순서

작동시키기 위해 아래 단계를 따라야 했습니다.

  1. @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = false)위에 얹히다Bean수동으로 인스턴스화해야 합니다.저 같은 경우에는Bean수동으로 인스턴스화해야 합니다.@Autowired즉, 상기 주석의 소품입니다.
  2. 스프링 부트의 메인 주석 달기XXXApplicaiton.java(또는 주석 첨부 파일)@SpringBootApplication)와@EnableSpringConfigured그리고.@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
  3. 빌드 파일에 종속성을 추가합니다(사용하는 파일에 따라 build.gradle 또는 pom.xml).compile('org.springframework.boot:spring-boot-starter-aop')그리고.compile('org.springframework:spring-aspects:5.0.7.RELEASE')
  4. 새로 만들기+업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

반응형