[SPRING] autowire에 프록시가 사용되지 않는 이유
SPRINGautowire에 프록시가 사용되지 않는 이유
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.내 생각 엔 같은 구성 요소를 두 번 스캔하고있는 것 같습니다. 루트 컨텍스트 (ContextLoaderListener의 경우)와 DispatcherServlet의 컨텍스트가 있습니다. 두 클래스 모두 동일한 클래스를 검색하여 중복 된 (그리고 프록시 된 인스턴스 하나와 프록시되지 않은 인스턴스 한 개) 경우.
내 생각 엔 같은 구성 요소를 두 번 스캔하고있는 것 같습니다. 루트 컨텍스트 (ContextLoaderListener의 경우)와 DispatcherServlet의 컨텍스트가 있습니다. 두 클래스 모두 동일한 클래스를 검색하여 중복 된 (그리고 프록시 된 인스턴스 하나와 프록시되지 않은 인스턴스 한 개) 경우.
-
==============================
2.프록 싱 및 자동 배선은 서로 독립적입니다. @AutoWired를 사용하면 필요한 인터페이스를 구현하고 삽입하는 다른 bean을 찾습니다. 발견 된 bean 인스턴스는 일반적인 객체 또는 프록시 일 수 있습니다. Autowired에는 문제가되지 않습니다.
프록 싱 및 자동 배선은 서로 독립적입니다. @AutoWired를 사용하면 필요한 인터페이스를 구현하고 삽입하는 다른 bean을 찾습니다. 발견 된 bean 인스턴스는 일반적인 객체 또는 프록시 일 수 있습니다. Autowired에는 문제가되지 않습니다.
프록시는 봄에 의해 자동으로 특정 빈을 위해 생성됩니다. 이런 일이 일어나는 한가지 시나리오는 @Transactional을 사용할 때입니다. 스프링 컨테이너가 @Transactional 어노테이션을 가진 빈을 인스턴스화하면 객체는 프록시로 래핑된다. 실제 객체는 컨텍스트에서 프록시로 대체됩니다. 이것은 스프링이 메소드에 대한 호출을 인터셉트하고 메소드 호출 전후에 begin / commit 트랜잭션 호출을 추가 할 수 있도록하기 위해 수행됩니다. 이것은 spring-aop 모듈에 의해 구현됩니다. AOP (@Transactional, @Secured)에 의존하는 모든 기능은 프록시 생성을 가져옵니다.
프록시가 사용되는 다른 경우는 즉시 구현을 작성하는 것입니다. CRUDRepository의 경우 인터페이스 만 구현하면됩니다. 이 구현은 동일한 프록시 인프라를 사용하여 즉석에서 만들어집니다.
from https://stackoverflow.com/questions/18995298/why-proxy-is-not-used-to-autowire by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] HTTP 500 - ''연결 URL에 대해 ''클래스의 JDBC 드라이버를 만들 수 없습니다. (0) | 2019.05.01 |
---|---|
[SPRING] 봄 내 CSS 파일을로드 할 수 없습니다 (0) | 2019.05.01 |
[SPRING] 나는 봄에 직조 시간을 사용합니다. 부두에 클래스 로더를 설정하려면 어떻게해야합니까? (0) | 2019.05.01 |
[SPRING] 봄 + 봄 보안 + hasPermission 작동하지 않습니다 (0) | 2019.05.01 |
[SPRING] Spring - SpEL은 엔티티 인수를 @PreAuthorize ( "hasPermission")의 null 참조로 평가합니다. (0) | 2019.04.30 |