Spring-Bean 简明笔记
bean 基础配置
bean 别名配置
1、设置别名
问 1:那么不同的人编写代码,可能给 bean 不同的命名,如何解决命名问题呢?
答 1:可以通过给 bean 起别名的方式
1 | <bean id="bookService" name="service,service2,bookEbi" class="com.itheima.service.impl.BookServiceImpl"> |
name 属性值可以起多个别名,别名间以逗号、分号或空格来分割,比如如上代码的 name="service,service2,bookEbi"
2、在到运行类中修改一下获取 bean 的 id 就可以了
1 | BookService bookService = (BookService) ctx.getBean("service"); |
除此之外,在 DI 配置属性的时候,也支持 name 属性,但是我们还是推荐通过 id 来进行引用
bean 作用范围
Bean 的单例和多例
问 1:Spring 默认给我们创建的 bean 是 单例 的;那如果我想要造一个非单例的 bean 怎么办?
答 1:通过配置的形式,在 bean 标签中再插入一个 scope 属性(默认为 singleton)
1 | <bean id="bookDao" name="dao" scope="prototype" class="com.itheima.dao.impl.BookDaoImpl"/> |
问 2:那么为什么 bean 默认为单例呢?
答 2:单例的 bean 如果能够复用的话,那么下次需要使用直接去容器中拿就好了,而不是每用一次就造一个对象
问 3:那么那些 bean 适合造单例呢?
答 3:适合交给容器进行管理的 bean,包括表现层对象、业务层对象、数据层对象以及工具对象等
问 4:那么哪些 bean 不适合交给容器进行管理呢?
答 4:封装实体的域对象(如记录有成员变量的)
bean 实例化
bean 本质上就是对象,创建 bean 使用构造方法完成
构造方法(常用)
1、提供可访问的构造方法
构造方法不写也行,Spring 会为我们处理;如果我们手动写上的话,注意一定是无参的构造方法。即如果我们创建了含参的构造方法,但是没有提供无参的构造方法,将抛出异常 BeanCreationException
1 | public class BookDaoImpl implements BookDao { |
2、配置 bean
1 | <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/> |
静态工厂
通过工厂的方式造对象(而不是使用 new)也是一种解耦的方式,那么通过工厂造出来的对象如何交给 Spring 进行管理呢?
1、静态工厂创建对象
1 | //静态工厂创建对象 |
2、配置
1 | <bean id="orderDao" class="com.itheima.factory.OrderDaoFactory" factory-method="getOrderDao"/> |
3、运行
1 | OrderDao orderDao = OrderDaoFactory.getOrderDao(); |
也就是说:
- 需要在配置文件中的 class 属性中指明工厂的路径
- 通过
factory-method
属性指明工厂中造对象的方法
实例工厂(了解)
1、实例工厂创建对象
1 | //实例工厂创建对象 |
2、配置
1 | <bean id="userFactory" class="com.itheima.factory.UserDaoFactory"/> |
- 先造工厂的 bean,对应着第一行代码
- factory-bean 指的是这个工厂的实例,也就是第一行代码中的 userFactory
- factory-method 指明工厂中造对象的方法
3、运行
1 | //创建实例工厂对象; |
bean 生命周期
通过配置文件
1、在配置文件中绑定类的初始化和销毁前方法
1 | <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/> |
2、在类(BookDaoImpl)中创建对应的方法即可
1 | public class BookDaoImpl implements BookDao { |
需要注意的是:当容器关闭时才会执行销毁前方法
bean 的生命周期
- 初始化容器
- 创建对象(内存分配)
- 执行构造方法
- 执行属性注入(set 操作)
- 执行 bean 初始化方法
- 使用 bean
- 执行业务操作
- 关闭 / 销毁容器
- 执行 bean 销毁方法
附注
遇到 Spring 报错信息的解决办法
- 找到最后一条报错信息,Caused By:哒哒哒
- 如果最下面的能解决就 ok,不能解决就继续看上一条报错信息
- 因为第一条信息是包含全部的报错信息(很长看不到重点)