目录
一、Bean的配置
Spring可以看作一个大型工厂,生产和管理Spring容器中的Bean。如何使用这个工厂生产和管理Bean,需要开发者将Bean配置在Spring的配置文件中。Spring框架支持XML和Properties两种格式的配置文件,在实际开发中,常用XML格式的配置文件。
二、Bean的实例化
Spring框架实例化Bean有三种方式:构造方法实例化、静态工厂实例化和实例工厂实例化(其中,最常用的实例方法是构造方法实例化)。
1、构造方法实例化
在Spring框架中,Spring容器可以调用Bean对应类中无参数构造方法来实例化Bean,这种方式称为构造方法实例化。
(1).创建Web应用SpringBean
(2).创建BeanClass类
在SpringBean的src目录下,创建instance包,并在该包中创建BeanClass类,代码如下:
package instance;
public class BeanClass {
public String message;
public BeanClass() {
message = "构造方法实例化Bean";
}
public BeanClass(String s) {
message = s;
}
}
(3).创建配置文件
在SpringBean的src目录下,创建Spring的配置文件applicationContext.xml,在配置文件中定义一个id为constructorInstance的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 id="constructorInstance" class="instance.BeanClass"/>
</beans>
(4).创建测试类
在SpringBean的src目录下,创建test包,并在该包下创建测试类TestInstance,代码如下:
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import instance.BeanClass;
public class TestInstance {
public static void main(String[] args) {
//初始化Spring容器ApplicationContext,加载配置文件
ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
//测试构造方法实例化Bean
BeanClass b1 = (BeanClass)appCon.getBean("constructorInstance");
System.out.println(b1+ b1.message);
}
}
结果:
2、静态工厂实例化
使用静态工厂实例化Bean时,要求开发者在工厂类中创建一个静态方法来创建Bean的实例。配置Bean时,class属性指定静态工厂类,同时还需要使用factory-method属性指定工厂类中的静态方法。
(1).创建工厂类BeanStaticFactory
在instance包中,创建工厂类BeanStaticFactory,该类中有个静态方法来实例化对象,具体代码如下:
package instance;
public class BeanStaticFactory {
private static BeanClass beanInstance = new BeanClass("调用静态工厂方法实例化Bean");
public static BeanClass createInstance() {
return beanInstance;
}
}
(2).编辑配置文件
在配置文件applicationContext.xml中,添加如下配置代码:
<!-- 静态工厂方法实例化Bean,createInstance为静态工厂类BeanStaticFactory中的静态方法-->
<bean id="staticFactoryInstance" class="instance.BeanStaticFactory" factory-method="createInstance"/>
(3).添加测试代码
在测试类TestInstance中,添加如下代码:
//测试静态工厂方法实例化Bean
BeanClass b2 = (BeanClass)appCon.getBean("staticFactoryInstance");
System.out.println(b2 + b2.message);
结果:
3、实例工厂实例化
使用实例工厂实例化Bean时,要求开发者在工厂类中创建一个实例方法来创建Bean的实例。配置Bean时,需要使用factory-bean属性指定配置的实例工厂,同时还需要factory-method属性指定实例工厂中的实例方法。
(1).创建工厂类BeanInstanceFactory
在instance包中,创建工厂类BeanInstanceFactory,该类中有个实例方法来实例化对象,具体代码如下:
package instance;
public class BeanInstanceFactory {
public BeanClass createBeanClassInstance() {
return new BeanClass("调用实例工厂方法实例化Bean");
}
}
(2).编辑配置文件
在配置文件applicationContext.xml中,添加如下配置代码:
<bean id="myFactory" class="instance.BeanInstanceFactory"/>
<!-- 使用factory-bean属性指定配置工厂 ,
使用factory-method属性指定使用工厂中哪个方法实例化Bean-->
<bean id="instanceFactoryInstance" factory-bean="myFactory" factory-method="createBeanClassInstance"/>
(3).添加测试代码
在测试类TestInstance中,添加如下代码:
//测试实例工厂方法实例化Bean
BeanClass b3 = (BeanClass)appCon.getBean("instanceFactoryInstance");
System.out.println(b3 + b3.message);
结果:
三、Bean的作用域
作用域名称 | 描述 |
singleton | 默认的作用域,使用singleton定义的Bean在Spring容器中只有一个Bean实例。 |
prototype | Spring容器每次获取prototype定义的Bean,容器都将创建一个新的Bean实例。 |
request | 在一次HTTP请求中容器将返回一个Bean实例,不同的HTTP请求返回不同的Bean实例。 仅在Web Spring应用程序上下文中使用。 |
session | 在一个HTTP Session中,容器将返回同一个Bean实例。仅在Web Spring应用程序上下文中 使用。 |
application | 为每个ServletContext对象创建一个实例,即同一个应用共享一个Bean实例。 仅在Web Spring应用程序上下文中使用。 |
websocket | 为每个WebSocket对象创建一个Bean实例。仅在Web Spring应用程序上下文中使用。 |
1、singleton作用域
当将bean的scope设置为singleton时,Spring IoC容器仅生成和管理一个Bean实例。使用id或name获取Bean实例时,IoC容器将返回共享的Bean实例。
2、prototype作用域
当bean的scope设置为prototype时,Spring IoC容器将为每次请求创建一个新的实例。
四、Bean的生命周期
-
Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化
-
Bean实例化后对将Bean的引入和值注入到Bean的属性中
-
如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法
-
如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
-
如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。
-
如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。
-
如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用
-
如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。
-
此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
-
如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。
五、Bean的装配方式
Bean的装配可以理解为将Bean依赖注入到Spring容器中,Bean的装配方式即Bean依赖注入的方式。Spring容器支持基于XML配置的装配、基于注解的装配以及自动装配等多种装配方式。
1、基于XML配置的装配
Spring提供了两种基于XML配置的装配方式:构造方法注入和属性setter方法注入。
2、注解的装配
在Spring框架中定义了一系列的注解,常用注解如下所示。
-
@Component
该注解是一个泛化的概念,仅仅表示一个组件对象(Bean),可以作用在任何层次上。 -
@Repository
该注解用于将数据访问层(DAO)的类标识为Bean,即注解数据访问层Bean,其功能与@Component相同。 -
@Service
该注解用于标注一个业务逻辑组件类(Service层),其功能与@Component相同。 -
@Controller
该注解用于标注一个控制器组件类(Spring MVC的Controller),其功能与@Component相同。 -
@Autowired
该注解可以对类成员变量、方法及构造方法进行标注,完成自动装配的工作。通过使用@Autowired来消除setter和getter方法。默认按照Bean的类型进行装配。 -
@Resource
该注解与@Autowired的功能一样,区别在于该注解默认是按照名称来装配注入的,只有当找不到与名称匹配的Bean时才会按照类型来装配注入;而@Autowired默认按照Bean的类型进行装配,如果想按照名称来装配注入,则需要和@Qualifier注解一起使用。 -
@Qualifier
该注解与@Aitowired注解配合使用。当@Autowired注解需要按照名称来装配注入时需要和该注解一起使用,Bean的实例名称由@Qualifier注解的参数制定。