Сделать объект пружиной управляемой - PullRequest
2 голосов
/ 13 марта 2011

Как мне получить управление уже существующей пружиной объекта? Я бы хотел подключить его к Springs AoP возможностям, используя aspectj.Я знаю, что это проблема, поскольку Spring AoP использует динамические прокси, которые, вероятно, создаются вместе с объектом.

Зачем мне это нужно?

У меня есть сторонний класс, который принимает аргумент конструктора, который известен только в runtime , следовательнокажется, я не могу добавить его в свой applicationContext или использовать интерфейс springs FactoryBean для строительства. Есть ли другой способ?

Я уже попробовал следующее без особого успеха:

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

Это может быть подпружиненным, но я до сих пор не могу использовать его для запуска аспектов.


[EDIT] 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 ]

5 голосов
/ 13 марта 2011

Почему бы не создать новый класс, охватывающий функциональность ThirdPartyObj, и сделать , что Spring-managed. Зависимости затем могут быть введены в его поля и параметры метода и переданы экземпляру ThirdPartyObj.

2 голосов
/ 13 марта 2011

Вы должны иметь возможность запускать аспекты, используя это (обратите внимание, что вам нужно использовать возвращаемый объект, который может быть прокси):

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

Другой вариант - объявить его как обычный компонент и передатьаргумент конструктора через getBean():

Obj obj = appContext.getBean("Obj", "runtime constructor arg");     
0 голосов
/ 13 марта 2011

Как насчет аннотирования доменного объекта аннотацией @Configurable?Я сам не пробовал, но похоже, что это может помочь в вашем сценарии.AspectJ и Spring создадут управляемый объект с атрибутами, определенными в bean-компоненте.Затем можно использовать экземпляр созданного объекта.

...