一,作用:容纳我们开发的各种Bean,并且我们可以从中获取各种发布在Spring IoC容器里的Bean,通过描述得到它。
1.Spring IoC容器的设计主要是基于BeanFactory和ApplicationContext两个接口,其中BeanFactory是容器所定义的最底层接口,而ApplicationContext是其高级接口之一,并且对BeanFactory功能做了许多有用的扩展,所以在绝大部分工作场景下,都会使用ApplicationContext作为Spring IoC容器。
(1)ApplicationContext接口有两个实现类:
ClassPathXmlApplicationContext :加载类路径下Spring的配置文件.
FileSystemXmlApplicationContext :加载本地磁盘下Spring的配置文件.
(2)BeanFactory和ApplicationContext的区别:
BeanFactory :是在getBean的时候才会生成类的实例.
ApplicationContext :在加载applicationContext.xml时候就会创建.
2.SpringIoC容器的初始化和依赖注入
Bean的定义分为三步:
(1)Resource定位:资源定位,通过XML或者注解方式
(2)BeanDefinition的载入:保存定位信息,不会创建Bean实例
(3)BeanDefinition的注册:将信息发布到容器中,此时仍没有对应的bean的实例创建
做完这三步,bean就在容器中被定义了,而没有被初始化和依赖注入;Spring有一个配置选项——lazy-init,其含义就是是否初始化Spring Bean。默认初始化,如果设置为true就只有使用getbean方法获取时才会进行bean的初始化和依赖注入,类似于beanfactory接口的实现。
3.Spring Bean的生命周期
通过配置 < bean > 标签上的init-method作为Bean的初始化的时候执行的方法,配置destroy-method作为Bean的销毁的时候执行的方法。销毁方法想要执行,需要是单例创建的Bean而且在工厂关闭close()的时候,Bean才会被销毁.下面代码观察Spring Bean的生命周期。
(1)xml配置
<!-- 使用bean标签 -->
<bean id="userservice" class="itheima.userserviceimpl"
init-method="init" destroy-method="destroy"/>
(2)初始化和销毁方法:
public void init() {
log.info("执行自定义初始化");
}
public void destroy() {
log.info("执行自定义销毁");
}
(3)测试类:
public void C() {
//创建工厂,加载核心配置文件
ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
//从工厂中获取到对象
userservice usi=(userservice) ac.getBean("userservice");
//调用对象的方法执行
usi.sayhello();
ac.close();
}
(4)输出结果如下:
通过日志可以发现,创建工厂也就是加载配置文件的时候调用了bean的初始化方法,然后执行了sayhello函数,最后工厂的close方法调用了bean的销毁函数。