有一个接口类Animal,如下:
public interface Animal {
}
接口类Animal有一个实现类Cat,如下:
import org.springframework.stereotype.Service;
@Service
public class Cat implements Animal {
public Cat() {
System.out.println("延迟依赖注入");
}
}
有一个测试依赖注入的类,注入了Animal,如下:
启动项目,运行结果如下:
会发现输出了【延迟依赖注入】,这说明在启动项目时,Cat类实例就已经完成了初始化,被注入到了Spring IoC容器中了。
那么怎么做懒加载,让Cat类一开始不要初始化和注入,使用时才构造实例和依赖注入,@ComponentScan注解有提供这么一个功能,这个注解的主要作用是扫描指定的包路径,找到需要被Ioc容器管理的类,它里面有个属性lazyInit,允许boolean值,默认为false,配合上这个属性,可以实现懒加载的逻辑。
给@ComponentScan注解加上lazyInit,值为true,如下:
然后给接口测试类加上相应的接口做懒加载测试,如下:
重启服务,启动日志如下:
没有再输出【延迟依赖注入】了。
接着浏览器调用接口,输出结果如下:
以上输出结果说明在真正要使用Cat实例时,Spring IoC才帮我我们完成初始化和依赖注入的工作,实现了初始化化和依赖注入的懒加载。
总结
至于为什么Spring IOC默认使用的是饿汉式加载,个人理解是把一些耗时的操作放在项目启动的时候,可以节省业务操作的时间,用户的体验会更好。