配置文件参数化
把Spring配置文件中需要经常修改的字符串信息,转移到一个更小的配置文件中
Spring的配置文件中存在哪些需要经常修改的字符串?
- 存在以数据库连接相关的参数代表
经常变化字符串,在Spring的配置文件中,直接修改
- 不利于项目维护(修改)
转移到一个小的配置文件( .properties)
- 利于维护(修改)
配置文件参数化: 利于Spring配置文件的维护(修改)
开发步骤
-
提供一个小的配置文件(.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}获取小配置文件中对应的值
注意:
Maven项目下 java与resource是平级的,故下面的文件也是平级的
自定义类型转换器
1、类型转换器
作用:Spring通过类型转换器把配置文件中字符串类型的数据,转换成了对象中成员变量对应类型的数据,进而完成了注入
2、自定义类型转换器
原因:当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> :由String --> Date */ 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是一 个类型转换器
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;
}
}
<!--Spring创建MyDateConverter类型对象-->
<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(){
}
程序员实现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工厂中所有创建的对象进行加工。