Spring IOC是为了将类解耦
//创建一个类
public class HelloWorld {
private String name;
public void setName(String name) {
System.out.println("设置属性方法");
this.name = name;
}
public HelloWorld() {
System.out.println("初始化构造器");
}
public void hello() {
System.out.println("hello " + name);
}
}
Spring的核心容器bean
通过XML文件配置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.xsd">
<!--bean配置文件
bean标签:用于spring读取配置文件后创建对象-->
<!--属性:id:对象的唯一标识;class:要创建对象的全限定类名-->
<bean id="helloWorld" class="spring.HelloWorld">
<!-- 设置值-->
<property name="name" value="spring"></property>
</bean>
</beans>
创建spring IOC 容器的两种方式
ApplicationContext
:它是BeanFactory的子对象下的子对象;创建对象时,采用立即加载策略。(当读取完xml配置文件,配置文件中所有的对象都已经创建完成了);适合对象只使用一次,单例模式的场景。
public class ReadBean {
public static void main(String[] args) {
//通过读取类路径下的配置文件,创建spring的IOC容器。要求配置文件必须在类路径下
ApplicationContext ac = new ClassPathXmlApplicationContext("spring-config.xml");
//通过读取文件系统中的配置文件,创建spring容器。要求配置文件在文件系统中即可
//FileSystemXmlApplicationContext:
//从容器中获取bean实例
HelloWorld helloWorld = (HelloWorld) ac.getBean("helloWorld");
//调用方法
helloWorld.hello();
}
}
BeanFactory
:它是Spring IOC容器的顶层接口;创建对象时,采用延迟加载策略(当真正要从容器中获取对象时才会创建),适合使用多次对象的场景。
bean对象的三种创建方式
bean对象,即通过spring创建的类对象
- 通过构造函数创建
默认情况下,在spring配置文件中写了一个bean标签,并提供了class属性,spring就会调用该类的默认构造函数创建对象。如果没有默认构造函数,则对象创建失败。(无构造函数,默认不带参数;如果写了带参数的将没有默认不带参数的构造函数)
<bean id="helloWorld" class="spring.HelloWorld">
//不写构造函数,默认无参数
public HelloWorld(String s) {
System.out.println("初始化构造器");
}
//No default constructor found
- 通过静态工厂创建
工厂类中提供静态方法,返回要使用的bean对象
<!--静态工厂创建
factory-method指定创建bean对象的方法-->
<bean id="staticFactoryHello" class="spring.Factory" factory-method="getBean"></bean>
//静态工厂
public class Factory {
public static IHelloWorld getBean(){
return new HelloWorld();
}
}
//执行
HelloWorld staticFactoryHello = (HelloWorld) ac.getBean("staticFactoryHello");
staticFactoryHello.hello();
- 通过实例工厂创建
工厂类中提供普通方法,返回要使用的bean对象
<!--实例工厂创建
factoty-bean 指定创建bean对象的工厂bean的ID-->
<bean id="instanceFactory" class="spring.InstanceFactory"></bean>
<bean id="instanceFactoryHello" factory-bean="instanceFactory" factory-method="getInstanceBean"></bean>
//实例工厂
public class InstanceFactory {
public IHelloWorld getInstanceBean(){
return new HelloWorld();
}
}
//调试
HelloWorld instanceFactoryHello = (HelloWorld) ac.getBean("instanceFactoryHello");
instanceFactoryHello.hello();
bean对象的作用范围
通过scope
属性设置
<bean id="helloWorld" class="spring.HelloWorld" scope="singleton"></bean>
- singleton:单例的,默认值;在读取配置文件时创建;多次获取仍然是同一个对象。
- prototype:多例的;在每次获取时创建新对象;每次获取都不同。
- request:web项目,一次请求中使用
- session:web项目,一次会话范围
- global-sesssion:web项目,应用在portlet环境,否则相当于session
bean对象的生命周期
在bean对象创建和销毁时,会执行HelloWorld
类中的init()
和destory()
<bean id="helloWorld" class="spring.HelloWorld"
init-method="init" destroy-method="destory"></bean>
-
单例对象
出生:容器创建时
活着:只要容器存在,对象就存在
死亡:容器销毁,对象消亡 -
多例对象
出生:每次从容器中获取对象时,容器创建
活着:只要对象在使用过程中,就一直存在
死亡:当对象长时间不使用,并且没有其他对象引用,由java的垃圾回收器回收