Spring-Bean 简明笔记

bean 基础配置

01-Bean的配置信息一览图.png

bean 别名配置

1、设置别名

问 1:那么不同的人编写代码,可能给 bean 不同的命名,如何解决命名问题呢?
答 1:可以通过给 bean 起别名的方式

1
2
3
<bean id="bookService" name="service,service2,bookEbi" class="com.itheima.service.impl.BookServiceImpl">  
<property name="bookDao" ref="bookDao"/>
</bean>

name 属性值可以起多个别名,别名间以逗号、分号或空格来分割,比如如上代码的 name="service,service2,bookEbi"

2、在到运行类中修改一下获取 bean 的 id 就可以了

1
2
BookService bookService = (BookService) ctx.getBean("service");  
bookService.save();

除此之外,在 DI 配置属性的时候,也支持 name 属性,但是我们还是推荐通过 id 来进行引用
02-可通过ID或者Name属性来进行引用.png

bean 作用范围

Bean 的单例和多例

问 1:Spring 默认给我们创建的 bean 是 单例 的;那如果我想要造一个非单例的 bean 怎么办?
03-创建的Bean默认为单例的.png

答 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
2
3
4
5
6
7
8
9
10
public class BookDaoImpl implements BookDao {  
//无参的构造方法
public BookDaoImpl() {
System.out.println("book dao constructor is running");
}

public void save() {
System.out.println("book dao save ...");
}
}

2、配置 bean

1
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>

静态工厂

通过工厂的方式造对象(而不是使用 new)也是一种解耦的方式,那么通过工厂造出来的对象如何交给 Spring 进行管理呢?

1、静态工厂创建对象

1
2
3
4
5
6
7
//静态工厂创建对象  
public class OrderDaoFactory {
public static OrderDao getOrderDao(){
System.out.println("factory setup....");
return new OrderDaoImpl();
}
}

2、配置

1
<bean id="orderDao" class="com.itheima.factory.OrderDaoFactory" factory-method="getOrderDao"/>

3、运行

1
2
OrderDao orderDao = OrderDaoFactory.getOrderDao();  
orderDao.save();

也就是说:

  1. 需要在配置文件中的 class 属性中指明工厂的路径
  2. 通过 factory-method 属性指明工厂中造对象的方法

实例工厂(了解)

1、实例工厂创建对象

1
2
3
4
5
6
//实例工厂创建对象  
public class UserDaoFactory {
public UserDao getUserDao(){
return new UserDaoImpl();
}
}

2、配置

1
2
<bean id="userFactory" class="com.itheima.factory.UserDaoFactory"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
  1. 先造工厂的 bean,对应着第一行代码
  2. factory-bean 指的是这个工厂的实例,也就是第一行代码中的 userFactory
  3. factory-method 指明工厂中造对象的方法

3、运行

1
2
3
4
5
//创建实例工厂对象;  
UserDaoFactory userDaoFactory = new UserDaoFactory();
//通过实例工厂对象创建对象
UserDao userDao = userDaoFactory.getUserDao();
userDao.save();

bean 生命周期

通过配置文件

1、在配置文件中绑定类的初始化和销毁前方法

1
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>

2、在类(BookDaoImpl)中创建对应的方法即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class BookDaoImpl implements BookDao {  
public void save() {
System.out.println("book dao save ...");
}
//表示bean初始化对应的操作
public void init(){
System.out.println("init...");
}
//表示bean销毁前对应的操作
public void destory(){
System.out.println("destory...");
}

}

需要注意的是:当容器关闭时才会执行销毁前方法

bean 的生命周期

  • 初始化容器
    • 创建对象(内存分配)
    • 执行构造方法
    • 执行属性注入(set 操作)
    • 执行 bean 初始化方法
  • 使用 bean
    • 执行业务操作
  • 关闭 / 销毁容器
    • 执行 bean 销毁方法

附注

遇到 Spring 报错信息的解决办法

  1. 找到最后一条报错信息,Caused By:哒哒哒
  2. 如果最下面的能解决就 ok,不能解决就继续看上一条报错信息
  3. 因为第一条信息是包含全部的报错信息(很长看不到重点)