java - 使对象 Spring 管理

标签 java spring aspectj spring-aop autowired

我怎样才能让一个已经存在的对象由 spring 管理?我想使用 aspectj 将它连接到 Springs AoP 功能。我知道这是一个挑战,因为 Spring AoP 使用可能与对象一起创建的动态代理。

我为什么需要这个?

我有一个第三方类,它带有一个仅在运行时中已知的构造函数参数, 因此,我似乎无法将它添加到我的 applicationContext 或使用 spring FactoryBean 接口(interface)进行构造。 还有其他办法吗?

我已经尝试过以下方法但没有取得很大成功:

Obj obj = new ThirdPartyObj("runtime constructor arg");
appContext.getAutowireCapableBeanFactory().initializeBean(obj, "Obj");

可能是 spring 管理的,但我仍然不能用它来触发方面。


[编辑] axtavt 指出问题是我没有使用从 initializeBean(..) 返回的对象。上述两种方法都有效,但前提是:

  • 使用接口(interface) ObjInterface obj = (ObjInterface) ac.getBean("obj", args); 或者我们将得到:

    java.lang.ClassCastException: $Proxy28 无法转换为 com.company.Obj

  • 不使用接口(interface)但启用CGLIB。这需要一个非私有(private)默认构造函数,否则我们将得到:

    java.lang.IllegalArgumentException: 父类(super class)没有空构造函数但没有给出参数

最佳答案

为什么不创建一个包装ThirdPartyObj 功能的新类,并使那个 由Spring 管理。然后可以将依赖项注入(inject)其字段和方法参数,并传递给实例化的 ThirdPartyObj

关于java - 使对象 Spring 管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5288640/

相关文章:

java - 如何在不发生错误的情况下打印堆栈跟踪

java - 根据外键值选择结果

java - 从 eclipse 运行 Java Spring 应用程序

tomcat - 如何在 Tomcat 中使用 AspectJ 加载时间编织? (没有 Spring )

java - 实现与多个 EJB 的接口(interface)

java - 文本到语音(这,这);不起作用

java - 优雅地关闭在 Kubernetes 中运行的 Spring 应用程序

Java Aspect 返回要在方法中使用的值

java - 是否存在类似 Babel 的 Java 编译器?

java - 选择 GWT ComboBox 项显示值而不是文本