SpringBoot 属性注入的方式

Spring的属性注入方式(以前的方式)

java配置主要靠java类和一些注解来达到和xml配置一样的效果,比较常用的注解有:

  • @Configuration:声明一个类作为配置类,代替xml文件
  • @Bean:声明在方法上,将方法的返回值加入Bean容器,代替<bean>标签
  • @Value:属性注入
  • @PropertySource:指定外部属性文件。在类上添加@PropertySource("classpath:/jdbc.properties")

我们接下来用以前配置来尝试实现连接池配置。

引入数据源连接依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.8</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.17</version>
</dependency>

resources下添加jdbc.properties

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/test
jdbc.username=root
jdbc.password=root

配置数据源

创建JdbcConfiguration类:使用spring中的value注解对每个属性进行注入,用bean注解将返回值添加到容器中

@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfiguration {
 
    @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;
    }
}
  • @Configuration:声明JdbcConfiguration是一个配置类;
  • @PropertySource:指定属性文件的路径是:classpath:jdbc.properties;
  • 通过@Value为属性注入值;
  • 通过@Bean将 dataSource()方法声明为一个注册Bean的方法,Spring会自动调用该方法,将方法的返回值加入Spring容器中。相当于以前的bean标签;

然后就可以在任意位置通过@Autowired注入DataSource了。

SpringBoot的属性注入方式

属性注入 (最常用的方式)

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

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

新建JdbcProperties类,用来进行属性注入

//这里需要定义出在application文件中定义属性值得前缀信息
/**
 * 注意:使用JdbcProperties的类(如下面的JdbcConfiguration)如果没有在类上添加
 * @EnableConfigurationProperties(value = {JdbcProperties.class})配置,则JdbcProperties是不能使用@Autowired注入的;
 * 此时这里的JdbcProperties就需要添加@Component或@Configuration
 */
@ConfigurationProperties(prefix = "jdbc")   
public class JdbcProperties {
    private String url;
    private String driverClassName;
    private String username;
    private String password;
 
    // ... 略
    // getters 和 setters
}

这里面就不需要再设置value属性,它是通过set方法进行资源自动注入的。

注意:set方法中的属性名的值要和资源文件中属性文件中值名字保持一致。

在application.properties(yml)中定义配置信息

Springboot在启动时并不会加载其他配置文件,它只加载默认的配置文件application.properties(yml),因此,将配置信息添加到这里,通过前缀进行区分,进行引用。

引用数据源 使用@EnableConfigurationProperties(引用属性类的字节码)引用配置信息

构造方法注入

操作与属性注入方式一样,只是这里注入的方式不一样。

这里不需要添加@Autowired注解,也不需要再添加@Bean注解,在要使用数据源的类,使用它的构造方法进行注入

通过bean方法的形参进行注入

在方法上的形参上进行定义要注入的数据源,方法对数据源初始化处理后,通过bean注解将方法的返回值注入到容器中

最优雅的注入  

不需要jdbcProperties

直接将配置注解添加到方法上,这是因为DataSource内部也是有set方法,会进行自动注入。

但是,也是有前提的:必须保证注入的有set方法,并且set方法的名字和配置文件中的属性名需要是一样的,这里使用的是datasource中内部的set方法。

 

posted @ 2022-01-18 08:14  残城碎梦  阅读(151)  评论(0编辑  收藏  举报