一、bean别名配置
二、bean作用域
2.1、 bean作用域介绍
所谓Bean的作用域其实就是指Spring给我们创建出的对象的存活范围,在配置文件中通过bean的
scope
属性指定。
scope:指对象的作用范围,取值如下:
取值范围 | 说明 |
---|---|
singleton | 默认值,单例的 |
prototype | 多例的 |
request | WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中 |
session | WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中 |
global session | WEB 项目中,应用在 Portlet 环境,如果没有 Portlet 环境那么globalSession 相当于 session |
2.2、bean作用域的解析
-
当scope的取值为
singleton
时,Bean的实例化个数:1
个,Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例 -
当scope的取值为
prototype
时,Bean的实例化个数:多
个,Bean的实例化时机:当调用getBean()方法时实例化Bean -
当Scope的取值为
其他值
时,scope指定为其他值,需要在特定的环境下使用, 只需要作为一个了解知识,面试能够回答出来即可
三、bean的生命周期
3.1、bean生命周期介绍
在这里所谓的Bean的生命周期其实指的是Bean创建到销毁的这么一段时间。 在Spring中可以通过配置的形式,指定bean在创建后和销毁前要调用的方法。
<bean id="xxx" class="xxx" init-method="" destroy-method=""></bean>
init-method:指定bean在创建后调用的方法
destroy-method:对象在销毁前调用的方法,只针对单例对象
3.2、单例对象的生命周期
在Student实体类中添加方法init和destory
package com.liming.entity;
public class Student {
public void init() {
System.out.println("学生对象创建出来了");
}
public void addStudent(){
System.out.println("新增学生了");
}
public void destroy(){
System.out.println("学生对象被销毁了");
}
}
在application.xml配置文件中配置Student
<bean id="student" class="com.liming.entity.Student" init-method="init" destroy-method="destroy" scope="singleton"></bean>
测试代码验证单例对象的生命周期
@Test
public void t05(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
Student student = (Student) context.getBean("student");
student.addStudent();
context.close();
}
单例对象总结:
- 对象创建:当应用加载,创建容器时,对象就被创建了
- 对象运行:只要容器在,对象一直活着
- 对象销毁:当应用卸载,销毁容器时,对象就被销毁了
3.3、多例对象的生命周周期
修改application.xml配置文件scope属性
<bean id="student" class="com.etime.entity.Student" init-method="init" destroy-method="destroy" scope="prototype"></bean>
测试代码验证多例对象的生命周期
@Test
public void t06(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
Student student = (Student) context.getBean("student");
student.addStudent();
context.close();
}
多例对象总结:
- 对象创建:当使用对象时(getBean),创建新的对象实例
- 对象运行:只要对象在使用中,就一直活着
- 对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了。调用工厂close(),对象并不销毁。
四、实例化bean的三种方式
1、构造方法(常用)
它会根据默认无参构造函数来创建类对象。如果 bean 中没有默认无参构造函数,将会创建失败
创建User类
package com.liming.entity;
public class User {
public User(){
System.out.println("初始化User对象");
}
}
配置Spring容器管理user 类型对象
<bean id="user" class="com.liming.entity.User"></bean>
测试容器实例化User对象是否成功
@Test
public void t03(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
User user = (User)applicationContext.getBean("user");
}
2、静态工厂
创建静态工厂StatictFactory
package com.liming.util;
import com.liming.entity.User;
public class StaticFactory {
public static User getUser() {
System.out.println("这是静态工厂生产的user对象");
return new User();
}
}
配置Spring容器管理User类型对象
<bean id="u" class="com.liming.util.StaticFactory" factory-method="getUser"></bean>
测试容器实例化User对象是否成功
@Test
public void t04(){
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
User user = (User) context.getBean("u");
}
3、实例化工厂
创建实例工厂InstanceFactory
package com.liming.util;
import com.liming.entity.User;
public class InstanceFactory{
public User getUser() {
System.out.println("这是实例工厂生产的user对象");
return new User();
}
}
配置Spring容器管理InstanceFactory类型对象
<bean id="if" class="com.etime.util.InstanceFactory"></bean>
<bean id="u" factory-bean="if" factory-method="getUser"></bean>
测试容器实例化User对象是否成功
@Test
public void t04(){
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
User user = (User) context.getBean("u");
}
4、FactoryBean
创建UserFactoryBean类实现FactoryBean接口
package com.liming.util;
import com.liming.pojo.User;
import org.springframework.beans.factory.FactoryBean;
public class UserFactoryBean implements FactoryBean<User> {
@Override
public User getObject() throws Exception {
return new User();
}
@Override
public Class<?> getObjectType() {
return User.class;
}
/**
* 默认不写和return true为单例
* return false 为多例
* @return
*/
@Override
public boolean isSingleton() {
return false;
}
}
配置Spring容器管理UserFactoryBean对象
<bean id="user" class="com.liming.util.UserFactoryBean"/>
测试容器实例化User对象是否成功
@Test
public void test5(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");
User user = (User) ctx.getBean("user");
User user1 = (User) ctx.getBean("user");
System.out.println(user);
System.out.println(user1);
}
总结: