SSM-Spring-SpringIoC容器

SSM-Spring-SpringIoC容器


Spring Ioc容器的设计

​ 该容器设计主要基于BeanFactory和ApplicationContext两个接口,其中ApplicationContext是BeanFactory的子接口之一,也就是说BeanFactory是最底层接口,在绝大部分情况下,都会使用ApplicationContext作为Spring Ioc容器

在这里插入图片描述

在这里插入图片描述

//BeanFactory接口源码
public interface BeanFactory {
    
    
    String FACTORY_BEAN_PREFIX = "&";

    Object getBean(String var1) throws BeansException;

    <T> T getBean(String var1, Class<T> var2) throws BeansException;

    Object getBean(String var1, Object... var2) throws BeansException;

    <T> T getBean(Class<T> var1) throws BeansException;

    <T> T getBean(Class<T> var1, Object... var2) throws BeansException;

    <T> ObjectProvider<T> getBeanProvider(Class<T> var1);

    <T> ObjectProvider<T> getBeanProvider(ResolvableType var1);

    boolean containsBean(String var1);

    boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;

    boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;

    @Nullable
    Class<?> getType(String var1) throws NoSuchBeanDefinitionException;

    @Nullable
    Class<?> getType(String var1, boolean var2) throws NoSuchBeanDefinitionException;

    String[] getAliases(String var1);
}

基本阐述:

  1. getBean:多个方法用于获取配置给Spring Ioc容器的Bean,从参数类型中可以看出可以使字符串,也可以是Class等
  2. isSingletton:用于判断是否是单例
  3. 关于type的匹配,这是一个按java类型匹配的方式
  4. getAliases:获取别名的方法

通过之前果汁的例子认识ApplicationContext的子类ClassPathXmlApplicationContext,先创建XML文件:

<?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.xsd">

    <bean id="source" class="spring.pojo.Source">
        <property name="fruit" value="橙汁"></property>
        <property name="size" value="大杯"></property>
        <property name="sugar" value="少糖"></property>
    </bean>

    <bean id="juiceMaker2" class="spring.pojo.JuiceMake2">
        <property name="beverageShop" value="贡茶"></property>
        <property name="source" ref="source"></property>
    </bean>
</beans>

定义了两个Bean,这样Spring Ioc容器初始化就能找到他们,然后使用ClassPathXmlApplicationContext容器就可以将其初始化


      ApplicationContext ctx=new ClassPathXmlApplicationContext("Spring/spring01.xml");
      JuiceMake2 juiceMake2 = (JuiceMake2) ctx.getBean("juiceMaker2");
      System.out.println(juiceMake2.makeJuice());


Spring Ioc容器的初始化和依赖注入

​ Bean的初始化和依赖注入在Spring Ioc容器中是两大步骤,他是初始化之后,才会进行依赖注入

​ Bean的初始化分三步:

  1. Resource定位:Spring Ioc根据开发者配置,进行资源定位,在Spring的开发中,通过XML或注解是常见方法,定位内容由开发者提供
  2. BeanDefinition的载入:是Spring 根据开发者配置获取对应POJO用于生成对应实例的过程
  3. BeanDefinition的注册:通过BeanDefinition载入的POJO往Spring Ioc容器中注册,这样开发人员和测试人员可以通过描述从中获取Spring Ioc容器的Bean

这三步完成后,Bean 就在Spring Ioc得到初始化,但没有完成依赖注入,就是没有注入配置的资源给Bean。对于依赖注入,Spring Bean还有一个配置选项,lazy-init,其含义是是否初始化Bean(默认default,实际值false),也就是SpringIoc会自动初始化Bean,如果设置为true,则只会当我们使用getBean方法获取它,才会进行初始化,完成依赖注入


Spring Bean的生命周期

​ 主要为了解Spring Ioc容器初始化和销毁Bean的过程

在这里插入图片描述

生命周期步骤:

  • 如果Bean实现类接口BeanNameAware 的setBeanName方法,那么它会调用这个方法
  • 如果Bean实现类接口BeanFactoryAware 的setBeanFactory 方法,那么它会调用这个方法
  • 如果Bean实现类接口ApplicationContextAware 的setApplicationContext 方法,且容器必须是一个ApplicationContext 接口的实现类,才会调用这个方法,否则不调用
  • 如果Bean实现类接口BeanPostProcessor 的postProcessBeforelnitialization 方法,那么它会调用这个方法
  • 如果Bean实现类接口BeanFactoryPostProcessor的afterPropertiesSet方法,那么它会调用这个方法
  • 如果Bean自定义了初始化方法,它就会调用已定义的初始化方法
  • 如果Bean实现类接口BeanPostProcessor的postProcessAfterlnitialization方法,完成了这些调用,这个Bean就完成了初始化,那么Bean就生存在SpringIoc容器中,使用者就可以从中获取Bean服务

如果遇到服务器正常关闭,或其他关闭Spring Ioc的事件,他会调用对应的方法完成Bean的销毁:

  • 如果Bean实现接口DisposableBean的destoroy方法,就会调用他
  • 如果定义了自定义方法,那么就调用它

服务

如果遇到服务器正常关闭,或其他关闭Spring Ioc的事件,他会调用对应的方法完成Bean的销毁:

  • 如果Bean实现接口DisposableBean的destoroy方法,就会调用他
  • 如果定义了自定义方法,那么就调用它

猜你喜欢

转载自blog.csdn.net/weixin_43958223/article/details/114980012