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

<!--配置文件--><?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"><!--init-method:设置bean初始化生命周期回调函数--><!--destroy-method:设置bean销毁生命周期回调函数 , 仅适用于单例对象--><bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/><bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"><property name="bookDao" ref="bookDao"/></bean></beans>

  1. 接口控制方法(了解)
Spring为创建提供了两个接口 , 我们只需要继承并实现该方法即可
package com.itheima.service.impl;import com.itheima.dao.BookDao;import com.itheima.service.BookService;import org.springframework.beans.factory.DisposableBean;import org.springframework.beans.factory.InitializingBean;// InitializingBean,DisposableBean 分别对应afterPropertiesSet , destroy方法 , 代表创建和销毁public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {private BookDao bookDao;public void setBookDao(BookDao bookDao) {System.out.println("set .....");this.bookDao = bookDao;}public void save() {System.out.println("book service save ...");bookDao.save();}public void destroy() throws Exception {System.out.println("service destroy");}public void afterPropertiesSet() throws Exception {System.out.println("service init");}}<?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 id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/><!--直接调用即可--><bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"><property name="bookDao" ref="bookDao"/></bean></beans>我们需要提及一下bean的销毁时机:(了解即可)
  • 因为默认情况下 , 我们的bean不会被销毁 , 因为虚拟机会直接退出 , ClassPathXmlApplicationContext会被忽略销毁过程
所以如果我们希望销毁bean观察到destroy的实现 , 需要手动关闭:
  1. 手动关闭容器方法:
package com.itheima;import com.itheima.dao.BookDao;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class AppForLifeCycle {public static void main( String[] args ) {// 注意:这里需要采用ClassPathXmlApplicationContext作为对象 , 因为只有这个类才具有close方法ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) ctx.getBean("bookDao");bookDao.save();//关闭容器ctx.close();}}
  1. 注册关闭钩子 , 在虚拟机退出前先关闭容器再推出虚拟机
package com.itheima;import com.itheima.dao.BookDao;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class AppForLifeCycle {public static void main( String[] args ) {ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) ctx.getBean("bookDao");bookDao.save();//注册关闭钩子函数 , 在虚拟机退出之前回调此函数 , 关闭容器ctx.registerShutdownHook();}}
最后我们统计一下整体生命周期:

经验总结扩展阅读