> 文章列表 > Spring核心容器之bean详解

Spring核心容器之bean详解

Spring核心容器之bean详解

一、bean别名配置

Spring核心容器之bean详解

二、bean作用域

2.1、 bean作用域介绍

所谓Bean的作用域其实就是指Spring给我们创建出的对象的存活范围,在配置文件中通过bean的scope属性指定。
Spring核心容器之bean详解

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>

测试代码验证单例对象的生命周期

	@Testpublic 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>

测试代码验证多例对象的生命周期

 	@Testpublic 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对象是否成功

 	@Testpublic 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对象是否成功

 	@Testpublic 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对象是否成功

	@Testpublic 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> {@Overridepublic User getObject() throws Exception {return new User();}@Overridepublic Class<?> getObjectType() {return User.class;}/* 默认不写和return true为单例* return false 为多例* @return*/@Overridepublic boolean isSingleton() {return false;}
}

配置Spring容器管理UserFactoryBean对象

<bean id="user" class="com.liming.util.UserFactoryBean"/>

测试容器实例化User对象是否成功

	@Testpublic 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);}

Spring核心容器之bean详解
总结:
Spring核心容器之bean详解