将对Spring托管bean的引用传递给非托管类?

时间:2019-06-24 03:00:51

标签: java spring

如果我有一个由Spring创建和管理的jdbcTemplate之类的东西,我能否接受该引用并将其传递给非Spring托管类?

如果可以的话,@ PreDestory之类的生命周期方法如何知道现在是否存在Spring尚不了解的这些额外引用?

1 个答案:

答案 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也不会被调用,但这与它无关托管/非托管对象。弹簧就是这样。