我有一个在Spring之外创建的类的实例,我希望能够访问Spring bean,以便它可以触发一个事件并被Spring bean观察到。我没有使用Spring网络,我的应用程序是通过命令行通过spring boot运行的。
答案 0 :(得分:7)
您唯一的选择是使用静态方法公开应用程序的Spring上下文,以便Spring不管理的对象可以使用它来获取所需的托管bean的引用。
从上下文的包装器开始。创建一个常规托管bean,它需要在其构造函数中引用上下文。该引用被分配给一个静态类字段,该字段也有一个静态getter:
@Service
class ContextWrapper {
private static ApplicationContext context;
@Autowired
public ContextWrapper(ApplicationContext ac) {
context = ac;
}
public static ApplicationContext getContext() {
return context;
}
}
使用静态getter访问不受Spring管理的对象中的上下文,并使用上下文中可用的方法引用bean:
SomeBean bean = ContextWrapper.getContext().getBean("someBean", SomeBean.class);
// do something with the bean
您需要的最后一件事是从Spring bean到非托管对象的通信渠道。例如,SomeBean
可以公开一个setter,它将接受非托管对象作为参数,并将引用存储在一个字段中以备将来使用。对象mast使用上面提到的静态上下文访问器获取对托管bean的引用,并使用setter使bean知道它的存在。
@Service
class SomeBean {
// ... your bean stuff
private SomeClass someclass;
public void setSomeClass(Someclass someclass) {
this.someclass = someclass;
}
private void sendEventToSomeClass() {
// communicate with the object not managed by Spring
if (someClass == null) return;
someClass.sendEvent();
}
}
答案 1 :(得分:-1)
你可以通过构造函数注入spring bean,例如:
@Service
class Bean {
...
}
class NotBean {
private Bean bean;
public NotBean(Bean bean) {
this.bean = bean;
}
// your stuff (handle events, etc...)
}