再探Spring IOC

这次做了提纲


下面再来一个case study

case描述:

这是工具类  //bean的配置信息略去

class MyUtil{

 private static UserDao userDao;

 private LogDao logDao;

public static void test(){

 userDao.method1();

}

//set 方法略去 值得一提的是(在Spring 2.5.6) 此时利用IDEA  自动生的 带有static的set方法 无法完成注入 

}

第三方类

Class User{

MyUtil.test();

}

此时按照我最初的预想 应该报一个NPE 错误的

因为思维定势 我觉着User类里 一定要有@resource之类的标签注入一个MyUtil实例  就想不通为什么此时直接通过类Util调用静态方法 UserDao不是空

后来在test方法加断点,此时 userDao非空,而logDao结果很暧昧(即不显示为空也不显示具体值) 

我是这么理解的,在Spring启动的时候  实例化了这个Util Bean 如果按照正常的用法 通过@resource将一个具体的实例和Spring启动时生成的util bean的实例关联再去使用,但是此时调用的是类的静态方法,是不是在Spring实例化初始bean的时候 就把该Bean内部的静态bean和当前的类绑定了呢? 现在是这么理解的 具体依据还没有找到。

结论:

工具类(已经配置为单例bean)内部的静态属性bean是可以在spring启动的时候注入进来的,所以此时可以通过Util.staticMethod() //方法中使用了属性静态bean   这时候不会报NPE

而工具类配置为多例bean的时候,内部的属性bean不会注入,且在调用处, 通过Util.staticMethod()  这个时候方法内部用到的bean 还是空 没有被注入,这个时候可以在调用类中通过@resource 注入Util类,通过实例方法调用staticMethod()  

这也就是所谓的多例bean 在『使用』的时候初始化的一个体现,这里注意体会使用!

posted @ 2017-08-13 17:09  丨核桃牛奶  阅读(132)  评论(0编辑  收藏  举报