1 bean实例化介绍
2 bean实例化方式【
2.1 构造方法的方式
它会根据默认无参构造函数来创建类对象。如果 bean 中没有默认无参构造函数,将会创建失败
2.1.1 创建User类
public class User implements Serializable { public User(){ System.out.println("user created..."); } }
2.1.2 配置Spring容器管理user 类型对象
<!--配置user对象--> <bean id="user" class="com.ujiuye.pojo.User"></bean>
2.1.3 测试容器实例化User对象是否成功
@Test public void testUser(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); User user = (User) context.getBean("user"); System.out.println(user); }
2.2 静态工厂方式
2.2.1 创建静态工厂ItemFactory
public class ItemFactory { //静态方法返回实例bean public static User createUser(){ System.out.println("static method running create bean ......"); return new User(); } }
2.2.2 配置Spring容器管理User类型对象
<!--静态工厂实例化对象: 工厂方法的返回值存放在IOC容器当中 --> <bean id="user" class="com.ujiuye.factory.ItemFactory" factory-method="createUser"></bean>
2.2.3 测试容器实例化User对象是否成功
@Test public void testItemFactory(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); User user = (User) context.getBean("user"); System.out.println(user); }
2.3 实例工厂方式
2.3.1 创建实例工厂NewItemFactory
public class NewItemFactory { //工厂的非静态方法返回bean实例 public User createUser(){ System.out.println("Dynamic method running create bean ......"); return new User(); } }
2.3.2 配置Spring容器管理NewItemFactory类型对象
<!--实例工厂: 步骤一; 创建对象 步骤二: 通过对象调用方法,方法的返回值存在IOC容器当中。 --> <bean id="itemFactory" class="com.ujiuye.factory.NewItemFactory"></bean> <bean id="user" factory-bean="itemFactory" factory-method="createUser"></bean>
2.3.3 测试容器实例化User对象是否成功
@Test public void testNewItemFactory(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); User user = (User) context.getBean("user"); System.out.println(user); }
3 bean作用域
3.1 bean作用域介绍
话术: 所谓Bean的作用域其实就是指Spring给我们创建出的对象的存活范围,在配置文件中通过bean的scope属性指定 <bean id="" class="" scope=""> scope:指对象的作用范围,取值如下:
取值范围 | 说明 |
---|---|
singleton | 默认值,单例的 |
prototype | 多例的 |
request | WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中 |
session | WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中 |
global session | WEB 项目中,应用在 Portlet 环境,如果没有 Portlet 环境那么globalSession 相当于 session |
3.2 bean作用域的解析
3.2.1 当scope的取值为singleton时
Bean的实例化个数:1个
Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例
3.2.2 当scope的取值为prototype时
Bean的实例化个数:多个
Bean的实例化时机:当调用getBean()方法时实例化Bean
3.2.3 当Scope的取值为其他值
scope指定为其他值,需要在特定的环境下使用, 只需要作为一个了解知识,面试能够回答出来即可
4 bean的生命周期
讲解思路: 1、介绍bean的生命周期 2、bean标签当中init-method属性和 destroy-method 属性 3、分别介绍单例模式和多例模式生命周期
4.1 bean生命周期介绍
话术: 在这里所谓的Bean的生命周期其实指的是Bean创建到销毁的这么一段时间。 在Spring中可以通过配置的形式,指定bean在创建后和销毁前要调用的方法。 属性: init-method:指定bean在创建后调用的方法 destroy-method:对象在销毁前调用的方法
<bean id="xxx" class="xxx" init-method="" destroy-method=""></bean>
4.2 单例对象的生命周期
4.2.1 在UserService中添加方法init和destory
public class UserServiceImpl implements UserService { public void init(){ System.out.println("init method running..."); } @Override public void saveService() { System.out.println("userSerivce save method running......"); } public void destroy(){ System.out.println("destroy method running..."); } }
4.2.2 在Spring.xml配置文件中配置UserService
<!--配置userServiceImpl--> <bean id="userService" class="com.ujiuye.service.UserServiceImpl" init-method="init" destroy-method="destroy"> </bean>
4.2.3 测试代码验证单例对象的生命周期
@Test public void test1(){ ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = (UserService) applicationContext.getBean("userService"); userService.saveService(); //关闭工厂: applicationContext.close(); }
单例对象总结:
对象创建:当应用加载,创建容器时,对象就被创建了
对象运行:只要容器在,对象一直活着
对象销毁:当应用卸载,销毁容器时,对象就被销毁了
4.3 多例对象的生命周周期
4.3.1 修改Spring配置文件scope属性
<!--配置userServiceImpl--> <bean id="userService" class="com.ujiuye.service.UserServiceImpl" init-method="init" destroy-method="destroy" scope="prototype"></bean>
4.3.2 测试代码验证多例对象的生命周期
@Test public void test1(){ ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = (UserService) applicationContext.getBean("userService"); userService.saveService(); //关闭工厂: applicationContext.close(); }
多例对象总结:
对象创建:当使用对象时(getBean),创建新的对象实例
对象运行:只要对象在使用中,就一直活着
对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了, 对destroy-method属性针对单例不生效。