当前位置: 首页 > 知识库问答 >
问题:

为什么不使用代理自动连线

通远
2023-03-14

我找不到任何原因来解释为什么每个自动连接的bean都不是通过代理自动连接的。我知道,因为事务注释不起作用,我在eclipse中调试时检查了自动连线组件。当然,每个组件都实现了一些接口,我使用了与接口相关的注释。我只有一种aop配置:

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

我将JPA与hibernate、spring mvc、spring webflow、spring security和spring数据一起使用。扩展组织的接口。springframework。数据存储库。CrudRepository由代理自动连接。但我的组件不是。例如,我有类MyClass,它实现了MyInterface:

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

如果我在某处自动装配MyInterface:

@Autowired
MyInterface mi;

那么mi就是引用MyClass对象,repository就是引用代理组织。springframework。aop。框架jdkDynamicApproxy。非常有趣的是,在测试中,mi是对代理的引用。我的测试上下文不包含web流和mvc配置。

也许有一些间接的aop配置,我应该检查一下。什么可以关闭代理自动布线?

共有2个答案

黄靖
2023-03-14

代理和自动布线相互独立。当您使用AutoWired时,它会找到另一个bean来实现所需的接口并注入它。它找到的bean实例可能是一个普通对象或一个代理-自动连接无关紧要。

spring自动为某些bean创建代理。正如您所注意到的,当您使用事务性时,会发生这种情况。当spring容器实例化具有事务注释的bean时,对象被包装在代理中。实际对象在上下文中被代理替换。这样做是为了使spring能够拦截对这些方法的调用,并在方法调用之前和之后添加开始/提交事务调用。这是由spring aop模块实现的。任何依赖AOP的功能(@Transactional@Secured)都将导致创建代理。

使用代理的另一种情况是动态创建实现。对于CRUDRepository,您只需要实现接口。它的实现是使用相同的代理基础架构动态创建的。

周弘毅
2023-03-14

我的猜测是,您正在两次扫描相同的组件。您的根上下文中可能有一个(用于ContextLoaderListener)和一个用于DispatcherServlet。如果两次扫描相同的类,您最终会出现重复(以及一个代理和一个非代理实例),则为否。

 类似资料:
  • 问题内容: 使用动态代理的用例是什么? 它们与字节码生成和反射有何关系? 有什么推荐的读物吗? 问题答案: 我强烈推荐此资源。 首先,您必须了解什么是代理模式用例。请记住,代理的主要目的是控制对目标对象的访问,而不是增强目标对象的功能。访问控制包括同步,身份验证,远程访问(RPC),惰性实例化(休眠,Mybatis),AOP(事务)。 与静态代理相反,动态代理生成在运行时需要Java反射的字节码。

  • 请解释一下,为什么代理上的自我调用是在目标上执行的,而不是在代理上执行的?如果那是故意的,那为什么?如果代理是通过子类创建的,那么可以在每次方法调用之前执行一些代码,甚至在自我调用时也是如此。我试过了,我有自我调用的代理 在这里,每个方法都在代理上调用。为什么在文档中提到在自我调用的情况下应该使用AspectJ?

  • 当我编写一些spring代码时,我使用了带有class和annotation-config的Spring4。我已经声明一个bean将接口实现为组件。我正在尝试制作另一个bean来依赖于它的接口时间。但它不起作用,因为spring抛出一个错误,在该名称中找不到bean。我想这可能是因为只靠和实体类的自动电线工作,但我不知道为什么它会这样设置?有人能解释为什么依赖注释不允许类型自动连接到接口吗? 简单

  • 在我的springbootapp中,我有以下存储库:- 当我运行这个应用程序时。我收到了这个错误:- 启动ApplicationContext时出错。要显示条件报告,请在启用“调试”的情况下重新运行应用程序。2020-12-24 21:09:15 - 应用程序启动失败 说明: com中构造函数的参数0。如何使用Java。演示。存储库。RevisionRepository需要“org”类型的bean