Spring-IoC容器

Spring IoC容器的简单总结

IoC容器

控制反转,即new实例工作不再由程序员完成,而是交给Spring容器去做

Spring IoC容器

  • BeanFactory
  • ApplicationContext

ApplicationContext

ApplicationContext是一个接口,也被称为Spring的上下文

ApplicationContext包含BeanFactory的全部功能

ApplicationContext有三种常见的接口实现:

  • FileSystemXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你需要提供给构造器 XML 文件的完整路径
  • ClassPathXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你不需要提供 XML 文件的完整路径,只需正确配置 CLASSPATH 环境变量即可,因为,容器会从 CLASSPATH 中搜索 bean 配置文件
  • WebXmlApplicationContext:该容器会在一个 web 应用程序的范围内加载在 XML 文件中已被定义的 bean

Spring Bean

Spring Bean定义

Bean定义

bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象。这些 bean 是由用容器提供的配置元数据创建的

bean 定义包含称为配置元数据的信息,下述容器也需要知道配置元数据:

  • 如何创建一个 bean
  • bean 的生命周期的详细信息
  • bean 的依赖关系

上述所有的配置元数据转换成一组构成每个 bean 定义的下列属性。

属性 描述
class 这个属性是强制性的,并且指定用来创建 bean 的 bean 类。
name 这个属性指定唯一的 bean 标识符。在基于 XML 的配置元数据中,你可以使用 ID 和/或 name 属性来指定 bean 标识符。
scope 这个属性指定由特定的 bean 定义创建的对象的作用域。
constructor-arg 它是用来注入依赖关系的。
properties 它是用来注入依赖关系的。
autowiring mode 它是用来注入依赖关系的。
lazy-initialization mode 延迟初始化的 bean 告诉 IoC 容器在它第一次被请求时,而不是在启动时去创建一个 bean 实例。
initialization 方法 在 bean 的所有必需的属性被容器设置之后,调用回调方法。
destruction 方法 当包含该 bean 的容器被销毁时,使用回调方法。

Bean与Spring的关系

  • Bean配置文件(XML、注解等)被IoC容器读取后在容器内生成Bean定义注册表
  • 容器根据定于注册表访问Bean实现类生成Bean实例,并放入容器中的Bean缓存池内
  • 应用程序从容器的Bean缓存池中获取实例对象

Spring配置元数据

有三种方式提供给Spring容器:

  • 基于 XML 的配置文件
  • 基于注解的配置
  • 基于 Java 的配置

Spring Bean作用域

Bean的作用域

使用scope设置,Spring支持5种作用域

作用域 描述
singleton 在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,默认值
prototype 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean()
request 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境
session 同一个HTTP Session共享一个Bean,不同Session使用不同的Bean,仅适用于WebApplicationContext环境
global-session 一般用于Portlet应用环境,该运用域仅适用于WebApplicationContext环境

Spring Bean的生命周期

Bean 的生命周期

Bean的生命周期可以表达为:Bean的定义——Bean的初始化——Bean的使用——Bean的销毁

为了定义安装和拆卸一个 bean,我们只要声明带有 init-method 和/或 destroy-method 参数的 。init-method 属性指定一个方法,在实例化 bean 时,立即调用该方法。同样,destroy-method 指定一个方法,只有从容器中移除 bean 之后,才能调用该方法

初始化回调

org.springframework.beans.factory.InitializingBean 接口指定一个单一的方法:

1
void afterPropertiesSet() throws Exception;

因此,你可以简单地实现上述接口和初始化工作可以在 afterPropertiesSet() 方法中执行,如下所示:

1
public class ExampleBean implements InitializingBean {
2
   public void afterPropertiesSet() {
3
      // do some initialization work
4
   }
5
}

在基于 XML 的配置元数据的情况下,你可以使用 init-method 属性来指定带有 void 无参数方法的名称。例如:

1
<bean id="exampleBean"
2
         class="examples.ExampleBean" init-method="init"/>

下面是类的定义:

1
public class ExampleBean {
2
   public void init() {
3
      // do some initialization work
4
   }
5
}

销毁回调

org.springframework.beans.factory.DisposableBean 接口指定一个单一的方法:

1
void destroy() throws Exception;

因此,你可以简单地实现上述接口并且结束工作可以在 destroy() 方法中执行,如下所示:

1
public class ExampleBean implements DisposableBean {
2
   public void destroy() {
3
      // do some destruction work
4
   }
5
}

在基于 XML 的配置元数据的情况下,你可以使用 destroy-method 属性来指定带有 void 无参数方法的名称。例如:

1
<bean id="exampleBean"
2
         class="examples.ExampleBean" destroy-method="destroy"/>

下面是类的定义:

1
public class ExampleBean {
2
   public void destroy() {
3
      // do some destruction work
4
   }
5
}

如果你在非 web 应用程序环境中使用 Spring 的 IoC 容器;例如在丰富的客户端桌面环境中;那么在 JVM 中你要注册关闭 hook。这样做可以确保正常关闭,为了让所有的资源都被释放,可以在单个 beans 上调用 destroy 方法。

建议你不要使用 InitializingBean 或者 DisposableBean 的回调方法,因为 XML 配置在命名方法上提供了极大的灵活性

默认的初始化和销毁方法

如果你有太多具有相同名称的初始化或者销毁方法的 Bean,那么你不需要在每一个 bean 上声明初始化方法销毁方法。框架使用 元素中的 default-init-methoddefault-destroy-method 属性提供了灵活地配置这种情况,如下所示:

1
<beans xmlns="http://www.springframework.org/schema/beans"
2
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3
    xsi:schemaLocation="http://www.springframework.org/schema/beans
4
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
5
    default-init-method="init"
6
    default-destroy-method="destroy">
7
8
   <bean id="..." class="...">
9
       <!-- collaborators and configuration for this bean go here -->
10
   </bean>
11
12
</beans>

Spring Bean后置处理器

待补

Spring Bean定义继承

通过设置parent可以使子Bean继承父Bean的配置信息

参考资料

https://www.w3cschool.cn/wkspring/f8pc1hae.html

  • © 2020 QSH
  • Powered by Hexo Theme Ayer
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信