百知教育 — Spring系列课程 — 工厂高级特性


第十章、对象的生命周期

1. 什么是对象的生命周期
指的是一个对象创建、存活、消亡的一个完整过程
2. 为什么要学习对象的生命周期
由Spring负责对象的创建、存活、销毁,了解生命周期,有利于我们使用好Spring为我们创建的对象
3. 生命周期的3个阶段
  • 创建阶段

    Spring工厂何时创建对象
    • scope="singleton"

      Spring工厂创建的同时,对象的创建
      
      注意:设置scope=singleton 这种情况下 也需要在获取对象的同时,创建对象
      <bean lazy-init="true"/>
    • scope="prototype"

      Spring工厂会在获取对象的同时,创建对象
      ctx.getBean("")
  • 初始化阶段

    Spring工厂在创建完对象后,调用对象的初始化方法,完成对应的初始化操作
    
    1. 初始化方法提供:程序员根据需求,提供初始化方法,最终完成初始化操作
    2. 初始化方法调用:Spring工厂进行调用
    • InitializingBean接口

      //程序员根据需求,实现的方法,完成初始化操作
      public void afterProperitesSet(){ }
    • 对象中提供一个普通的方法

      public void myInit(){
      
      }
      
      <bean id="product" class="xxx.Product" init-method="myInit"/>
    • 细节分析

      1. 如果一个对象即实现InitializingBean 同时又提供的 普通的初始化方法 顺序

        1. InitializingBean
        2. 普通初始化方法
      2. 注入一定发生在初始化操作的前面

      3. 什么叫做初始化操作

        资源的初始化:数据库 IO 网络 .....
  • 销毁阶段

    Spring销毁对象前,会调用对象的销毁方法,完成销毁操作
    
    1. Spring什么时候销毁所创建的对象?
    ctx.close();
    2. 销毁方法:程序员根据自己的需求,定义销毁方法,完成销毁操作
    调用:Spring工厂完成调用
    • DisposableBean

      public void destroy()throws Exception{
      
      }
    • 定义一个普通的销毁方法

      public void myDestroy()throws Exception{
      
      }
      <bean id="" class="" init-method="" destroy-method="myDestroy"/>
    • 细节分析

      1. 销毁方法的操作只适用于 scope="singleton"

      2. 什么叫做销毁操作

        主要指的就是 资源的释放操作  io.close() connection.close();

第十一章、配置文件参数化

把Spring配置文件中需要经常修改的字符串信息,转移到一个更小的配置文件中

1. Spring的配置文件中存在需要经常修改的字符串?
存在 以数据库连接相关的参数 代表
2. 经常变化字符串,在Spring的配置文件中,直接修改
不利于项目维护(修改)
3. 转移到一个小的配置文件(.properties)
利于维护(修改) 配置文件参数化:利于Spring配置文件的维护(修改)
1. 配置文件参数的开发步骤
  • 提供一个小的配置文件(.properities)

    名字:随便
    放置位置:随便 jdbc.driverClassName = com.mysql.jdbc.Driver
    jdbc.url = jdbc:mysql://localhost:3306/suns?useSSL=false
    jdbc.username = root
    jdbc.password = 123456
  • Spring的配置文件与小配置文件进行整合

    applicationContext.xml
    <context:property-placeholder location="classpath:/db.properties"/>
  • 在Spring配置文件中通过${key}获取小配置文件中对应的值

第十二章、自定义类型转换器

1. 类型转换器
作用:Spring通过类型转换器把配置文件中字符串类型的数据,转换成了对象中成员变量对应类型的数据,进而完成了注入

2. 自定义类型转换器
原因:当Spring内部没有提供特定类型转换器时,而程序员在应用的过程中还需要使用,那么就需要程序员自己定义类型转换器
  • 类 implements Converter接口

    public class MyDateConverter implements Converter<String, Date> {
    /*
    convert方法作用:String ---> Date
    SimpleDateFormat sdf = new SimpleDateFormat();
    sdf.parset(String) ---> Date
    param:source 代表的是配置文件中 日期字符串 <value>2020-10-11</value> return : 当把转换好的Date作为convert方法的返回值后,Spring自动的为birthday属性进行注入(赋值) */ @Override
    public Date convert(String source) { Date date = null;
    try {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    date = sdf.parse(source);
    } catch (ParseException e) {
    e.printStackTrace();
    }
    return date;
    }
    }
  • 在Spring的配置文件中进行配置

    • MyDateConverter对象创建出来

      <bean id="myDateConverter" class="xxxx.MyDateConverter"/>
    • 类型转换器的注册

      目的:告知Spring框架,我们所创建的MyDateConverter是一个类型转换器
      <!--用于注册类型转换器-->
      <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
      <property name="converters">
      <set>
      <ref bean="myDateConverter"/>
      </set>
      </property>
      </bean>
