博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springboot属性注入
阅读量:2161 次
发布时间:2019-05-01

本文共 2662 字,大约阅读时间需要 8 分钟。

SpringBoot的属性注入

在上面的案例中,我们实验了java配置方式。不过属性注入使用的是@Value注解。这种方式虽然可行,但是不够强大,因为它只能注入基本类型值。

在SpringBoot中,提供了一种新的属性注入方式,支持各种java基本数据类型及复杂类型的注入。

1)新建JdbcProperties,用来进行属性注入:

代码:

@ConfigurationProperties(prefix = "jdbc")public class JdbcProperties {    private String url;    private String driverClassName;    private String username;    private String password;    // ... 略    // getters 和 setters}
  • 在类上通过@ConfigurationProperties注解声明当前类为属性读取类

  • prefix="jdbc"读取属性文件中,前缀为jdbc的值。

  • 在类上定义各个属性,名称必须与属性文件中jdbc.后面部分一致,并且必须具有getter和setter方法

  • 需要注意的是,这里我们并没有指定属性文件的地址,SpringBoot默认会读取文件名为application.properties的资源文件,所以我们把jdbc.properties名称改为application.properties

2)在JdbcConfiguration中使用这个属性:

  • 通过@EnableConfigurationProperties(JdbcProperties.class)来声明要使用JdbcProperties这个类的对象

  • 然后你可以通过以下方式在JdbcConfiguration类中注入JdbcProperties:

    1. @Autowired注入

@Configuration@EnableConfigurationProperties(JdbcProperties.class)public class JdbcConfiguration {    @Autowired    private JdbcProperties jdbcProperties;    @Bean    public DataSource dataSource() {        DruidDataSource dataSource = new DruidDataSource();        dataSource.setUrl(jdbcProperties.getUrl());        dataSource.setDriverClassName(jdbcProperties.getDriverClassName());        dataSource.setUsername(jdbcProperties.getUsername());        dataSource.setPassword(jdbcProperties.getPassword());        return dataSource;    }}

构造函数注入

@Configuration@EnableConfigurationProperties(JdbcProperties.class)public class JdbcConfiguration {    private JdbcProperties jdbcProperties;    public JdbcConfiguration(JdbcProperties jdbcProperties){        this.jdbcProperties = jdbcProperties;    }    @Bean    public DataSource dataSource() {        // 略    }}

@Bean方法的参数注入

@Configuration@EnableConfigurationProperties(JdbcProperties.class)public class JdbcConfiguration {    @Bean    public DataSource dataSource(JdbcProperties jdbcProperties) {        // ...    }}

本例中,我们采用第三种方式。

大家会觉得这种方式似乎更麻烦了,事实上这种方式有更强大的功能,也是SpringBoot推荐的注入方式。两者对比关系:

优势:

  • Relaxed binding:松散绑定

    • 不严格要求属性文件中的属性名与成员变量名一致。支持驼峰,中划线,下划线等等转换,甚至支持对象引导。比如:user.friend.name:代表的是user对象中的friend属性中的name属性,显然friend也是对象。@value注解就难以完成这样的注入方式。

    • meta-data support:元数据支持,帮助IDE生成属性提示(写开源框架会用到)。

更优雅的注入

事实上,如果一段属性只有一个Bean需要使用,我们无需将其注入到一个类(JdbcProperties)中。而是直接在需要的地方声明即可:

@Configurationpublic class JdbcConfiguration {        @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方法!

转载地址:http://gzuzb.baihongyu.com/

你可能感兴趣的文章
【LEETCODE】82- Remove Duplicates from Sorted List II [Python]
查看>>
【LEETCODE】86- Partition List [Python]
查看>>
【LEETCODE】147- Insertion Sort List [Python]
查看>>
【算法】- 动态规划的编织艺术
查看>>
用 TensorFlow 让你的机器人唱首原创给你听
查看>>
对比学习用 Keras 搭建 CNN RNN 等常用神经网络
查看>>
深度学习的主要应用举例
查看>>
word2vec 模型思想和代码实现
查看>>
怎样做情感分析
查看>>
用深度神经网络处理NER命名实体识别问题
查看>>
用 RNN 训练语言模型生成文本
查看>>
RNN与机器翻译
查看>>
用 Recursive Neural Networks 得到分析树
查看>>
RNN的高级应用
查看>>
TensorFlow-7-TensorBoard Embedding可视化
查看>>
一个隐马尔科夫模型的应用实例:中文分词
查看>>
轻松看懂机器学习十大常用算法
查看>>
一个框架解决几乎所有机器学习问题
查看>>
特征工程怎么做
查看>>
机器学习算法应用中常用技巧-1
查看>>