Mar*_*usz 2 spring proxy-classes
我找不到为什么每个自动装配的bean都没有被代理自动装配的原因.我知道因为@Transactional注释不起作用,我在eclipse调试期间检查了自动装配的组件.当然,每个组件都实现了一些接口,我使用@Autowired与接口相关的注释.我只有一个aop配置:
<tx:annotation-driven transaction-manager="transactionManager" />
Run Code Online (Sandbox Code Playgroud)
我使用JPA与hibernate,spring-mvc,spring-webflow,spring-security和spring-data.扩展的接口org.springframework.data.repository.CrudRepository由代理自动装配.但我的组件不是.例如,我有类MyClass实现MyInterface:
@Service
public class MyClass implements MyInterface {
@Autowired
MyCrudReposiotry reposiotry;
....
}
Run Code Online (Sandbox Code Playgroud)
如果我在某处自动装配MyInterface:
@Autowired
MyInterface mi;
Run Code Online (Sandbox Code Playgroud)
然后mi只是MyClass对象的引用,存储库是对代理的引用org.springframework.aop.framework.JdkDynamicAopProxy.非常有趣的是,在测试中mi是对代理的引用.我的测试上下文不包含web-flow和mvc配置.
也许有一些间接的aop配置我应该检查.什么可以通过代理关闭自动装配?
我的猜测是你要扫描两次相同的组件.您可能在根上下文中(对于ContextLoaderListener)和一个用于DispatcherServlet.如果两者扫描相同的类,则最后是重复的(以及一个代理和一个非代理实例).
代理和自动连线是相互独立的。当您使用@AutoWired它时,它会找到另一个实现所需接口的 bean 并注入它。它找到的 bean 实例可能是一个普通对象或一个代理——它与 Autowired 无关。
Spring 会自动为某些 bean 创建代理。正如您所注意到的,发生这种情况的一种情况是当您使用@Transactional. 当 spring 容器实例化一个带有@Transactional注释的bean 时,对象被包裹在代理中。实际对象被上下文中的代理替换。这样做是为了让 spring 可以拦截对这些方法的调用,并在方法调用之前和之后添加开始/提交事务调用。这是由 spring-aop 模块实现的。任何依赖 AOP ( @Transactional, @Secured) 的功能都会导致创建代理。
使用代理的另一种情况是动态创建实现。在 CRUDRepository 的情况下,您只需要实现接口。它的实现是使用相同的代理基础设施即时创建的。
| 归档时间: |
|
| 查看次数: |
3401 次 |
| 最近记录: |