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


我们需要提及一下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(); } }
最后我们统计一下整体生命周期: 初始化容器:创建对象(分配内存)->执行构造方法->执行属性注入(set操作)->执行bean初始化方法使用bean:执行业务操作关闭/销毁容器:执行bean销毁方法
依赖注入方式 
首先我们要知道类中传递数据的方法有两种:
 
  • 普通方法(Set方法)
  • 构造方法
 
然后我们要知道数据的类型大体分为两种:
 
  • 引入类型(数据层)
  • 简单类型(基本数据类型和String)
 
所以我们把依赖注入方式分为四种:
 
  • setter注入简单类型引用类型
  • 构造器注入简单类型引入类型
setter注入简单类型 
首先我们需要在bean种定义简单类型属性并提供可以访问的set方法
package com.itheima.dao.impl; import com.itheima.dao.BookDao; public class BookDaoImpl implements BookDao { private String databaseName; private int connectionNum; //setter注入需要提供要注入对象的set方法 public void setConnectionNum(int connectionNum) { this.connectionNum = connectionNum; } //setter注入需要提供要注入对象的set方法 public void setDatabaseName(String databaseName) { this.databaseName = databaseName; } public void save() { System.out.println("book dao save ..."+databaseName+","+connectionNum); } }
然后在配置中使用property标签value属性注入简单类型数据
setter注入引用类型
首先我们需要在bean种定义引用类型属性并提供可以访问的set方法
package com.itheima.service.impl; import com.itheima.dao.BookDao; import com.itheima.dao.UserDao; import com.itheima.service.BookService; public class BookServiceImpl implements BookService{ private BookDao bookDao; private UserDao userDao; //setter注入需要提供要注入对象的set方法 public void setUserDao(UserDao userDao) { this.userDao = userDao; } //setter注入需要提供要注入对象的set方法 public void setBookDao(BookDao bookDao) { this.bookDao = bookDao; } public void save() { System.out.println("book service save ..."); bookDao.save(); userDao.save(); } }
然后在配置中使用property标签ref属性注入引用类型数据
构造器注入简单类型(了解)
在bean中定义简单类型属性并提供可访问的set方法
public class BookDaoImpl implements BookDao{ private int connectionNumber; pubilc void setConnectionNumber(int connectionNumber){ this.connectionNumber = connectionNumber; } }
配置中使用constructor-arg标签value属性注入简单类型数据
根据构造方法参数名称注入构造器注入引用类型(了解)
在bean中定义引用类型属性并提供可访问的构造方法
public class BookDaoImpl implements BookDao{ private BookBao bookBao; pubilc void setConnectionNumber(int connectionNumber){ this.bookBao = bookBao; } }


推荐阅读