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

相关推荐
循环过三天8 分钟前
3-1 PID算法改进(积分部分)
笔记·stm32·单片机·学习·算法·pid
萧曵 丶22 分钟前
Spring @TransactionalEventListener
java·数据库·spring·事务·transactional·异步
生如夏花℡33 分钟前
HarmonyOS学习记录3
学习·ubuntu·harmonyos
之歆35 分钟前
Python-封装和解构-set及操作-字典及操作-解析式生成器-内建函数迭代器-学习笔记
笔记·python·学习
幽络源小助理41 分钟前
SpringBoot基于JavaWeb的城乡居民基本医疗信息管理系统
java·spring boot·学习
默默coding的程序猿2 小时前
3.前端和后端参数不一致,后端接不到数据的解决方案
java·前端·spring·ssm·springboot·idea·springcloud
虾球xz2 小时前
CppCon 2018 学习:EFFECTIVE REPLACEMENT OF DYNAMIC POLYMORPHISM WITH std::variant
开发语言·c++·学习
Chef_Chen2 小时前
从0开始学习R语言--Day38--辛普森多样性指数
学习
Allen_LVyingbo2 小时前
Python常用医疗AI库以及案例解析(2025年版、上)
开发语言·人工智能·python·学习·健康医疗
DKPT2 小时前
Java组合模式实现方式与测试方法
java·笔记·学习·设计模式·组合模式