学习笔记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的销毁方法

相关推荐
red_redemption15 分钟前
自由学习记录(23)
学习·unity·lua·ab包
幽兰的天空42 分钟前
默语博主的推荐:探索技术世界的旅程
学习·程序人生·生活·美食·交友·美女·帅哥
游走于计算机中摆烂的1 小时前
启动前后端分离项目笔记
java·vue.js·笔记
沐泽Mu1 小时前
嵌入式学习-C嘎嘎-Day05
开发语言·c++·学习
你可以叫我仔哥呀2 小时前
ElasticSearch学习笔记三:基础操作(一)
笔记·学习·elasticsearch
maxiumII2 小时前
Diving into the STM32 HAL-----DAC笔记
笔记·stm32·嵌入式硬件
脸ル粉嘟嘟2 小时前
GitLab使用操作v1.0
学习·gitlab
路有瑶台2 小时前
MySQL数据库学习(持续更新ing)
数据库·学习·mysql
码蜂窝编程官方2 小时前
【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的虎鲸旅游攻略网的设计与实现
java·vue.js·spring boot·后端·spring·旅游
AuroraI'ncoding3 小时前
时间请求参数、响应
java·后端·spring