使对象弹簧管理
如何管理已存在的对象弹簧? 我想使用aspectj
将它连接到Springs AoP
function。 我知道这是一个挑战,因为Spring AoP
使用可能与对象一起创建的动态代理。
我为什么需要这个?
我有一个第三方类,它接受一个只在运行时知道的构造函数参数,因此我似乎无法将它添加到我的applicationContext
或使用spring FactoryBean
接口进行构造。 还有别的办法吗?
我已经尝试了以下但没有取得很大的成功:
Obj obj = new ThirdPartyObj("runtime constructor arg"); appContext.getAutowireCapableBeanFactory().initializeBean(obj, "Obj");
它可能是弹簧管理的,但我仍然不能用它来触发方面。
[编辑] axtavt指出问题是我不使用从initializeBean(..)
返回的对象。 提到的两种方法都有效,但前提是:
-
使用接口
ObjInterface obj = (ObjInterface) ac.getBean("obj", args);
或者我们会得到一个:java.lang.ClassCastException: $Proxy28 cannot be cast to com.company.Obj
-
不使用接口但启用
CGLIB
。 这需要一个非私有的默认构造函数,否则我们将获得:java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
您应该能够使用此方法触发方面(请注意,您需要使用可以作为代理的返回对象):
Obj obj = new ThirdPartyObj("runtime constructor arg"); obj = appContext.getAutowireCapableBeanFactory().initializeBean(obj, "Obj");
另一个选择是将它声明为常规bean并通过getBean()
传递构造函数参数:
Obj obj = appContext.getBean("Obj", "runtime constructor arg");
为什么不创建一个包装ThirdPartyObj
function的新类,并使Spring管理。 然后可以将依赖项注入其字段和方法参数,并在实例化的ThirdPartyObj
上传递。
如何用@Configurable注释注释域对象? 我自己没有尝试过,但似乎它可能对你的情况有帮助。 AspectJ和Spring将创建一个托管对象,其中包含在bean中定义的属性。 可以使用随后创建的对象实例。