引言
-
在上一篇博客中,主要是一个 Spring Boot 框架下的 Demo,在上个案例中,从头到尾都没有除了引入 Spring Boot 框架所需要的步骤外,没有进行任何有关一个 web 项目运行需要的各种依赖,xml文件的配置等
-
但是,按照传统思路,如果需要配置一个数据库连接池的 Bean,需要输入一些数据库相关的信息如 url,username,password 等信息应该如何处理?
-
在传统的方式中,我们需要在 Bean 中添加以下的内容来配置数据库连接池相关的部分
<!-- 配置连接池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean>
-
而在 Spring Boot 中,我们才用了另一种方式来替代这种传统的方式:注解
Spring 历史
- Spring 1.0 时代
此时,JDK 1.5 方兴,在开发中使用注解的方式并未流行,此时更多的开发者选择使用 xml 的方式配置各种 bean - Spring 2.0 时代
Spring 开发中,已经引入了注解开发,但此时注解开发不尽完善,虽然有所使用,但并未完全替代 xml方式,此时开发者更多的选择是将这两者结合,在之前学习的 SSM 等方式中,就是采用注解和 xml 结合的方式 - Spring 3.0 时代
3.0 时代以后,注解开发已经非常完善,Spring 官方也更多的推荐使用 Java 内配置的方式来替代旧有的 xml 方式,但是在国内并未推广开来。直到 Spring Boot 框架的流行,Java 配置才越来越多的被使用 - Spring 现在版本
我们常用的 Spring Framework 已经来到了 5.0 时代
Spring Boot 也已经来到了 2.0 时代
甚至官方网站主页都更推崇使用 Spring Boot 等最新的开发方式
测试 Java 配置
- Java 配置主要是通过一些 Java 类 + 注解的方式来实现,较为常用的注解有
- @Configuration:声明一个类作为配置类,代替xml文件
- @Bean:声明在方法上,将方法的返回值加入Bean容器,代替标签
- @value:属性注入
- @PropertySource:指定外部属性文件
- 首先引入Druid连接池依赖
- 创建一个jdbc.properties文件,编写jdbc属性
- 编写一个类来替代 xml 文件
- 于这个类内配置
- 对于 5 中代码的解读
- @Configuration:声明 JdbcConfig 是一个配置类
- @PropertySource:指定属性文件的路径是: classpath:jdbc.properties
- 通过@Value为属性注入值
- 通过@Bean将 dataSource()方法声明为一个注册Bean的方法,Spring会自动调用该方法,将方法的返回值加入 Spring 容器中
- 至此,就可以在任意位置通过@Autowired注入DataSource了
- 我们在TestController中进行加入断点,进行 Debug 模式测试,观察这种注入值的方式是否成功
- 观察运行情况
- 可以发现,通过这种方式可以成功注入属性值
Spring Boot 提供的属性注入方式
- 在上文中,我们是用的是 Spring 自带自带的 @Value 注解方式。
通过 @Value 注解可以成功的注入属性,但使用 @Value 注解有一个弊端,即 @Value 注解只能注入基本数据类型的值。 - 在 Spring Boot 框架中继承了这一方式,并对它进行了优化,支持任意数据类型值的注入
方式一
- 新建属性注入类
解读:
- @ConfigurationProperties注解:声明当前类为属性读取类
- @Data 注解:在类之上加此注解,会自动生成所有属性的 getter,setter,tostring 等方法
- 这里并未对读取类的路径做出说明,是因为将 jdbc.properties 名称改为 application.properties 之后,Spring Boot 默认就会读取这个文件(固定写法)
- 在类上定义各个属性,名称必须与属性文件中jdbc.后面部分一致,我们在 @ConfigurationProperties 注解中加入了前缀,这里为除去前缀之后的名称,如图
- 在JdbcConfig中使用这个属性
解读:
- @EnableConfigurationProperties(JdbcProperties.class)来声明要使用JdbcProperties这个类的对象
- @Configuration:声明这个文件是一个配置类
- @Bean:声明有@Bean的方法参数注入
- 测试结果
- @ConfigurationProperties 注解和 @Value
方式二
- 事实上,方式一是针对于一个配置属性,多个地方都会调用的情况下。但是如果一段属性事先已经可以预知仅会被一个 Bean 所使用,那么,针对方式一就有了更多的优化
- 即可直接在需要使用的地方声明即可
解读:
- 这种方法使用的前提:一段属性仅会被一个 Bean 使用
- 仅需要 @ConfigurationProperties 注解,就会自动找到 application 中前缀为 jdbc ,且是 DataSource 类型内是否有以 jdbc 为前缀的属性的相对应的 set 方法,如果有,则自动配置
总结
- 这篇博文主要是关于如何使用 Java 配置的方式替代 xml 配置
- 以及使用 Spring Boot 框架之后,在原生 Java 属性输入注解 @Value 的基础上扩展出来的两种方法
- 几个重要的注解:
- @Configuration:声明这是一个配置类,替代 xml
- @Bean:声明在方法上,将方法的返回值加入Bean容器,代替< bean >标签
- @ConfigurationProperties:声明当类为属性读取类(当属性类名为 application.properties 时,Spring Boot 会作为默认类进行读取,此时无需声明路径)
- @ConfigurationProperties(prefix = “???”):prefix="jdbc"读取属性文件中,前缀为 ??? 的值
- @Data:写在 POJO 类前,相当于getter,setter,equals(),hashCode(),toString()等全部方法