3. 细节
  • MyDateConverter中的日期的格式,通过依赖注入的方式,由配置文件完成赋值。

    public class MyDateConverter implements Converter<String, Date> {
    private String pattern; public String getPattern() {
    return pattern;
    } public void setPattern(String pattern) {
    this.pattern = pattern;
    } /*
    convert方法作用:String ---> Date
    SimpleDateFormat sdf = new SimpleDateFormat();
    sdf.parset(String) ---> Date
    param:source 代表的是配置文件中 日期字符串 <value>2020-10-11</value> return : 当把转换好的Date作为convert方法的返回值后,Spring自动的为birthday属性进行注入(赋值) */ @Override
    public Date convert(String source) { Date date = null;
    try {
    SimpleDateFormat sdf = new SimpleDateFormat(pattern);
    date = sdf.parse(source);
    } catch (ParseException e) {
    e.printStackTrace();
    }
    return date;
    }
    }
    <!--Spring创建MyDateConverter类型对象-->
    <bean id="myDateConverter" class="com.baizhiedu.converter.MyDateConverter">
    <property name="pattern" value="yyyy-MM-dd"/>
    </bean>
  • ConversionSeviceFactoryBean 定义 id属性 值必须 conversionService

  • Spring框架内置日期类型的转换器

    日期格式:2020/05/01 (不支持 :2020-05-01)

第十三章、后置处理Bean

BeanPostProcessor作用:对Spring工厂所创建的对象,进行再加工。

AOP底层实现:

注意:BeanPostProcessor接口
xxxx(){ }
  • 后置处理Bean的运行原理分析

程序员实现BeanPostProcessor规定接口中的方法:

Object postProcessBeforeInitiallization(Object bean String beanName)
作用:Spring创建完对象,并进行注入后,可以运行Before方法进行加工
获得Spring创建好的对象 :通过方法的参数
最终通过返回值交给Spring框架 Object postProcessAfterInitiallization(Object bean String beanName)
作用:Spring执行完对象的初始化操作后,可以运行After方法进行加工
获得Spring创建好的对象 :通过方法的参数
最终通过返回值交给Spring框架 实战中:
很少处理Spring的初始化操作:没有必要区分Before After。只需要实现其中的一个After方法即可
注意:
postProcessBeforeInitiallization
return bean对象
  • BeanPostProcessor的开发步骤

    1. 类 实现 BeanPostProcessor接口

      public class MyBeanPostProcessor implements BeanPostProcessor {
      
          @Override
      public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
      return bean;
      } @Override
      public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { Categroy categroy = (Categroy) bean;
      categroy.setName("xiaowb"); return categroy;
      }
      }
    2. Spring的配置文件中进行配置

      <bean id="myBeanPostProcessor" class="xxx.MyBeanPostProcessor"/>
    3. BeanPostProcessor细节

      BeanPostProcessor会对Spring工厂中所有创建的对象进行加工。

