spring入门——IOC容器
1.IoC 容器介绍
- Spring容器是Spring框架的核心,容器将创建对象,把它们连在一起,配置它们,并且管理它们整个生命周期从创建到销毁。Spring容器使用依赖注入(DI)来管理应用程序的组件,这些对象称为Spring Beans.
- IOC容器具有依赖注入的功能,它可以创建对象,IOC 容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。通常new一个实例,控制权由程序员控制,而"控制反转"是指new实例工作不由程序员来做而是交给Spring容器来做。在Spring中BeanFactory是IOC容器的实际代表者。
2.Spring 的 BeanFactory 容器
-
BeanFactory是最简单的容器,主要功能是为依赖注入提供支持。这个容器接口在 org.springframework.beans.factory.BeanFactor 中被定义。
例子:
第一步,创建一个 HelloWord.java文件
package com.zq;
public class HelloWord {
private String message;
public void setMessage(String message) {
this.message = message;
}
public void getMessage() {
System.out.println("Your Message :" + message);
}
}
第二步,创建一个 MainApp.java文件
package com.zq;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class MainApp {
public static void main(String[] args) {
XmlBeanFactory factory = new XmlBeanFactory = (new ClassPathResource("Beans.xml"));
HelloWorld obj = (HelloWorld) factory.getBean("helloWorld");
obj.getMessage();
}
}
第三步,在resources下建立Beans.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-3.0.xsd">
<bean id="helloWorld" class="com.zq.HelloWorld">
<property name="message" value="Hello World!"/>
</bean>
</beans>
输出控制台结果:
Your Message : Hello World!
3.Spring ApplicationContext 容器
- Application Context 是 BeanFactory 的子接口,也被成为 Spring 上下文。
Application Context 是 spring 中较高级的容器。和 BeanFactory 类似,它可以加载配置文件中定义的 bean,将所有的 bean 集中在一起,当有请求的时候分配 bean。 这个容器在 org.springframework.context.ApplicationContext interface 接口中定义。
ApplicationContext 包含 BeanFactory 所有的功能,一般情况下,相对于 BeanFactory,ApplicationContext 会更加优秀。当然,BeanFactory 仍可以在轻量级应用中使用,比如移动设备或者基于 applet 的应用程序。
例子:
第一步,创建一个 HelloWord.java文件
package com.zq;
public class HelloWord {
private String message;
public void setMessage(String message) {
this.message = message;
}
public void getMessage() {
System.out.println("Your Message :" + message);
}
}
第二步,创建一个 MainApp.java文件
package com.zq;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = ApplicationContext ClassPathResource("Beans.xml"));
HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
obj.getMessage();
}
}
第三步,在resources下建立Beans.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-3.0.xsd">
<bean id="helloWorld" class="com.zq.HelloWorld">
<property name="message" value="Hello World!"/>
</bean>
</beans>
输出控制台结果:
Your Message : Hello World!
4.Spring中Bean的定义
- 被称作bean的对象是应用程序的支柱也是有Spring IOC容器管理的,bean是一个实例化的,组装,并通过Spring IOC容器管理的对象,这些bean是由容器提供的元数据创建的。bean 定义包含称为配置元数据的信息,下述容器也需要知道配置元数据:
- 如何创建一个 bean
- bean 的生命周期的详细信息
- bean 的依赖关系
属性 | 描述 |
---|---|
class | 这个属性是强制性的,并且指定用来创建 bean 的 bean 类。 |
name | 这个属性指定唯一的 bean 标识符。在基于 XML 的配置元数据中,你可以使用 ID 和/或 name 属性来指定 bean 标识符。 |
scope | 这个属性是指由特定bean定义创建对象的作用域 |
constructor | 用来注入依赖关系的 |
lazy-initializations | 延迟初始化的 bean 告诉 IoC 容器在它第一次被请求时,而不是在启动时去创建一个 bean 实例。 |
initialization 方法 | 在 bean 的所有必需的属性被容器设置之后,调用回调方法 |
destruction 方法 | 当包含该 bean 的容器被销毁时,使用回调方法。 |
5.Spring Bean的作用域
- 当在spring中声明一个bean时,必须得声明bean的作用域选项。例如,为了强制spring每次在需要的时候都要产生一个新的bean实例,作用域必须得声明为prototype。如果想要spring每次需要的时候返回原来的bean实例,作用域必须得声明为singleton,singleton 是默认的作用域。
- Spring 框架支持以下五个作用域,分别为singleton、prototype、request、session和global session,5种作用域说明如下所示,
作用域 | 描述 |
---|---|
singleton | 在IOC容器仅存在一个Bean实例,默认值 |
prototype | 每次从容器调用Bean时,都会产生一个新的bean实例,即每次调用getBean()时,相当于执行newXxxBean() |
request | 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境 |
session | 同一个HTTP Session共享一个Bean,不同Session使用不同的Bean,仅适用于WebApplicationContext环境 |
global-session | 一般用于Portlet应用环境,该运用域仅适用于WebApplicationContext环境 |
这里只演示一个单例模式:
第一步,创建一个 HelloWord.java文件
package com.zq;
public class HelloWord {
private String message;
public void setMessage(String message) {
this.message = message;
}
public void getMessage() {
System.out.println("Your Message :" + message);
}
}
第二步,创建一个 MainApp.java文件
package com.zq;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
HelloWorld objA = (HelloWorld) context.getBean("helloWorld");
objA.setMessage("I'm object A");
objA.getMessage();
HelloWorld objB = (HelloWorld) context.getBean("helloWorld");
objB.getMessage();
}
}
第三步,在resources下建立Beans.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-3.0.xsd">
<bean id="helloWorld" class="com.zq.HelloWorld" scope = "singleton">
<property name="message" value="Hello World!"/>
</bean>
</beans>
结果:
Your Message : I'm object A
Your Message : I'm object A