📖本文目录
📝SSM框架整合Druid由浅入深到SpringBoot接管Druid配置
🙊1、这又是一篇如何进行自学的文章~
接着昨天
那篇如何自学官方文档以及对应源码
,进行配置
等方法还是得到了很多小伙伴的认可,但是如何牢固这种思想
并且在后续的前后端分离项目
中,对我们想要客制化的配置
进行编写@Configuration
并将其注入到IOC容器
中呢?这是比较困难的,也是比较浪费时间去学习,但是当你掌握了一种所谓的套路
之后,这些配置简直是如鱼得水
,客制化配置会让你的项目让人眼前一亮
,我们就是要培养如何去自我进行配置的能力
,小付今天在举一个比较常用的配置来让大家熟悉
,后续还会可能对SpringSecurity
的自定义配置进行接管
,我也相信这篇文章能将你带入这个门
,多多少少会有不少收获的。
📚 2、Spring注解接管到SpringBoot接管
⭐1、Spring接管控制
我们需要先熟悉下以前在Spring中注入配置组件的配置注解:
@Configuration
:声明当前类为配置类代替xml文件。
@Bean
:声明在方法上,将方法返回的对象注入到IOC容器当中,代替bean标签
@value
:属性注入
@PropertySource
:指定外部属性文件。
自己编写一个由Spring整合Druid的配置类,将其注入而非采用xml方式进行注入配置
DruidConfig.java
/**
* 功能描述
*
* @author Alascanfu
* @date 2022/1/25
*/
@Configuration
@PropertySource("classpath:db.properties")
public class DruidConfig {
@Value("${jdbc.driverClassName}")
String driverClassName;
@Value("${jdbc.url}")
String url;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
@Bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
- 利用
@Configuration注解添加到DruidConfig类
上,使其成为
Spring中的配置类
,将其注入到IOC容器
当中。 @PropertySource
:将外部的配置文件中的属性导入其中
,当然SpringBoot
后面采用的是xxxProperty.class
用来使其可以在配置文件中配置
,这里先不讲后面再叙述。@Value将我们外部配置文件中的属性的值注入到配置类属性
中- 通过
@Bean
注解将DataSource对象返回注入到IOC容器中
,这样就可以完成替代配置文件中的配置
了。
咱们通过debug来看看咱们的IOC容器中是否有已经配置好的DruidDataSource
@Controller
@ResponseBody
public class DruidController {
@Autowired
DataSource dataSource ;
@RequestMapping("/dataSource")
public String dataSource(){
System.out.println(dataSource);
return dataSource.toString();
}
}
看到没 Druid
的数据源配置已经被我们导入了QwQ
小付这里是因为连接的自己购买的阿里云服务器所以就en大家都懂的
~
同样也看到了我们配置的属性了。
上述便是在Spring中通过注解来配置了数据源,我们只需要更改db.properties中的属性值,就可以对我们的数据进行改写。
⭐2、SpringBoot接管配置⭐
还没有学过SpringBoot的自动装配原理的同学看看这里哦
~
SpringBoot的自动装配原理——其实真得就是你想的那么简单~
读过上述文章的同学一定了解了@ConfigurationProperties
这个注解干了一件多么伟大的事情,他不仅会在咱们的application.properties|application.yaml
文件中去寻找前缀为"xxx"的配置,还能将其替代@Value属性
注入其中。
那咱们来试试~
DruidProperties.java
@ConfigurationProperties(prefix = "jdbc")
public class DruidProperties {
private String driverClassName;
private String url ;
private String username;
private String password;
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
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;
}
}
不过有可能会出现爆红等
那咱们就点进去看看如何解决这个SpringBoot
引起的问题。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
将上述代码添加到对应的pom.xml文件中再试试。
此时就没有报错啦qwq
DruidAutoConfiguration.java
@Configuration
@EnableConfigurationProperties(DruidProperties.class)
public class DruidAutoConfiguration {
@Autowired
DruidProperties druidProperties;
@Bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(druidProperties.getDriverClassName());
dataSource.setUrl(druidProperties.getUrl());
dataSource.setUsername(druidProperties.getUsername());
dataSource.setPassword(druidProperties.getPassword());
return dataSource;
}
}
application.properties
jdbc.username=root
jdbc.password=123456
jdbc.url=jdbc:mysql://localhost:3306/springboot?serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useUnicode=true
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
此时进行DEBUG测试
,你再来看看是否将其注入到IOC容器了呢?
答案是肯定的,那肯定会有小伙伴问了,上述这些配置不是反而更加复杂了么?为什么还要说SpringBoot简化了配置呢???
- 事实上只看到了表面,官网也给出了优点:
松散绑定
的配置让我们的软件框架
更加灵活多变~,
这就是SpringBoot的强大之处`。
在官方文档也在克制化的最后2.8Type-safe Configuration Properties中给出了对应的比较
@ConfigurationProperties
支持元数据的同时还RelaxedBinding
这也就是松散绑定
了。这就是他的优点以及好处
,可能在小的项目中无法体现,但是当你看到了SpringBoot的自动装配原理中
就是这样应用的
,你就知道了他的强大之处
了。
- Relaxed binding:松散绑定
不严格要求
属性文件中的属性名与成员变量名一致
。支持驼峰
,中划线
,下划线
等等转换,甚至支持对象引导
。比如:user.friend.name
:代表的是user对象中的friend属性中的name属性
,显然friend也是对象
。@value注解就难以完成这样的注入方式
。下列方式定义的配置文件也可以读取成成员变量driverClassName
properties
jdbc.driver_Class_Name=com.mysql.jdbc.Driver
yaml
jdbc:
driver-class-name: com.mysql.jdbc.Driver
实际开发中的简化方式
当我们所在配置yaml文件中编写的属性只有一个Bean需要
时,我们可以直接将其注入到返回注入Bean的方法
当中将其注入。
注意该方法的使用前提是在对应属性存在set方法成立。
@Configuration
public class DruidAutoConfiguration {
//SpringBoot会自动将与之对应的属性通过set方法进行注入到数据源中
@Bean
@ConfigurationProperties(prefix = "jdbc")
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
return dataSource;
}
}
🙊3、学习总结
上述的进行对Druid配置
还可以根据Druid的github仓库中进行学习配置
,不单单是简单的连接数据库的四大属性
,也可以对其他属性进行设置
,池化技术
中的最小连接数
,最大连接数
等等都可以进行配置
,再按照上述的方法,先构建好一个xxxProperties
的类用于支持xml文件中进行属性配置
,在属性注入完毕
之后,我们再通过构建xxxAutoConfiguration
进行自动装配,将创建好的对象注入到IOC容器
当中,SpringBoot
原来已经配置好的自动装配类
就会因为@ConditionOnMissingBean
使其自己失效
。这样一来我们进行的配置就会返回好咱们已经配置好的装配内容
了。小付强烈推荐大家可以试试自己客制化一下SpringSecurity的自动配置
来进行接管权限控制
,会有不一样的天地哦,同时这样也可以加强学习SpringBoot的理解
。如果你不着急可以等着小付更新到那里去哦~,已经写了好几天那个玩意了,头发已经不止掉了两根了
QwQ冲冲冲,时间会给你的成果画上圆满的句号的
。