我没有三颗心脏:Spring(2)——Spring IoC 详解
BeanFactory
主要基于一下两个接口
-
BeanFactory
-
ApplicationContext ApplicationContext是BeanFactory的子接口之一,且对BeanFactory做了许多功能扩展,在大部分场景下都会使用ApplicationContext作为SpringIoc容器
图中可以看出BeanFactory作为最顶层,提供了SpringIOC最底层的设计,如下图该类中的方法:

-
getBean:对应多个方法来获取配置给Spring IoC容器的bean
1,按照类型拿 bean:
IUserService user = (IUserService) factory.getBean(UserServiceImpl.class);
注意:此方式要求在Spring中只配置了一个这种类型的实例,否则报错(如果多个Spring,不知选取哪一个)2,按照bean名字拿 bean:
IUserService user = (IUserService) factory.getBean("userService");
注意:该方法不太安全,IDE不会检查其安全性(关联性)2,按照bean类型和名字拿 bean:(推荐)
IUserService user = (IUserService) factory.getBean("userService",UserServiceImpl.class); -
isSingleton:用于判断是否为单列,如果判断为真,其意思是该bean在容器中是作为一个唯一单列存在的。而isPrototype则反之,如果判断为真,则是从容器中获取bean,容器就会为你生成一个新的bean的实例
注意:在默认情况下 前者为true后者为false -
关于type的匹配,这是按照java类型匹配的方式
-
getAliases:是获取别名的方法
ApplicationContext是BeanFactory子接口,扩展了许多功能,所以作为SpringIoc容器,下面来认识ApplicationContext的子类ClassPathXmlApplicationContext
bean.xml
<bean id="userService" class="com.jie.service.UserServiceImpl">
<!-- 依赖注入数据,调用属性的set方法 -->
<property name="name" value="zhangsan"></property>
</bean>
这里定义了bean,这样SpringIoc容器在初始化的时候就能找到他们,然后用ClassPathXmlApplicationContext容器就可以将其实例化
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
IUserService user = (IUserService) context.getBean("userService");
user.add();
如此就会使用Appliction的实现类ClassPathXmlApplicationContext去初始化SpringIoc容器,然后即可通过IoC容器去获取资源了
Application常见的实现类
1.classPathXmlApplicationContext: 类路径加载
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
2.FileSystemXmlApplicationContext: 文件系统路径加载
ApplicationContext context = new FileSystemXmlApplicationContext("C:\\IDEAWorkspace\\springDemo\\src\\com\\jie\\beans.xml");
3.XmlWebApplicationContext: 专门为web应用准备的,从相对于Web根目录的路径中装载配置文件完成初始化。
XmlWebApplicationContext ac = new XmlWebApplicationContext(); // 这时并没有初始化容器
ac.setServletContext(servletContext); // 需要指定ServletContext对象
ac.setConfigLocation("/WEB-INF/applicationContext.xml"); // 指定配置文件路径,开头的斜线表示Web应用的根目录
ac.refresh(); // 初始化容器
4.AnnotationConfigApplicationContext: 用于基于注解的配置
BeanFactory与ApplicationContext的区别:
- BeanFactory:是Spring最底层接口,提供了最简单IoC容器的功能,负责配置,实例化创建和管理bean而ApplicationContext是Spring的一个更高级的容器,提供了更多的有用的功能
- ApplicationContext提供了国际化功能,消息发送功能,响应机制,统一加载资源的功能,强大的时间机制,支持Aop功能,对web应用的支持等
- 加载方式的区别:BeanFactory采用的是延迟加载的形式来注入Bean;ApplicationContext则相反,是Ioc启动时就一次性创建所有的bean,好处是可以马上发现Spring配置文件中的错误,坏处费用资源