目录
配置文件参数化;
---就是额外的配置文件
比如jdbc的连接参数,在代码直接写。不太好,修改的时候,涉及到了修改代码。耦合性高。
依赖注入:Connection对象依赖这四个参数,那么就把它当做属性。这些参数涉及到了频繁修改,所以需要参数化。
1,提供一个小配置文件(properties文件)名字随便,位置随便(推荐resource下)。
2,spring配置文件和小配置文件的整合。
Java类
public class ConnectionFactory implements FactoryBean<Connection> {
private String driver;
private String url;
private String username;
private String password;
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
//获得对象的代码
@Override
public Connection getObject() throws ClassNotFoundException {
Class.forName(driver);
Connection conn = null;
try {
conn = DriverManager.getConnection(url,username,password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//获得对象的class类型
@Override
public Class<?> getObjectType() {
return Connection.class;
}
//默认是true,表示获取的是单例
// 是否是单例对象
@Override
public boolean isSingleton() {
return false;
}
}
XML中
<!--配置文件引入-->
<context:property-placeholder location="classpath:mysql.properties"/>
<bean id="conn" class="begin.ConnectionFactory">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
外部配置文件mysql.properties
jdbc.driver = com.mysql.cj.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/demo?serverTimezone=UTC
jdbc.password = 1234
jdbc.username = root
test代码:
@org.junit.Test
public void test4(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
Connection conn = (Connection) ctx.getBean("conn");
System.out.println(conn);
}
结果:
类型转换器:
spring的配置文件中的value标签是8种基本类型。
为什么可以把字符串转赋值给各种数据类型呢?spring内置类型转换器,即通过反射得到各类属性的类型,然后通过各种判断,类型转换得到。
自定义类型转换器?比如说 2020-08-20 12:12:12这样的类型spring不支持。
自己定义。
1,创建一个类,实现Converter<T,R>接口。T表示传参类型,R表示返回数据类型。spring自动地为R的属性注入。
org.springframework.core.convert.converter.Converter
public class ConvertDate implements Converter<String, Date> {
@Override
public Date convert(String s) {
Date ret = null;
try {
ret =new SimpleDateFormat("yyyy-MM-dd").parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return ret;
}
}
2,在spring配置文件中进行配置(实例化对象转换器)。
首先把对象转换器进行实例化--bean
3,注册类转换器。目的:告诉spring,我们自定义了一个类型转换器。
<!--先实例化类型转化器-->
<bean id="dateConvert" class="begin.ConvertDate"></bean>
<!-- 注册类型转化器 这个id不能变,必须是这个id,因为spring框架默认引用此id进行处理-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<!-- 该类中有此属性,且是一个set-->
<property name="converters">
<set>
<ref bean="dateConvert"/>
</set>
</property>
</bean>
<bean id="person" class="begin.Person">
<property name="name" value="alice"/>
<property name="age" value="18"/>
<property name="birthday" value="2020-12-20"/>
</bean>
结果:
spring内部默认的日期类型转换器是处理类型- 2021/02/04 。以 ‘/’ 间隔的类型