spring学习(spring容器、加载配置文件方式、获取bean的方式)
目录
一、加载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 { @Override public 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..."); } @Override public 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博客