一、Bean的配置
- id:spring容器内bean的唯一标识
- class:bean的类型(被配置的bean的全路径名)
- name:bean的别名,可用逗号,分号,空格间隔多个别名
- scope:定义bean的作用范围(singleton:默认、prototype)
<!--
id:bean的id,每个容器的唯一值
class:bean的类型,即被配置的bean的全路径类名
name:bean别名,可已逗号,分号,空格去间隔多个名称
scope:定义bean的作用范围:
singleton:单例(默认)
prototype:非单例
-->
<bean id="bookDaoId" name = "bookDao,bd" class="dao.impl.BookDaoImp" scope="prototype" />
<bean id="bookService" class="service.impl.BookServiceImp" scope="prototype">
<property name="bookDao" ref="bd" />
</bean>
适合交给Spring容器管理的bean
- 表现层对象
- 业务层对象
- 数据层对象
- 工具对象
不适合管理的bean
- 封装的实体对象(pojo类)
二、Bean的实例化(创建)
- 构造器(空参)
- 静态工厂
bean的本质就是对象,所以创建bean使用构造方法完成
在pom.xml导入junit和spring
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.9</version>
</dependency>
2.1、构造器(空参)
1,我们在boodDao的构造器内添加一句话,注意这里构造器的类型是private
2,加载到applicationContext.xml容器
3, 编写测试类调用save方法
4, 验证结果
假如我们在构造器里传入参数,则会报如下异常
Failed to instantiate [dao.impl.BookDaoImp]: No default constructor found;
总结:spring通过暴力反射调用类的构造方法(空参)完成对象的实例化
2.2、静态工厂
首先准备一个静态工厂
1,,OrderDao接口
public interface OrderDao {
void save();
}
2,OrderDaoImp实现类
import dao.OrderDao;
public class OrderDaoImp implements OrderDao {
@Override
public void save() {
System.out.println("人家是OrderDao~~~~");
}
}
3,OrderDaoFactory工厂类
import dao.OrderDao;
import dao.impl.OrderDaoImp;
public class OrderDaoFactory {
public static OrderDao getOderDao(){
return new OrderDaoImp();
}
}
4,ApplicationContext.xml
5,测试类和测试结果
三、Bean的生命周期
使用配置:
使用接口:
要想正常运行销毁方法,我们需要在容器关闭前触发bean的销毁
手动关闭:ConfigurableApplicationContext接口的close()方法
注册关闭钩子,在虚拟机退出前先关闭容器再退出虚拟器:ConfigurableApplicationContext接口的registerShutdownHook()方法