Spring IOC
Spring IOC 有两个主要容器:
ApplicationContext (接口)
常用的三个实现类:
- FileSystemXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你需要提供给构造器 XML 文件的完整路径,相对路径也可以。
ApplicationContext context = new FileSystemXmlApplicationContext("D:/qwq/eclipse--workspaces7-test-4月2日/SpringExample/src/Beans.xml");
-
ClassPathXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你不需要提供 XML 文件的完整路径,只需正确配置 CLASSPATH 环境变量即可,因为,容器会从 CLASSPATH 中搜索 bean 配置文件。
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
- WebXmlApplicationContext:该容器会在一个 web 应用程序的范围内加载在 XML 文件中已被定义的 bean。
BeanFactory (接口)
接口中最常用的是XmlBeanFactory 这个实现类
XmlBeanFactory factory = new XmlBeanFactory (new ClassPathResource("Beans.xml"));
总结
ApplicationContext 包含了 BeanFactory 所有的功能,但是做小程序或者移动端可以用 BeanFactory 因为它的数据量和速度是显著。
Bean 定义
属性 | 描述 |
---|---|
class | 这个属性是强制性的,并且指定用来创建 bean 的 bean 类。 |
name | 这个属性指定唯一的 bean 标识符。在基于 XML 的配置元数据中,你可以使用 ID 和/或 name 属性来指定 bean 标识符。 |
scope | 这个属性指定由特定的 bean 定义创建的对象的作用域,它将会在 bean 作用域的章节中进行讨论。 |
constructor-arg | 它是用来注入依赖关系的,并会在接下来的章节中进行讨论。 |
properties | 它是用来注入依赖关系的,并会在接下来的章节中进行讨论。 |
autowiring mode | 它是用来注入依赖关系的,并会在接下来的章节中进行讨论。 |
lazy-initialization mode | 延迟初始化的 bean 告诉 IoC 容器在它第一次被请求时,而不是在启动时去创建一个 bean 实例。 |
initialization 方法 | 在 bean 的所有必需的属性被容器设置之后,调用回调方法。它将会在 bean 的生命周期章节中进行讨论。 |
destruction 方法 | 当包含该 bean 的容器被销毁时,使用回调方法。它将会在 bean 的生命周期章节中进行讨论。 |
<?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-3.0.xsd"> <!-- 一个简单的bean定义 --> <bean id="..." class="..."> <!-- 这个bean的配置 --> </bean> <!-- A bean definition with lazy init set on --> <bean id="..." class="..." lazy-init="true"> <!-- 这个bean的配置 --> </bean> <!-- 带有初始化方法的bean --> <bean id="..." class="..." init-method="..."> <!-- 这个bean的配置 --> </bean> <!-- 带有销毁方法的bean --> <bean id="..." class="..." destroy-method="..."> <!-- 这个bean的配置 --> </bean> <!-- 。。。 --> </beans>
bean 的作用域
scope:属性
作用域 | 描述 |
---|---|
singleton | 单例模式 |
prototype | 非单例模式 |
request | 该作用域将 bean 的定义限制为 HTTP 请求。只在 web-aware Spring ApplicationContext 的上下文中有效。 |
session | 该作用域将 bean 的定义限制为 HTTP 会话。 只在web-aware Spring ApplicationContext的上下文中有效。 |
global-session | 该作用域将 bean 的定义限制为全局 HTTP 会话。只在 web-aware Spring ApplicationContext 的上下文中有效。 |
<!-- 单利模式的bean --> <bean id="..." class="..." scope="singleton"> <!-- 配置 --> </bean>
Bean 的生命周期
init-method 属性指定一个方法,在实例化 bean 时,立即调用该方法。同样,destroy-method 指定一个方法,只有从容器中移除 bean 之后,才能调用该方法。
<bean id="..." class="..." init-method="init" destroy-method="destroy"> </bean>
inti 和 destroy 都是方法。
context.registerShutdownHook(); 它将确保正常关闭,并且调用相关的 destroy 方法。
默认的初始化和销毁方法
如果你有太多具有相同名称的初始化或者销毁方法的 Bean,那么你不需要在每一个 bean 上声明初始化方法和销毁方法。框架使用 元素中的 default-init-method 和 default-destroy-method 属性提供了灵活地配置这种情况,如下所示:
<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-3.0.xsd" default-init-method="init" default-destroy-method="destroy"> <bean id="..." class="..."> <!-- collaborators and configuration for this bean go here --> </bean> </beans>
Bean 后置处理器
实现了 BeanPostProcessor 接口的类。
类实现 postProcessBeforeInitialization 和 postProcessAfterInitialization 这两个方法
package com.qie_zi; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; public class InitHelloWorld implements BeanPostProcessor { public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("第一个B : " + beanName); return bean; } public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("第一个A : " + beanName); return bean; } }
然后把这个类在Beans.xml中注册一下,运行时,就会自动调用到这两个方法
Bean 定义继承
parent :要继承的父类。
此继承和Java类中继承的效果相同
<?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-3.0.xsd"> <bean id="helloWorld" class="com.tutorialspoint.HelloWorld"> <property name="message1" value="Hello World!"/> <property name="message2" value="Hello Second World!"/> </bean> <bean id="helloIndia" class="com.tutorialspoint.HelloIndia" parent="helloWorld"> <property name="message1" value="Hello India!"/> <property name="message3" value="Namaste India!"/> </bean> </beans>