这波 SpringFramework5.x 我先干了(工厂高级特性-十到十三)

十、对象的生命周期

1.什么是对象的生命周期

指的是一个对象创建、存活、消亡的一个完整过程

2.为什么要学习对象的生命周期

由Spring负责对象的创建、存活、销毁,了解生命周期有利于我们使用好Spring为我们创建的对象

3.生命周期的三个阶段

  • 创建阶段
    Spring工厂何时创建对象
	scope="singleton"
	Spring工厂创建的同时,对象创建
	注意:设置scope=singleton 这种情况下,也需要在获取对象的同时创建对象,需要进行懒初始化加上下面的标签属性
	<bean lazy-init=true/>
	--------------------------------------------------------
	scope="prototype"
	Spring工厂会在获取对象的同时,创建对象
	application.getBean("")时创建对象  
  • 初始化阶段
    1)Spring工厂在创建完对象后,调用对象的初始化方法 完成对应的初始化操作
    ①、初始化方法提供:程序员根据需求,提供初始化方法,最终完成初始化操作
    ②、初始化方法调用:Spring工厂进行调用
	InitializingBean接口
	public void afterProperitesSet(){
	}
	---------------------------------------
	对象中提供一个普通的方法
	public void myInit(){
	}
	如何让Spring调用我们提供的普通方法呢?我们在标签中加一个 init-method="方法名"属性
	<bean id="xxx"  class="xxx.xxx.xx"  init-method="方法名"/>

2)细节分析
①、如果一个对象即实现了InitializingBean同时又提供了普通的初始化方法 顺序

InitializingBean----👉普通初始化方法

②、注入一定发生在初始化操作的前面

after Properties Set

③、什么叫做初始化操作

资源的初始化:数据库 IO 网络 。。。。

  • 销毁阶段

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

  • DisposableBean接口
   继承接口实现destroy方法
   @Override
   public void destroy() throws Exception {
   }
  • 定义一个普通的销毁方法
  自定义普通销毁方法
  public void myDestroy() throws Exception {
  }
  <bean id="xxx" class="xxx.xxx.xxx" destroy-method="myDestroy"/>
  • 细节分析

1.销毁方法的操作只适用于scope=”singleton“
2.什么叫做销毁操作
主要指的是资源的释放操作 io.close()、connection.close();

  • 总结
    在这里插入图片描述

十一、配置文件参数化

把Spring配置文件中需要经常修改的字符串信息转移到一个更小的配置文件中
——————————————————————————————————
1.Spring的配置文件中存在需要经常修改的字符串?
存在 以数据库连接相关的参数 代表


2.经常变化字符串,在spring的配置文件中直接修改
不利于项目维护(修改)


3.转移到一个小的配置文件(.properyties)
利于维护(修改)
配置文件参数化:利于Spring配置文件的维护(修改)
1.配置文件参数的开发步骤

  • 提供一个小的配置文件(.properties)
   名字:随便
   放置位置:随便
   
   	jdbc.driverClassName = com.mysql.jdbc.Driver
   	jdbc.url =  jdbc:mysql://localhost:3306/log?useSSL=false
   	jdbc.username = root
   	jdbc.password = 123456

  • Spring的配置文件与小配置文件进行整合
applicationContext.xml
<context:property-placeholder location="classpath:/db.properties"/>
  • 在Spring配置文件中通过${key}获取小配置文件中对应的值
    在这里插入图片描述

十二、自定义类型转换器

1.类型转换器

作用:Spirng通过类型转换器把配置文件中字符串类型数据,转换成了对象中成员变量对应数据类型的数据,进而完成了注入
在这里插入图片描述
2.自定义类型转换器
原因:当Spring内部没有提供特定类型转换器时,而程序员在应用的过程中还需要使用,那么就需要程序员自定义类型转换器。

  • 类实现Converter接口
public class MyConverter implements Converter<String,Date> {
    /*
        convert方法作用: String-->Date
                      SimpleDateFormat sdf=new SimpleDateFormat();
                      sdf.parset(String)-->Date
        param:source 代表的是配置文件中  日期字符串<value>2021-01-01</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="myConverter" class="xxx.MyDateConverter"  />
      
    • 类型转换器的注册

      目的:告知Spring框架,我们所创建的MyDateConverter是一个类型转换器
      	  <!--用于注册类型转换器-->
      <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
      <property name="converters">
          <set>
              <ref bean="myConverter" />
          </set>
      </property>
      
      

3.细节

  • MyDateConverter中的日期格式,通过依赖注入的方式由配置文件完成赋值。
public class MyConverter implements Converter<String,Date> {
    /*
        convert方法作用: String-->Date
                      SimpleDateFormat sdf=new SimpleDateFormat();
                      sdf.parset(String)-->Date
        param:source 代表的是配置文件中  日期字符串<value>2021-01-01</value>
        return : 当把转换好的Date作为convert方法的返回值后,Spring自动的为birthday属性进行注入(赋值)

    * */
    private String pattern;

    public String getPattern() {
        return pattern;
    }

    public void setPattern(String pattern) {
        this.pattern = pattern;
    }
    @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;

    }
}
	 <bean id="myConverter" class="com.myspring.converter.MyConverter" >
        <property name="pattern" value="yyyy-MM-dd" />
    </bean>
  • ConversionServiceFactoryBean定义id属性值必须是 conversionService

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

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

十三、后置处理Bean

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

AOP底层实现:选用了大量的类似BeanPostProcessor接口的方式
	注意:BeanPostProcessor接口
	xxx(){
	
		}
  • 后置处理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 {
            Category category =(Category) bean;
            category.setName("bugz");
            return bean;
        }
    }
    

    2.Spring的配置文件中进行配置

    <bean id="myBeanPostProcessor" class="xxx.MyBeanPostProcessor" />
    

    3.BeanPostProcessor细节

    BeanPostProcessor会对Spring工厂中所有创建的对象进行加工。
    如果只想对某种类型的对象进行改变那么可以使用👇这种方式做出相应的改变。
    if(bean instanceof 对象类型){
    }
    return bean;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值