当前位置: 首页 > news >正文

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博客

相关文章:

  • 产品展示网站设计seo推广方法集合
  • 荆门做网站的公司营销推广与策划
  • 网站日常推广怎么做seo咨询河北
  • 专门做女性产品的网站硬件优化大师下载
  • 昆明网站排名优化价格网络推广方案设计
  • 做网站数据库坏了惠州seo计费管理
  • mac开发环境配置笔记
  • GO大模型应用开发框架-
  • 网络安全防护
  • Unity学习part4
  • SQLMesh 系列教程7- 详解 seed 模型
  • 第29篇 基于ARM A9处理器用C语言实现中断<五>
  • LeetCode - 21 合并两个有序链表
  • 板块一 Servlet编程:第十节 监听器全解 来自【汤米尼克的JAVAEE全套教程专栏】
  • 【学习笔记】Cadence电子设计全流程(二)原理图库的创建与设计(8-15)
  • ac的dhcp池里option43配错导致ap无法上线问题排查过程
  • 修改Linux下kernel里ramdisk.img教程
  • 机器学习,我们主要学习什么?
  • MySQL 三层 B+ 树能存多少数据?
  • 抖音试水AI分身;腾讯 AI 战略调整架构;百度旗下小度官宣接入DeepSeek...|网易数智日报
  • Hopper架构 GEMM教程
  • RAG基于用户问题的内容,对其进行分类和路由,然后选择适当的处理方式(2)
  • 同步异步日志系统-设计模式
  • Zabbix 7.2实操指南:基于OpenEuler系统安装Zabbix 7.2
  • 《数组》学习——区间和
  • 修改MySQL密码