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

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

链接:https://www.baobeihuijia.com/bbhj/contents/3/192584.html
在这里插入图片描述

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

  1. 框架总览

  2. spring的核心IOC与DI

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

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

    • 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
  7. 依赖自动装配(只能用于引用类型注入,不能简单类型)

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

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

    • 如果想要使用别的工具,那么需要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"/>
    
  10. 容器生命周期

    • 容器加载

    • 在这里插入图片描述

    • 获取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的销毁方法

  • 13
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值