복붙노트

[SPRING] autowire에 프록시가 사용되지 않는 이유

SPRING

autowire에 프록시가 사용되지 않는 이유

autowire 된 모든 bean이 프록시에 의해 autowired되지 않는 이유를 찾을 수 없습니다. @Transactional 어노테이션이 작동하지 않기 때문에 Eclipse에서 디버깅하는 동안 autowired 구성 요소를 확인했습니다. 물론 모든 컴포넌트는 인터페이스를 구현하고 인터페이스와 관련하여 @Autowired 주석을 사용합니다. 나는 한 가지 구성만을 가지고있다.

<tx:annotation-driven transaction-manager="transactionManager" />

JPA를 사용하여 최대 절전 모드, 스프링 -mvc, 스프링 웹 플로우, 스프링 보안 및 스프링 데이터를 사용합니다. org.springframework.data.repository.CrudRepository를 확장 한 인터페이스는 프록시에 의해 autowired됩니다. 하지만 내 구성 요소가 아닙니다. 예를 들어 MyInterface를 구현하는 MyClass 클래스가 있습니다.

@Service
public class MyClass implements MyInterface {
@Autowired
MyCrudReposiotry reposiotry;
....
}

MyInterface 어딘가에 autowire면 :

@Autowired
MyInterface mi;

mi는 단지 MyClass 객체에 대한 참조이고, 저장소는 프록시 org.springframework.aop.framework.JdkDynamicAopProxy에 대한 참조입니다. 매우 흥미로운 점은 mi를 테스트 할 때 프록시를 참조한다는 것입니다. 내 테스트의 컨텍스트에는 웹 흐름과 mvc 구성이 포함되어 있지 않습니다.

어쩌면 점검해야 할 간접적 인 구성이있을 수 있습니다. 프록시로 autowiring을 끌 수있는 것은 무엇입니까?

해결법

  1. ==============================

    1.내 생각 엔 같은 구성 요소를 두 번 스캔하고있는 것 같습니다. 루트 컨텍스트 (ContextLoaderListener의 경우)와 DispatcherServlet의 컨텍스트가 있습니다. 두 클래스 모두 동일한 클래스를 검색하여 중복 된 (그리고 프록시 된 인스턴스 하나와 프록시되지 않은 인스턴스 한 개) 경우.

    내 생각 엔 같은 구성 요소를 두 번 스캔하고있는 것 같습니다. 루트 컨텍스트 (ContextLoaderListener의 경우)와 DispatcherServlet의 컨텍스트가 있습니다. 두 클래스 모두 동일한 클래스를 검색하여 중복 된 (그리고 프록시 된 인스턴스 하나와 프록시되지 않은 인스턴스 한 개) 경우.

  2. ==============================

    2.프록 싱 및 자동 배선은 서로 독립적입니다. @AutoWired를 사용하면 필요한 인터페이스를 구현하고 삽입하는 다른 bean을 찾습니다. 발견 된 bean 인스턴스는 일반적인 객체 또는 프록시 일 수 있습니다. Autowired에는 문제가되지 않습니다.

    프록 싱 및 자동 배선은 서로 독립적입니다. @AutoWired를 사용하면 필요한 인터페이스를 구현하고 삽입하는 다른 bean을 찾습니다. 발견 된 bean 인스턴스는 일반적인 객체 또는 프록시 일 수 있습니다. Autowired에는 문제가되지 않습니다.

    프록시는 봄에 의해 자동으로 특정 빈을 위해 생성됩니다. 이런 일이 일어나는 한가지 시나리오는 @Transactional을 사용할 때입니다. 스프링 컨테이너가 @Transactional 어노테이션을 가진 빈을 인스턴스화하면 객체는 프록시로 래핑된다. 실제 객체는 컨텍스트에서 프록시로 대체됩니다. 이것은 스프링이 메소드에 대한 호출을 인터셉트하고 메소드 호출 전후에 begin / commit 트랜잭션 호출을 추가 할 수 있도록하기 위해 수행됩니다. 이것은 spring-aop 모듈에 의해 구현됩니다. AOP (@Transactional, @Secured)에 의존하는 모든 기능은 프록시 생성을 가져옵니다.

    프록시가 사용되는 다른 경우는 즉시 구현을 작성하는 것입니다. CRUDRepository의 경우 인터페이스 만 구현하면됩니다. 이 구현은 동일한 프록시 인프라를 사용하여 즉석에서 만들어집니다.

  3. from https://stackoverflow.com/questions/18995298/why-proxy-is-not-used-to-autowire by cc-by-sa and MIT license