Appearance
1.bean的配置
1.1基础配置
类别 | 描述 |
---|---|
名称 | bean |
功能 | 定义Spring核心容器管理的对象 |
格式 | |
列表属性 | id:容器通过id值获取对应的bean(在一个容器中id值唯一) class:bean的类型,配置bean的全路径类名 |
xml
<beans>
<bean id="bookDao" class="com.my.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.my.service.impl.BookServiceImpl">
<property name="bookDao" ref="bookDao"/>
</bean>
</beans>
1.2别名配置
类别 | 描述 |
---|---|
名称 | name |
功能 | 定义bean的别名,可以定义多个,使用逗号、分号或者空格分隔 |
xml
<bean id="bookDao" name="bookDao bookDao1" class="com.my.dao.impl.BookDaoImpl"/>
1.3作用范围配置
类别 | 描述 |
---|---|
名称 | scope |
功能 | 定义bean的作用范围( singleton:单例(默认),prototype:非单例 ) |
xml
<bean id="userDao" class="com.my.factory.UserDaoFactoryBean" scope="prototype"/>
2.bean的实例化
2.1构造方法实例化(默认)
在实现类中添加无参构造方法(将类配置到Spring容器(xml配置文件))
java
public class BookDaoImpl implements BookDao {
public BookDaoImpl(){
System.out.println("book constructor is running");
}
@Override
public void save() {
System.out.println("book dao save......");
}
}
配置文件
xml
<bean id="bookDao" class="com.my.dao.impl.BookDaoImpl"/>
测试运行结果
java
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationConfig.xml");
BookDao bookDao = (BookDao) context.getBean("bookDao");
bookDao.save();
//运行结果为:book constructor is running
//book dao save......
}
2.2静态工厂实例化
准备实现类
java
public class OrderDaoImpl implements OrderDao {
@Override
public void save() {
System.out.println("order dao save ......");
}
}
创建工厂类,添加一个静态方法
java
public class OrderDaoFactory {
public static OrderDao getOrderDaoImpl(){
System.out.println("order dao factory start......");
return new OrderDaoImpl();
}
}
配置文件
xml
<!-- 静态工厂实例化bean-->
<bean id="orderDao" class="com.my.factory.OrderDaoFactory" factory-method="getOrderDaoImpl"/>
测试运行结果
java
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationConfig.xml");
OrderDao orderDao = (OrderDao) context.getBean("orderDao");
orderDao.save();
//输出结果为:book constructor is running
//order dao factory start......
//order dao save ......
}
2.3实例工厂实例化
实现类
java
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("user dao save ......");
}
}
创建工厂类,添加方法(非静态方法)
java
public class UserDaoFactory {
public UserDao getUserDaoImpl(){
return new UserDaoImpl();
}
}
配置文件
xml
<!-- 实例工厂实例化bean-->
<bean id="userDaoFactory" class="com.my.factory.UserDaoFactory"/>
<bean id="userDao" factory-method="getUserDaoImpl" factory-bean="userDaoFactory"/>
测试运行结果
java
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationConfig.xml");
UserDao userDao = (UserDao) context.getBean("userDao");
userDao.save();
//输出结果为:user dao save ......
}
2.4FactoryBean的使用(简化)
实现类(同2.3)
创建一个类实现 FactoryBean 接口
java
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
//创建对象
@Override
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
//对象类型
@Override
public Class<?> getObjectType() {
return UserDao.class;
}
}
配置文件
java
<bean id="userDao" class="com.my.factory.UserDaoFactoryBean"/>
测试运行结果(同2.3)
3.bean的生命周期
初始化容器
- 创建对象
- 执行构造方法
- 执行属性注入(setter方法)
- 执行bean初始化方法
使用bean
- 执行业务操作
关闭、销毁容器
- 执行bean销毁方法
3.1控制生命周期方法
- void init(); bean初始化
- void destroy(); bean销毁
例如:
准备接口和实现类,添加 init 和 destroy 两个方法
java
public class BookDaoImpl implements BookDao {
@Override
public void save() {
System.out.println("book dao save......");
}
public void init(){
System.out.println("init ......");
}
public void destroy(){
System.out.println("destroy ......");
}
}
配置文件
xml
<bean id="bookDao" class="com.my.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>
测试运行结果
Spring的IoC容器是运行在JVM中的,main方法执行完后,JVM
退出,但IoC容器中的bean并没有来得及销毁
所以要在JVM退出前关闭容器
java
public static void main(String[] args) {
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationConfig.xml");
//虚拟机关闭前,将容器关闭
context.registerShutdownHook();
BookDao bookDao = (BookDao) context.getBean("bookDao");
bookDao.save();
//context.close();
//输出结果:init ......
//book dao save......
//destroy ......
}
3.2关闭容器的方式
- close() 方法 (调用的时候关闭容器)
- registerShutdownHook() 方法 (JVM退出前调用关闭 (钩子函数/回调函数))
ApplicationContext 没有close方法, ConfigurableApplicationContext 接口有 close 方法,所以使用实现类 ClassPathXmlApplicationContext
3.3生命周期控制接口实现(Spring提供的两个接口 InitializingBean,DisposableBean)
实现类可以改为
java
public class BookDaoImpl implements BookDao, InitializingBean, DisposableBean {
@Override
public void save() {
System.out.println("book dao save......");
}
@Override
public void destroy() throws Exception {
System.out.println("destroy ......");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("init ......");
}
}
配置文件
xml
<bean id="bookDao" class="com.my.dao.impl.BookDaoImpl"/>
测试运行结果(同3.1)