Spring Bean
一、Spring的概述
1.1 Spring Bean概念
先说一下Java Bean的概念:
JavaBean其实就是按照一种规范书写的代表实体的Java类。名称中的“Bean”是用于Java的可重用软件组件的惯用叫法。
规范严格意义上需要有一下四点:1)属性私有,2)提供getset方法(public声明,命名符合规范)操作私有属性,3)提供一个无参构造函数,4)实现了Serializable接口。
这些特点使它们有更好的封装性和可重用性。并且可以被序列化(持久化),保存在硬盘或者在网络上传输。
而Spring Bean可以理解成Spring中的Bean,或者说是Spring中的类,而我们可以对这些Bean进行实例化,也就是定义对象。
Spring里面的bean就类似是定义的一个组件,而这个组件的作用就是实现某个功能的,在spring里给定义的bean就是说,我给你了一个更为简便的方法来调用这个组件去实现你要完成的功能。
Spring Bean是事物处理组件类和实体类(POJO)对象的总称,Spring Bean被Spring IOC容器初始化,装配和管理。
1.2 Spring的工厂类
Spring工厂类的创建:
1、BeanFactory和ApplicationContext创建实例的时机不同:前者是在工厂实例化完以后,在调用getBean的时候,才会来创建类的实例,而后者是一加载配置文件的时候就会将配置文件中所有单例模式生成的类全都实例化。
2、ClassPathXmlApplicationContext:类路径下的配置文件
FileSystemXmlApplicationContext: 加载文件系统中的配置文件
3、更多时候使用的是ApplicationContext接口以及他的实现类ClassPathXmlApplicationContext和FileSystemXmlApplicationContext来完成Spring工厂类的创建
/*SpringDemo1.java*/
@Test
/*
ClassPathXmlApplicationContext方式实现
*/
public void demo2(){
//创建Spring的工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过工厂获得类:
UserService userService = (UserService) applicationContext.getBean("userService");
userService.sayHello();
}
@Test
/**
* 读取磁盘系统中的配置文件,FileSystemXmlApplicationContext
*/
public void demo3(){
//创建Spring的工厂类
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("d:\\applicationContext.xml");
//通过工厂获得类:
UserService userService = (UserService) applicationContext.getBean("userService");
userService.sayHello();
}
二、Spring Bean管理——XML方式
2.1 Bean的实例化三种方式
2.1.1 使用类构造器实例化(默认无参数)
/**
* Bean的实例化的三种方式:采用无参数的构造方法的方式
*/
public class Bean1 {
public Bean1(){
System.out.println("Bean1被实例化了...");
}
}
applicationContext.xml:配置id、类
<!--第一种:无参构造器的方式-->
<bean id="bean1" class="com.linmin.ioc.demo2.Bean1"/>
/*SpringDemo2.java*/
@Test
public void demo1(){
// 创建工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 通过工厂获得类的实例:
Bean1 bean1 = (Bean1)applicationContext.getBean("bean1");
}
2.1.2 使用静态工厂方法实例化(简单工厂模式)
/**
* Bean的实例化三种方式:静态工厂实例化方式
*/
public class Bean2 {
}
创建工厂方法:
/**
* Bean2的静态工厂
*/
public class Bean2Factory {
public static Bean2 createBean2(){
System.out.println("Bean2Factory的方法已经执行了...");
return new Bean2();
}
}
applicationContext.xml:配置id、工厂类、工厂方法(factory-method属性)
可以直接调用类的静态方法,不用实例化。
<!--第二种:静态工厂的方式-->
<bean id="bean2" class="com.linmin.ioc.demo2.Bean2Factory" factory-method="createBean2"/>
/*SpringDemo2.java*/
@Test
public void demo2(){
// 创建工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 通过工厂获得类的实例:
Bean2 bean2 = (Bean2)applicationContext.getBean("bean2");
}
2.1.3 使用实例工厂方法实例化(工厂方法模式)
/**
* Bean的实例化三种方式:实例工厂实例化
*/
public class Bean3 {
}
/**
* Bean3的实例工厂
*/
public class Bean3Factory {
public Bean3 createBean3(){
System.out.println("Bean3Factory执行了...");
return new Bean3();
}
}
类中的方法是非静态的,想要调用该方法须先创建一个类对象,再通过对象调用方法。
<!--第三种:实例工厂的方式
配置两个bean:
一个配置id、工厂类
一个配置id、工厂id(factory-bean属性)、工厂类方法(factory-method属性)-->
<bean id="bean3Factory" class="com.linmin.ioc.demo2.Bean3Factory"/>
<bean id="bean3" factory-bean="bean3Factory" factory-method="createBean3"/>
/*SpringDemo2.java*/
@Test
public void demo3(){
// 创建工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 通过工厂获得类的实例:
Bean3 bean3 = (Bean3)applicationContext.getBean("bean3");
}
一般情况下采用第一种方式,当构造比较复杂时采用二三种方法
2.2 Bean的常用配置
2.2.1 Bean的配置
<bean id="bean1" class="com.linmin.ioc.demo2.Bean1"/>
1、一般情况下,装配一个Bean时,通过指定一个id属性作为Bean的名称,id属性在IOC容易中必须是唯一的,如果Bean的名称中含有特殊字符,就需要使用name属性
<bean name="bean1/" class="com.linmin.ioc.demo2.Bean1"/>
2、class用于设置一个类的完全路径名称,主要作用是IOC容器生成类的实例
2.2.1 Bean的作用域
类别 | 说明 |
---|---|
singleton(默认值) | 在SpringIOC容器中仅存在一个Bean实例,Bean以单实例的方式存在 |
prototype | 每次调用getBean()时都会返回一个新的实例(多例) |
request | 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境 |
session | 同一个HTTP Session共享一个Bean,不同的HTTP Session使用不同的Bean。该作用域仅适用于WebApplicationContext环境 |
1、singleton:
<bean id="person" class="com.linmin.ioc.demo3.Person" scope="singleton"/>
此时的scope可以不写,默认即为singleton。
/*SpringDemo3.java*/
@Test
public void demo1(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Person persion1 = (Person)applicationContext.getBean("person");
Person persion2 = (Person)applicationContext.getBean("person");
System.out.println(persion1);
System.out.println(persion2);
}
此时输出的persion1和persion2地址一样,说明为单例模式。
2、prototype:
<bean id="person" class="com.linmin.ioc.demo3.Person" scope="prototype"/>
/*SpringDemo3.java*/
@Test
public void demo1(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Person persion1 = (Person)applicationContext.getBean("person");
Person persion2 = (Person)applicationContext.getBean(<