spring全注解配置
spring
全注解配置主要靠
java
类和一些注解,比较常用的注解有:
@Configuration
:声明一个类作为配置类,代替
xml
文件
@Bean
:声明在方法上,将方法的返回值加入
Bean
容器,代替
<bean>
标签
@value
:属性注入
@PropertySource
:指定外部属性文件,
我们接下来用
java
配置来尝试实现连接池配置:
首先引入
Druid
连接池依赖
<dependency>
groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
创建一个
jdbc.properties
文件,编写
jdbc
属性
:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/lxs
jdbc.username=root
jdbc.password=123
然后编写代码:
@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig {
@Value("${jdbc.url}")
String url;
@Value("${jdbc.driverClassName}")
String driverClassName;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setDriverClassName(driverClassName);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
解读:
声明我们
JdbcConfig
是一个配置类
@PropertySource
:指定属性文件的路径是
:
classpath:jdbc.properties
通过
@Value
为属性注入值
通过
@Bean
将
dataSource()
方法声明为一个注册
Bean
的方法,
Spring
会自动调用该方法,将方法的返回值
加入
Spring
容器中。默认的对象名
id=
方法名,可以通过
@Bean("
自定义名字
")
,来指定新的对象名
然后我们就可以在任意位置通过
@Autowired
注入
DataSource
了!
我们在
HelloController
中测试:
@RestController
public class HelloController {
@Autowired
private DataSource dataSource;
@GetMapping("hello") public String hello() {
return "hello, spring boot!" + dataSource;
}
}
然后
Debug
运行并查看:
springBoot全注解配置
在上面的案例中,我们实现了
spring
配置方式。不过属性注入使用的是
@Value
注解。这种方式虽然可行,但是不够 强大,因为它只能注入基本类型值。
在
SpringBoot
中,提供了一种新的属性注入方式,支持各种
java
基本数据类型及复杂类型的注入。
1
)我们新建一个
属性配置类
,用来进行属性注入:
package com.lxs.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix ="jdbc")
public class JdbcProperties {
private String url;
private String driverClassName;
private String username;
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
private String password;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
在类上通过
@ConfifigurationProperties
注解声明当前类为属性读取类
prefix="jdbc"
读取属性文件中,前缀为
jdbc
的值。
在类上定义各个属性,名称必须与属性文件中
jdbc.
后面部分一致
需要注意的是,这里我们并没有指定属性文件的地址,所以我们需要把
jdbc.properties
名称改为
application.properties
,这是
SpringBoot
默认读取的属性文件名.
文件的创建路径:
蓝色的为spring全注解配置的类。
其他的为springBoot全注解配置的类。
既然有读取的属性的类,那么读取的属性读完,还得交给其他的类使用干活。
在
JdbcBootCoifig类
中使用这个属性:
package com.lxs.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcBootConfig {
//默认的对象名是方法的名字 也可以通过输入指定方法的名字下面是例子
@Bean
public DataSource dataSource(JdbcProperties jdbc) {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(jdbc.getUrl());
dataSource.setDriverClassName(jdbc.getDriverClassName());
dataSource.setUsername(jdbc.getUsername());
dataSource.setPassword(jdbc.getPassword());
return dataSource;
}
}
通过
@EnableConfigurationProperties(JdbcProperties.class)
来声明要使用
JdbcProperties
这个类的对 象。
然后你可以通过以下方式注入
JdbcProperties
:
1.
@Autowired
注入
@Autowired private
JdbcProperties prop;
2.构造函数注入
private JdbcProperties prop;
public JdbcConfig(Jdbcproperties prop){
this.prop = prop;
}
3.声明有@Bean的方法参数注入
@Bean
public Datasource dataSource(JdbcProperties prop){
// ...
}
本例中,我们采用第三种方式。
测试结果与spring全配置基本相同。
大家会觉得这种方式似乎更麻烦了,事实上这种方式有更强大的功能,也是
SpringBoot
推荐的注入方式。两者对比 关系:
Relaxed binding
:松散绑定
不严格要求属性文件中的属性名与成员变量名一致。支持驼峰,中划线,下划线等等转换,甚至支持对 象引导。
比如:user.friend.name
:代表的是
user
对象中的
friend
属性中的
name
属性,显然
friend
也是对象。@value
注解就难以完成这样的注入方式。
meta-data support
:元数据支持,帮助
IDE
生成属性提示(写开源框架会用到)。
springBoot更优雅的注入
事实上,如果一段属性只有一个
Bean
需要使用,我们无需将其注入到一个类(
JdbcProperties
)中。而是直接在需 要的地方声明即可:
@Configuration
public class JdbcConfig {
@Bean
// 声明要注入的属性前缀,SpringBoot会自动把相关属性通过set方法注入到DataSource中
@ConfigurationProperties(prefix = "jdbc")
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
return dataSource;
}
}
我们直接把
@ConfigurationProperties(prefix = "jdbc")
声明在需要使用的
@Bean
的方法上,然后
SpringBoot 就会自动调用这个Bean
(此处是
DataSource
)的
set
方法,然后完成注入。使用的前
提是:
该类必须有对应属性的
set
方法!
DruidDataSource类的内部方法:
由此可见是有get,和set方法的。
优雅的注入:
三部分:
1.application.properties文件 2.带有 @Configuration 注解的配置类 3.@ConfigurationProperties(prefix = "jdbc")
要求:属性文件中的名称 要和set方法中的属性 相同。
注入完成后,在controller类中使用 controller类中自动装载类 @Autowired private DataSource dataSource;