Spring一套全通2—工厂高级的更多相关文章

  1. Spring一套全通—工厂

    百知教育 - Spring系列课程 - 工厂 第一章 引言 1. EJB存在的问题 2. 什么是Spring Spring是一个轻量级的JavaEE解决方案,整合众多优秀的设计模式 轻量级 1. 对于 ...

  2. Spring一套全通4—持久层整合

    百知教育 - Spring系列课程 - 持久层整合 第一章.持久层整合 1.Spring框架为什么要与持久层技术进行整合 1. JavaEE开发需要持久层进行数据库的访问操作. 2. JDBC Hib ...

  3. Spring Cloud Alibaba | Sentinel: 服务限流高级篇

    目录 Spring Cloud Alibaba | Sentinel: 服务限流高级篇 1. 熔断降级 1.1 降级策略 2. 热点参数限流 2.1 项目依赖 2.2 热点参数规则 3. 系统自适应限 ...

  4. 为caffe添加最简单的全通层AllPassLayer

    参考赵永科的博客,这里我们实现一个新 Layer,名称为 AllPassLayer,顾名思义就是全通 Layer,“全通”借鉴于信号处理中的全通滤波器,将信号无失真地从输入转到输出. 虽然这个 Lay ...

  5. Spring 实现两种设计模式:工厂模式和单态模式(单例模式)

    本文摘自:李刚 著 <轻量级 Java EE企业应用实战 Struts2+Spring+hibernate整合开发> 在Spring 中大量使用的以下两种设计模式:工厂模式和单态模式. 工 ...

  6. sping练习,在Eclipse搭建的Spring开发环境中,使用工厂方式创建Bean对象,将创建的Bean对象输出到控制台。

    相关 知识 >>> 相关 练习 >>> 实现要求: 在Eclipse搭建的Spring开发环境中,使用工厂方式创建Bean对象,将创建的Bean对象输出到控制台.要 ...

  7. Spring Boot 扩展点应用之工厂加载机制

    Spring 工厂加载机制,即 Spring Factories Loader,核心逻辑是使用 SpringFactoriesLoader 加载由用户实现的类,并配置在约定好的META-INF/spr ...

  8. 【Spring Cloud & Alibaba全栈开源项目实战】:SpringBoot整合ELK实现分布式登录日志收集和统计

    一. 前言 其实早前就想计划出这篇文章,但是最近主要精力在完善微服务.系统权限设计.微信小程序和管理前端的功能,不过好在有群里小伙伴的一起帮忙反馈问题,基础版的功能已经差不多,也在此谢过,希望今后大家 ...

  9. FKP,一套全栈框架,基于react、webpack、koa1、babel

    FKP-REST是一套前后端分离,基于javascript的全栈实现,基于node的高性能,易部署性及javascript前后端语言的一致性,学习成本,时间成本及项目快速启动等等方面,FKP都是一种不 ...

  10. Spring RESTful + Redis全注解实现恶意登录保护机制

    好久没更博了... 最近看了个真正全注解实现的 SpringMVC 博客,感觉很不错,终于可以彻底丢弃 web.xml 了.其实这玩意也是老东西了,丢弃 web.xml,是基于 5.6年前发布的 Se ...

随机推荐

  1. vue 状态管理 五、Module用法

    系列导航 vue 状态管理 一.状态管理概念和基本结构 vue 状态管理 二.状态管理的基本使用 vue 状态管理 三.Mutations和Getters用法 vue 状态管理 四.Action用法 ...

  2. HOMER docker版本配置优化

    概述 HOMER是一款100%开源的针对SIP/VOIP/RTC的抓包工具和监控工具. HOMER是一款强大的.运营商级.可扩展的数据包和事件捕获系统,是基于HEP/EEP协议的VoIP/RTC监控应 ...

  3. plsqll连接Oracle的两种方式

    第一种方式:配置tnsnames.ora 找到plsql软件根目录 下的配置文件

  4. java基础-异常Exception-day10

    目录 1. 练习 2. 异常三联 try-catch-finally 3.异常的分类 3. 子类throws的异常 小于等于父类的异常 4.自定义异常 1. 练习 package com.msb01; ...

  5. google浏览器网页截取全屏

    本想在谷歌浏览器滚动截取网页全屏,没有找到好的方法,在网上找到一个快捷键,未曾使用过,特地记录下: 第一步:按F12打开 第二步:window:Ctrl + Shift + P mac:command ...

  6. Keep English Level-04

    firm -- 坚定的,坚固的;公司 share -- n 股份,份额 executive -- 执行官 There is no chance,no density,no fate,that can ...

  7. 如何让golang的web服务热重载

    有很多方法可以热重载 golang Web 应用程序或 golang 程序. 我选择gin(不是web gin框架)来进行热重载. 首先在 GOPATH/bin下安装gin,命令如下所示: go ge ...

  8. Git-远程仓库-remote-pull-push

  9. [转帖]TiDB-merge region相关问题

    一.开启region merge # 控制 Region Merge 的 size 上限,当 Region Size 大于指定值时 PD 不会将其与相邻的 Region 合并 pd-ctl confi ...

  10. [转帖]CentOS-7-x86_64-DVD-2009 rpm包列表(centos7.9)

    https://www.cnblogs.com/hiyang/p/14803391.html 文件数 4071 个,共3.8G 复制389-ds-base-1.3.10.2-6.el7.x86_64. ...