spring提供了多个IOC容器的实现,如xmlBeanFactory(最简单最低级的容器),classPathXmlApplicationContext(高级容器),其中 XmlBeanFactory 就是针对最基本的 IOC 容器的实现, 这个 IOC 容器可以读取 XML 文件定义的 BeanDefinition
class XmlBeanFactory extends DefaultListableBeanFactory
通过xml方式或者annotation方式加载bean信息,使用ioc容器装载bean,一般bean都是单例的
BeanFactory继承体系
image.pngApplicationContext和BeanFactory关系(重要)
ApplicationContext 继承自 BeanFactory,但是它不应该被理解为 BeanFactory 的实现类,而是说其内部持有一个实例化的 BeanFactory(DefaultListableBeanFactory)。以后所有的 BeanFactory 相关的操作其实是委托给这个实例来处理的!之所以选择这个DefaultListableBeanFactory,是因为,他是最强大的BeanFactory!
image.png组件介绍
(1)BeanFactory
树的root根,主要方式就是根据bean名称从容器中获取单个bean,提供了最基础的功能,其他功能通过继承或者实现该顶层接口做扩展
image.png
(2)ListableBeanFactory
image.pngExtension of the {@link BeanFactory} interface to be implemented by bean factories that can enumerate all their bean instances, rather than attempting bean lookup by name one by one as requested by clients.
{@link BeanFactory}接口的扩展将由bean工厂实现可以枚举其所有bean实例,而不是按客户的要求按名称尝试查找bean。
由上面的该接口的源码文档注释的这句话可以看出来,这个接口可以获得多个bean对象,而BeanFactory接口只可以获取单个bean对象。
该接口还具有可以判断容器中是否包含指定的bean,以及根据bean类型获取所有的bean,返回容器中bean的个数等功能
(3)HierarchicalBeanFactory
Hierarchical /ˌhaɪəˈrɑːkɪkl/ adj. 分层的
非常重要的接口,通过该接口,spring实现了具有父子层级关联关系的IOC容器体系,子容器可以访问父容器中的bean,父容器无法访问子容器中的bean,父子容器在spring中使用非常广泛,比如spring mvc中的controller层所有的bean都位于一个子容器中,service和mapper层的所有的bean都位于父容器中,因此所有的controller层bean(UserController,RoleController)都可以引用service和mapper层的bean(UserService,RoleService,UserMapper,RoleMapper),而service和mapper层bean却无法访问controller层bean
image.png
(4)AutowireCapableBeanFactory
作用在于整合其它框架:能让Spring管理的Bean去按某种规则(如按名字匹配、按类型匹配等)装配和填充那些不被Spring托管的bean实例(wire and populate existing bean instances that Spring does not control the lifecycle of),比如我们有一个工具类,并不想加注解@component交给spring去管理,但是我们工具类里面可能还需要注入@value比如一些接口的某个环境的地址,或者service,mapper,如果我们自己直接创建这个对象,打印这个属性肯定是null,但是我们使用这个类就可以很强大的获取到注入的东西
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<bean id="myTestBean" class="com.jerrysong.springlearn.MyTestBean"></bean>
</beans>
@Data
public class School {
private MyTestBean myTestBean;
private String name;
}
@Test
public void test1(){
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring-test.xml");
AutowireCapableBeanFactory autowireCapableBeanFactory = context.getAutowireCapableBeanFactory();
School school = (School) autowireCapableBeanFactory.createBean(School.class, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, false);
System.out.println(school.getMyTestBean());
}
image.pngNote that this interface is not implemented by {@link org.springframework.context.ApplicationContext} facades,as it is hardly ever used by application code. That said, it is available from an application context too, accessible through ApplicationContext's {@link org.springframework.context.ApplicationContext#getAutowireCapableBeanFactory()} method.
因为应用程序代码几乎从未使用过该接口,因此ApplicationContext类并未实现它,如果要用,使用ApplicationContext类的getAutowireCapableBeanFactory方法
核心组件
BeanFactory(接口)=>DefaultListableBeanFactory(底层实现类)
底层实现类属性
spring bean的生命周期
bean就是spring管理的对象
过程:class-> 对象-> 填充属性-> 放到单例池-> bean对象
网友评论