一篇文章带你掌握主流基础框架——Spring( 三 )


最后我们介绍一下bean的作用范围scope:
类别描述名称scope类型标签所属bean标签功能定义bean的作用范围,可选范围如下:singleton:单列(默认)prototype:非单列范例<bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl" scope="prototype"/>

这里的scope指产生对象的数量
我们的scope在默认情况下是singleton , 因为很多对象只需要创建一次,多次创建会导致内存膨胀
合适交给容器进行管理的bean(singleton):
  • 表现层对象
  • 业务层对象
  • 数据层对象
  • 工具对象
不合适交给容器进行管理的bean(prototype):
  • 封装实体的域对象(带有状态的bean)
bean实例化bean的实例化通常分为四种方法,我们在下面一一介绍:
  1. 构造方法(常用)
我们需要在数据类中提供构造方法,配置条件中不需要改变
// 数据类public class BookDaoImpl implements BookDao {public BookDaoImpl() {System.out.println("book dao constructor is running ....");}public void save() {System.out.println("book dao save ...");}}<?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="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/></beans>
若无参构造方法不存在 , 则抛出异常BeanCreationException
  1. 静态工厂(了解)
我们在之前的案例中存在有对象工厂的说法,我们可以设置工厂并调用其方法得到bean
// 静态工厂package com.itheima.factory;import com.itheima.dao.OrderDao;import com.itheima.dao.impl.OrderDaoImpl;//静态工厂创建对象public class OrderDaoFactory {public static OrderDao getOrderDao(){System.out.println("factory setup....");return new OrderDaoImpl();}}<?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="orderDao" class="com.itheima.factory.OrderDaoFactory" factory-method="getOrderDao"/></beans>
  1. 实例工厂(了解)
和静态工厂相同,但不同点是方法不是静态,我们需要提前创建一个bean
// 实例工厂package com.itheima.factory;import com.itheima.dao.UserDao;import com.itheima.dao.impl.UserDaoImpl;//实例工厂创建对象public class UserDaoFactory {public UserDao getUserDao(){return new UserDaoImpl();}}<?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="userFactory" class="com.itheima.factory.UserDaoFactory"/><!-- factory-bean:实例工厂本身bean factory-method:使用调用bean的方法 --><bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/></beans>
  1. FactoryBean(重要实用)
除了我们之前自己定义的工厂外,Spring提供了一种官方版本的FactoryBean
// FactoryBean工厂(需接口,< >中填写数据类接口)package com.itheima.factory;import com.itheima.dao.UserDao;import com.itheima.dao.impl.UserDaoImpl;import org.springframework.beans.factory.FactoryBean;//FactoryBean创建对象public class UserDaoFactoryBean implements FactoryBean<UserDao> {//代替原始实例工厂中创建对象的方法// 返回创建对象类型为UserDaoImpl()public UserDao getObject() throws Exception {return new UserDaoImpl();}// 这里填写接口类型public Class<?> getObjectType() {return UserDao.class;}// 可以修改来修改其scope属性public boolean isSingleton() {return false;}}<?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"><!--方式四:使用FactoryBean实例化bean--><bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/></beans>bean生命周期我们先来接单介绍生命周期相关概念:

推荐阅读