2

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

为什么我需要这个?

我有一个第三方类,它接受一个仅在运行时知道的构造函数参数,因此我似乎无法将它添加到我的applicationContext或使用 springsFactoryBean接口进行构造。还有其他方法吗?

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

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

4

3 回答 3

5

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

于 2011-03-13T10:07:15.007 回答
2

您应该能够使用它来触发方面(请注意,您需要使用可以作为代理的返回对象):

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

另一种选择是将其声明为常规 bean 并通过以下方式传递构造函数参数getBean()

Obj obj = appContext.getBean("Obj", "runtime constructor arg");     
于 2011-03-13T10:13:30.550 回答
0

用@Configurable 注解来注解域对象怎么样?我自己没有尝试过,但似乎它可能对您的场景有所帮助。AspectJ 和 Spring 将创建一个具有在 bean 中定义的属性的托管对象。可以使用随后创建的对象实例。

于 2011-03-13T10:34:41.077 回答