目录
一、加载spring配置文件的几种方式。
(0)工程文件初始化。
(1)加载类路径下的配置文件。(常见)
(2)加载文件绝对路径的配置文件。
(3)加载多个配置文件。
二、获取bean的方式。
(1)容器对象.getBean("id")+强制类型转换。
(2)容器对象.getBean("id","bean类型")。
(3)容器对象.getBean("bean类型")。
三、spring容器初始化方式。
(1)BeanFactory接口。
<1>第一种方案。
<2>第二种方案。
(2)ApplicationContext接口。
(3)BeanFactory(Bean工厂)与ApplicationContext接口核心区别。
<1>BeanFactory延迟加载bean。
<2>ApplicationContext即时加载bean。
(4)关闭容器的接口。
<1>ConfigurableApplicationContext接口。
一、加载spring配置文件的几种方式。
(0)工程文件初始化。
- 基于Maven构建工程。引入spring-context依赖坐标。
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.18</version> </dependency>
dao层。BookDao接口。BookDaoImpl实现类。
package com.fs.dao;public interface BookDao {/*** dao层save方法*/void save(); }
package com.fs.dao.impl;import com.fs.dao.BookDao;public class BookDaoImpl implements BookDao {@Overridepublic void save() {System.out.println("book dao save...");} }
- resources目录下的spring配置文件。将BookDaoImpl交给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"><bean id="bookDao" class="com.fs.dao.impl.BookDaoImpl"></bean></beans>
测试类(App)。通过获取容器对象得到对应管理的bean。通过对象调用save方法完成测试。
(1)加载类路径下的配置文件。(常见)
- 使用类路径加载配置文件。new ClassPathXmlApplicationContext(xxx)。
package com.fs.test;import com.fs.dao.BookDao; import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {//1.使用类路径加载配置文件ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) context.getBean("bookDao");bookDao.save();} }
运行结果。
(2)加载文件绝对路径的配置文件。
- 使用文件系统加载配置文件。new FileSystemXmlApplicationContext(xxx)。
- 复制文件的引用(绝对路径)。
package com.fs.test;import com.fs.dao.BookDao; import org.springframework.context.support.FileSystemXmlApplicationContext;public class App {public static void main(String[] args) {//2.使用文件系统加载配置文件FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("D:\\javacode2025\\spring-0219\\src\\main\\resources\\applicationContext.xml");BookDao bookDao = (BookDao) context.getBean("bookDao");bookDao.save();} }
- 运行结果也是如第1种方式一样。不过通常大多数都是使用类路径加载配置文件。
(3)加载多个配置文件。
- 无论是哪种方式,都可以一次加载多个配置文件,配置文件之间使用逗号相隔即可。
//使用类路径加载多个配置文件ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");
二、获取bean的方式。
(1)容器对象.getBean("id")+强制类型转换。
- 简单理解:使用bean名称(id)获取。
package com.fs.test;import com.fs.dao.BookDao; import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {//使用类路径加载配置文件ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = (BookDao) context.getBean("bookDao");bookDao.save();} }
(2)容器对象.getBean("id","bean类型")。
- 简单理解:使用bean名称(id)并指定类型获取。
package com.fs.test;import com.fs.dao.BookDao; import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {//使用类路径加载配置文件ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = context.getBean("bookDao", BookDao.class);bookDao.save();} }
(3)容器对象.getBean("bean类型")。
- 简单理解:使用bean类型获取。
- 局限性。容器内部管理的某个类型的实体类的bean只能有一个。
package com.fs.test;import com.fs.dao.BookDao; import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {//使用类路径加载配置文件ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");BookDao bookDao = context.getBean(BookDao.class);bookDao.save();} }
三、spring容器初始化方式。
(1)BeanFactory接口。
- BeanFactory是IoC容器的顶层接口。初始化BeanFactory对象时,加载的bean延迟加载。
当然使用BeanFactory接口也可以完成IoC容器对象的实例化。因为是spring最早期的实例化容器的方案。
<1>第一种方案。
package com.fs.test;import com.fs.dao.BookDao; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource;public class AppForBeanFactory {public static void main(String[] args) {Resource resource = new ClassPathResource("applicationContext.xml");BeanFactory beanFactory = new XmlBeanFactory(resource);BookDao bookDao = beanFactory.getBean(BookDao.class);bookDao.save();} }
<2>第二种方案。
package com.fs.test;import com.fs.dao.BookDao; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;public class AppForBeanFactory2 {public static void main(String[] args) {//创建bean工厂对象DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();//创建一个读取spring配置文件的对象XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);//加载spring配置文件并交给bean工厂xmlBeanDefinitionReader.loadBeanDefinitions("applicationContext.xml");BookDao bookDao = beanFactory.getBean(BookDao.class);bookDao.save();} }
(2)ApplicationContext接口。
- ApplicationContext是spring容器的核心接口,初始化bean是即时加载。
- 可以通过类与接口间的层次结构向上寻找。其中ClassPathXmlApplicationContext、FileSystemXmlApplicationContext类是ApplicationContext接口常用初始化类。
- 而ApplicationContext接口是后期在BeanFactory接口的基础上发展而来的。并通过若干个子接口、实现类的扩张,达到了最佳的使用状态。也就是现在ApplicationContext接口提供的功能要比BeanFactory接口要多得多。
(3)BeanFactory(Bean工厂)与ApplicationContext接口核心区别。
BeanFactory创建bean对象的时机是当调用getBean()方法时才创建(延迟加载)。
而ApplicationContext一创建对象就把bean对象创建好了(即时加载)
<1>BeanFactory延迟加载bean。
- 1、在BookDaoImpl实现类新增无参构造方法。并打印一句话。
- 2、测试类中从调用getBean()方法往下注释。
package com.fs.dao.impl;import com.fs.dao.BookDao;public class BookDaoImpl implements BookDao {public BookDaoImpl() {System.out.println("book dao constructor...");}@Overridepublic void save() {System.out.println("book dao save...");} }
测试类AppForBeanFactory。
package com.fs.test;import com.fs.dao.BookDao; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource;public class AppForBeanFactory {public static void main(String[] args) {Resource resource = new ClassPathResource("applicationContext.xml");BeanFactory beanFactory = new XmlBeanFactory(resource);/*BookDao bookDao = beanFactory.getBean(BookDao.class);bookDao.save();*/} }
- 结果发现并没有调用无参构造,未完成bean的初始化。(延迟加载bean)
<2>ApplicationContext即时加载bean。
- 而ApplicationContext在创建容器对象的时候就完成了bean的初始化。
package com.fs.test;import com.fs.dao.BookDao; import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {//使用类路径加载多个配置文件ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");/*BookDao bookDao = context.getBean(BookDao.class);bookDao.save();*/} }
- 测试结果也就是打印了无参构造的输出。
也可以在spring配置文件中的属性lazy-init="true"(设置延迟加载)。
<?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.fs.dao.impl.BookDaoImpl" lazy-init="true"></bean></beans>
(4)关闭容器的接口。
<1>ConfigurableApplicationContext接口。
- 涉及到bean的生命周期与控制——close()方法。
- 具体可以查看之前的博客:spring学习(bean的生命周期与控制?)_spring 控制bean 生命周期-CSDN博客