配置文件参数化、类型转换器

文章目录

    • 配置文件参数化
      • 配置文件参数的开发步骤
    • 自定义类型转化器
      • 1、类型转换器
      • 2、自定义类型转换器
          • 为什么需要自定义
          • 开发步骤
          • 细节

配置文件参数化

把 Spring 配置文件中需要经常修改的字符串信息,转移到一个更小的配置文件中
1. Spring 的配置文件中存在经常修改的字符串吗?
		存在,以数据库连接相关的参数为代表
2. 经常变化字符串,为什么不在Spring配置文件中直接修改?
		不利于项目维护(修改)---》配置文件一般很多,上千行,不易找
3. 转移到一个小的配置文件(.properties)
		这样更加利于维护(修改)

配置文件参数的开发步骤

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

    # 名字:无要求
    # 位置:无要求
    # 为了可读性,此文件名为db.properities
    jdbc_driver = com.mysql.jdbc.Driver
    jdbc_url = jdbc:mysql://localhost:3306/dzf
    jdbc_username = root
    jdbc_password = root
    
  • Spring 的配置文件与小配置文件进行整合

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

    配置文件参数化、类型转换器_第1张图片

自定义类型转化器

1、类型转换器

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

配置文件参数化、类型转换器_第2张图片

2、自定义类型转换器

为什么需要自定义
  • 我们为什么需要自定义:当 Spring 内部没有提供特定类型转换器时,而开发者有需要使用,那么程序员就得自定义类型转换器。
//我们有一个学生类,其中一个属性是 Date 类型的
public class Student {
    private String name;
    private Date birthday;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}

<bean id="stu" class="cf.duanzifan.entity.Student">
    <property name="name" value="张三"/>
    <property name="birthday" value="2020-1-1"/>
bean>
//在测试类中测试 是否 注入成功?
public class Test4 {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/applicationContext1.xml");
        Student student = (Student) applicationContext.getBean("stu");
        System.out.println(student);
    }
}

然后我们发现会报错(字符串 向 Date类型 转换失败)

image-20200705183523599

开发步骤
  • 定义一个类实现 Converter 接口

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

    1. 在 Spring 中将 MyDateConverter 对象创建出来

      <bean id="myDateConverter" class="cf.duanzifan.converter.MyDateConverter"/>
      
    2. 类型转换器的注册

      1. 目的:告知 Spring 框架,我们创建的 MyDateConverter 是一个类型转换器
      
      
      <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
          <property name="converters">
              <set>
                  <ref bean="myDateConverter"/>
              set>
          property>
      bean>
      
细节
  • MyDateConverter 日期格式 解耦合

    public class MyDateConverter implements Converter<String, Date> {
    
        String pattern;//将日期格式作为成员变量,在Spring配置文件中set注入可以解耦合
    
        public String getPattern() {
            return pattern;
        }
    
        public void setPattern(String pattern) {
            this.pattern = pattern;
        }
    
        @Override
        public Date convert(String s) {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
            Date date = null;
            try {
                date = simpleDateFormat.parse(s);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return date;
        }
    }
    
    <bean id="myDateConverter" class="cf.duanzifan.converter.MyDateConverter">
        <property name="pattern" value="yyyy-MM-dd">property>
    bean>
    
  • ConversionServiceFactoryBean 定义 id 属性值必须是 conversionService

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

    1. 日期格式 : 2020/01/01 (不支持其他格式)
    

你可能感兴趣的:(Spring,框架)