学习笔记11——Spring的XML配置

学习笔记系列开头惯例发布一些寻亲消息

链接https://www.baobeihuijia.com/bbhj/contents/3/192584.html

SSM框架------IOC基础【Bean+Setter注入+加载xml】

框架总览

  1. spring的核心IOC与DI

    • 原始问题:如果在一个类中new一个对象,那么这个对象的类定义发生改变时,这个类也会发生变化,那么就需要重新编译,上线
    • 控制反转:解耦,不要类之间互相new对象了,我们类,都把对象创建和初始化的权利全都放到外部的一个IOC容器,IOC可以从JVM方法区拿到类的字节码定义以及运行时常量池,来生成对象Bean。
    • 依赖注入DI:在容器中,如果两个对象之间存在依赖关系,IOC就直接就绑好
  2. IOC实操(对象在容器的取与拿)

    • pom中需要导入spring坐标

    • 在resources下配置spring,新建一个applicationContext.xml(相当于spring的IOC容器

    • 把类以bean的形式放入到spring容器中,起一个别名

      复制代码
      <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
    • 获取bean

      复制代码
      // 获取IOC容器
      ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
      // 获取bean
      BookDao bookDao = (BookDao)ctx.getBean("bookDao");
      bookDao.save();
      
      BookServie bookservice = (BookServie)ctx.getBean("bookService");
  3. DI实操(建立对象之间的依赖关系)

    复制代码
      // 取出类内部new另一个类对象的代码
    
      private BookDao bookDao;
      // 改用set方法来描述,容器会根据配置将对象注入
      public void setBookDao(BookDao bookDao){
      	this.bookDao = bookDao;
      }
    复制代码
      <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
      <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"/>
    
      改写为
    
      <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
      <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
      	// 第一个是set内的名字,ref后边是bean
      	<property name = "bookDao" ref="bookDao"/>
      </bean>
    • 修改单例为多例

      复制代码
      <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" scope="singleton"/>
      <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" scope="prototype"/>
  4. bean实例化的一些古老方法

    • 一、构造方法:容器调用无参构造方法得到的对象,是通过反射得到的(哪怕构造方法是类内私有也可以构造)
    • 二、静态工厂
    • 三、实例工厂
      • 改进:FactoryBean方法,一个factory对象,但是内部都是getobject写的是要new的对象
  5. 依赖注入方式

    • setter注入(拿的时候写好属性和setter,存的时候要写好bean以及property)

      • 引用类型

      • 简单类型

        复制代码
        <property name="databaseName"  value="mysql"/>
    • 构造器注入

      • 引用类型

        复制代码
        public BookServiceImpl(BookDao bookDao, UserDao userDao) {
                this.bookDao = bookDao;
                this.userDao = userDao;
        }
        
        <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
                <constructor-arg name="userDao" ref="userDao"/>
                <constructor-arg name="bookDao" ref="bookDao"/>
        </bean>
      • 简单类型

        复制代码
        	private String databaseName;
            private String connectionNum;
        
            public BookDaoImpl(String databaseName, String connectionNum) {
                this.databaseName = databaseName;
                this.connectionNum = connectionNum;
            }
            
            <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
                <!--根据构造方法参数位置注入-->
                <constructor-arg index="0" value="mysql"/>
                <constructor-arg index="1" value="100"/>
            </bean>
    • 两种方式的选择

      • 构造器注入是强制必须执行的,而setter注入可能会不进行注入导致对象为null
      • 首选setter
  6. 依赖自动装配(只能用于引用类型注入,不能简单类型)

    • 类型匹配:内部用setter,外部按照setter类型找到对应的bean注入,要求类型只有一个
    • 按名匹配:内部用setter,外部按照setter的名字找到对应的bean注入,不推荐使用
  7. 集合注入:array list set map property

  8. 加载管理一个第三方资源

    • 如果想要使用别的工具,那么需要pom中导入包,然后利用导入的类新建一个bean对象,就可以使用这些类工具了

    • 连接池对象

    • 在bean中读取配置文件:开启一个context命名空间,使用context加载properites文件

    • 使用属性占位符读取properites文件

    复制代码
    // 如果文件中的名字和系统的名字重复,那么需要在context读取的时候添加
    <context:property-placeholder location="jdbc.properties,jdbc2.properties" system-properties-mode="NEVER"/>
    // 加载全部properties
    <context:property-placeholder location="*.properties" system-properties-mode="NEVER"/>
    // 加载当前路径以及依赖的jar包的properties
    <context:property-placeholder location="classpath*.properties" system-properties-mode="NEVER"/>
  9. 容器生命周期

    • 容器加载

    • 获取bean

    • beanFactory初始化bean(调用构造函数)会延时加载,而applicationcontext初始化bean会立即加载

    • 容器关闭

    复制代码
      <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"  init-method="init",destory-mewthod="destory"/>
    
      # 关闭容器才能执行对象的销毁操作
      // 方法一
      ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
      ctx.closee();
    
      // 方法二:关闭钩子
      ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
      ctx.registerShutdownHook();
    • 流程(bean对象仍然为普通对象,也会通过垃圾回收机制收集)

      • 初始化容器
      • 当 Spring 容器启动时,它会读取配置文件并实例化容器中的所有对象Bean,调用构造方法,根据方法区的字节码创建对象
      • 执行属性注入setter
      • 容器中该bean的init
      • 如果遇到关闭销毁容器,则执行bean的销毁方法

象仍然为普通对象,也会通过垃圾回收机制收集)

  • 初始化容器

  • 当 Spring 容器启动时,它会读取配置文件并实例化容器中的所有对象Bean,调用构造方法,根据方法区的字节码创建对象

  • 执行属性注入setter

  • 容器中该bean的init

  • 如果遇到关闭销毁容器,则执行bean的销毁方法

相关推荐
咸甜适中12 分钟前
rust语言 (1.88) 学习笔记:客户端和服务器端同在一个项目中
笔记·学习·rust
Grassto42 分钟前
RAG 从入门到放弃?丐版 demo 实战笔记(go+python)
笔记
Magnetic_h1 小时前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa
研梦非凡2 小时前
ICCV 2025|从粗到细:用于高效3D高斯溅射的可学习离散小波变换
人工智能·深度学习·学习·3d
limengshi1383923 小时前
机器学习面试:请介绍几种常用的学习率衰减方式
人工智能·学习·机器学习
知识分享小能手3 小时前
React学习教程,从入门到精通,React 组件核心语法知识点详解(类组件体系)(19)
前端·javascript·vue.js·学习·react.js·react·anti-design-vue
周周记笔记4 小时前
学习笔记:第一个Python程序
笔记·学习
丑小鸭是白天鹅4 小时前
Kotlin协程详细笔记之切线程和挂起函数
开发语言·笔记·kotlin
潘达斯奈基~4 小时前
《大数据之路1》笔记2:数据模型
大数据·笔记
优雅鹅4 小时前
ARM、AArch64、amd64、x86_64、x86有什么区别?
arm开发·学习