使对象弹簧管理

时间:2011-03-13 09:55:02

标签: java spring aspectj spring-aop autowired

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

为什么我需要这个?

我有一个第三方类,它接受一个只在 runtime 中知道的构造函数参数, 因此我似乎无法将其添加到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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

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

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

另一个选择是将它声明为常规bean并通过getBean()传递构造函数参数:

Obj obj = appContext.getBean("Obj", "runtime constructor arg");     

答案 2 :(得分:0)

如何用@Configurable注释注释域对象?我自己没有尝试过,但似乎它可能对您的情况有所帮助。 AspectJ和Spring将创建一个托管对象,其中包含在bean中定义的属性。可以使用随后创建的对象实例。