SpringBoot有个很好的特性,即开箱即用,只要引入对应的starter组件,使用@Autowired注解即可实例化Bean,那原理是怎么的呢?先通过手写一个简单的数据库连接的组件了解步骤,再通过代码看原理。
总体步骤:
1.创建配置类
2.创建Bean
3.创建自动装配类,导入配置类
4.spring.factories配置自动装配类
具体步骤
1 . 创建XXXProperties 在此类上添加@ConfigurationProperties注解
说明:@ConfigurationProperties是springboot提供读取配置文件的一个注解。其对应的bean的后置处理器为ConfigurationPropertiesBindingPostProcessor,支持属性文件和javaBean的映射,它是实现了BeanPostProcessor接口,在bean被实例化后,会调用后置处理,递归的查找属性,通过反射注入值,对大多数属性而言强制需提供其setter和getter方法
设置配置文件中可以设置的属性,prefix设置前缀
@ConfigurationProperties(prefix="xiaohou.datasource")
public class DataSourceProperties {
private String driver;
private String userName;
private String passWord;
private String url;
...
//getter and setter
2.创建数据库连接的Bean,并提供基本属性和方法
数据库连接需要有数据库驱动,用户名,密码,url
public class DataSourceConnection {
private String driver;
private String userName;
private String passWord;
private String url;
private Connection connection=null;
public DataSourceConnection(String driver, String userName, String passWord, String url) {
this.driver = driver;
this.userName = userName;
this.passWord = passWord;
this.url = url;
try {
//1.注册数据库驱动
Class.forName(driver);
//2.获得连接
connection =DriverManager.getConnection(url,userName,passWord);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获得数据库连接
*/
public Connection getConnection() {
return connection;
}
/**
* 关闭数据库连接
*/
public void closeConnection(){
try {
if(connection!=null) {
connection.close();
}
} catch (SQLException e) {
System.out.println("连接关闭异常!");
System.exit(0);
}
}
}
3.创建自动装配类:XXXAutoConfiguration,添加@Configuration、@EnableConfigurationProperties注解,导入对应的配置类
在这里将DataSourceConnection加载到spring容器中,只有先加载到容器中才能通过@Autowired进行实例化。
@Configuration
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
private final DataSourceProperties dataSourceProperties;
public DataSourceAutoConfiguration(DataSourceProperties dataSourceProperties) {
this.dataSourceProperties = dataSourceProperties;
}
//将DataSourceConnection加载到IOC容器中
@Bean
public DataSourceConnection dataSourceConnection(DataSourceProperties dataSourceProperties){
DataSourceConnection dataSourceConnection = new DataSourceConnection(dataSourceProperties.getDriver(),dataSourceProperties.getUserName(),
dataSourceProperties.getPassWord(),dataSourceProperties.getUrl());
return dataSourceConnection;
}
}
4.META-INF/spring.factories中配置上自动装配类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.xiaohou.spring.boot.starter.jdbc.DataSourceAutoConfiguration
以上是创建starter的组件。如果希望application.properties在配置数据库连接时有提示可以在
META-INF/additional-spring-configuration-metadata.json中配置属性
{
"properties": [
{
"name": "xiaohou.datasource.driver",
"type": "java.lang.String",
"description": "数据库驱动",
"defaultValue": "com.mysql.jdbc.Driver"
},
{
"name": "xiaohou.datasource.userName",
"type": "java.lang.String",
"description": "数据库用户名"
},
{
"name": "xiaohou.datasource.passWord",
"type": "java.lang.String",
"description": "数据库密码"
},
{
"name": "xiaohou.datasource.url",
"type": "java.lang.String",
"description": "数据库URL"
}
]
}
1.创建SpringBoot项目并引入刚刚写好的starter组件
pom.xml文件中引入写好的组件,因为是mysql的连接,还需要导入mysql的驱动。
2.application.properties或yml中配置相关属性
xiaohou.mybatis.config-location=88888
xiaohou.datasource.driver=com.mysql.jdbc.Driver
xiaohou.datasource.userName=root
xiaohou.datasource.passWord=123QWEasd
xiaohou.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
3.创建HelloController,通过@Autowired将DataSourceConnection实例化,调用getConnection获得数据库连接
验证是否可以访问成功