如果我有一个由Spring创建和管理的jdbcTemplate之类的东西,我能否接受该引用并将其传递给非Spring托管类?
如果可以的话,@ PreDestory之类的生命周期方法如何知道现在是否存在Spring尚不了解的这些额外引用?
答案 0 :(得分:0)
spring管理的单个bean保留在应用程序上下文中。 您可以将“应用程序上下文”视为一个映射,该映射将“ id”之类的键存储到本质上是对您拥有的bean的引用的对象。
现在,您可以轻松地将对bean的引用传递给不受spring管理的某个对象。
类NonManagedBySpring { 私人JdbcTemplate tpl; 公共NonManagedBySpring(JdbcTemplate tpl){ this.tpl = tpl; }
public void bar() {
...
tpl.execute // or whatever
}
}
@Service // this is a spring managed service
class MyService {
@Autowired // or constructor injection, doesn't matter for the sake of this example
private JdbcTemplate tpl;
public void foo() {
NonManagedBySpring obj = new NonManagedBySpring (tpl);
obj.bar();
}
}
现在,从生命周期的角度来看,NonManagedBySpring
保留对JdbcTemplate
对象(即bean)的引用并不重要。
应调用@PreDestroy
时,spring检查ApplicationContext
中的引用,由于正如我在答案开头所说的那样,存在对单例bean的引用-spring将找到这些对象并在其上调用“销毁”。
值得一提的是,如果bean的作用域为“原型”,那么它将不会保存在Application Context中,并且它的@PreDestroy
也不会被调用,但这与它无关托管/非托管对象。弹簧就是这样。