再探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 在『使用』的时候初始化的一个体现,这里注意体会使用!