Spring学习笔记:配置文件参数化、自定义类型转换器、后置处理Bean

Spring笔记汇总

配置文件参数化、自定义类型转换器、后置处理Bean

  • 配置文件参数化
  • 自定义类型转换器
    • 1、类型转换器
    • 2、自定义类型转换器
    • 3、细节分析
  • 后置处理Bean

配置文件参数化

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

Spring的配置文件中存在哪些需要经常修改的字符串?

  • 存在以数据库连接相关的参数代表

经常变化字符串,在Spring的配置文件中,直接修改

  • 不利于项目维护(修改)

转移到一个小的配置文件( .properties)

  • 利于维护(修改)

配置文件参数化: 利于Spring配置文件的维护(修改)

Spring学习笔记:配置文件参数化、自定义类型转换器、后置处理Bean_第1张图片
开发步骤

  • 提供一个小的配置文件(.properities)

    名字 和 放置位置: 任意
    
    jdbc.driverClassName = com.mysql.cj.jdbc.Driver
    jdbc.url = jdbc:mysql://localhost:3306/test
    jdbc.username = root
    jdbc.password = 123456
    
  • Spring的配置文件与小配置文件进行整合

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

    Spring学习笔记:配置文件参数化、自定义类型转换器、后置处理Bean_第2张图片

注意:

Maven项目下 java与resource是平级的,故下面的文件也是平级的
Spring学习笔记:配置文件参数化、自定义类型转换器、后置处理Bean_第3张图片

自定义类型转换器

1、类型转换器

作用:Spring通过类型转换器把配置文件中字符串类型的数据,转换成了对象中成员变量对应类型的数据,进而完成了注入
Spring学习笔记:配置文件参数化、自定义类型转换器、后置处理Bean_第4张图片

2、自定义类型转换器

Spring学习笔记:配置文件参数化、自定义类型转换器、后置处理Bean_第5张图片

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

  • 类implements Converter接口

    • // S是配置文件赋予类型,T是想要转换成的类型
      implements Converter<S,T>
      
  • 在Spring的配置文件中进行配置

    • MyDateConverter对象创建出来
    package com.company.converter;
    
    import org.springframework.core.convert.converter.Converter;
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    /**
     * Converter :由String -->  Date
     */
    public class MyDateConverter implements Converter<String, Date> {
    
        /*
            convert方法作用: String ---> Date
                             SimpleDateFormat sdf = new SimpleDateFormat();
                             sdf.parset(String) ---> Date
    
            param:source代表的是配置文件中 日期字符串 2020-10-11
    
            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是一 个类型转换器
    • Spring学习笔记:配置文件参数化、自定义类型转换器、后置处理Bean_第6张图片
    • Spring学习笔记:配置文件参数化、自定义类型转换器、后置处理Bean_第7张图片

3、细节分析

MyDateConverter中的日期的格式,通过依赖注入的方式,由配置文件完成赋值。

public class MyDateConverter implements Converter<String, Date> {
    String pattern;

	get和set
        
    @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="myDateConverter" class="com.company.converter.MyDateConverter">
    <property name="pattern" value="yyyy-MM-dd"/>
bean>

ConversionSeviceFactoryBean定义id属性值必须conversionService

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

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

后置处理Bean

BeanPostProcessor作用: 对Spring工厂所创建的对象,进行再加工。
    
AOP底层实现:

注意: BeanPostProcessor接口
        xxxx(){

        }

Spring学习笔记:配置文件参数化、自定义类型转换器、后置处理Bean_第8张图片

程序员实现BeanPostProcessor规定接口中的方法:实现上图操作

实战中:
很少处理Spring的初始化操作:没有必要区分Before After。 只需要实现其中的一个After方法即可
注意:
    postProcessBeforeInitiallization
    return bean对象

BeanPostProcessor的开发步骤

1、类实现BeanPostProcessor接口

package com.company.beanpost;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.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 {

//        进行对象的保护
        if (bean instanceof Category){
            Category category = (Category)bean;
            category.setName("李四");
        }

        return bean;
    }
}

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

<bean id="category" class="com.company.beanpost.Category">
    <property name="id" value="1"/>
    <property name="name" value="张三"/>
bean>


<bean id="myBeanPostProcessor" class="com.company.beanpost.MyBeanPostProcessor"/>

3、BeanPostProcessor细节

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

代理设计模式

你可能感兴趣的:(spring)