springboot的多种配置方式

springboot的多种配置方式

java配置主要靠java类和一些注解,比较常用的注解有:

@Configuration :声明一个类作为配置类,代替xml文件

@Bean :声明在方法上,将方法的返回值加入Bean容器,代替 标签

@Value :基本类型或String属性注入

@PropertySource :指定外部属性文件

后面以Druid连接池配置为例,数据库名称为springboot_test

方式一

<!--pom.xml -->
<dependency> 
    <groupId>com.alibaba</groupId> 		     	
    <artifactId>druid</artifactId> 
    <version>1.1.6</version> 
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
# src/resources/jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/bos
jdbc.username=root
jdbc.password=123456
//src\main\java\com\itheima\config\DruidConfig.java
@Configuration
@PropertySource("classpath:jdbc.properties")
public class DruidConfig {
	@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.setDriverClassName(driverClassName);
		dataSource.setUrl(url);
		dataSource.setUsername(username);
		dataSource.setPassword(password);
		return dataSource;
	}
}

解读:

@Configuration :声明我们 DruidConfig是一个配置类

@PropertySource :指定属性文件的路径是: classpath:jdbc.properties

@Value 为属性注入值(只能是基本类型或String)

@Bean将 dataSource() 方法声明为一个注册Bean的方法,Spring会自动调用该方法,将方法的返回值加入Spring容器中。

方式二

<!--pom.xml -->
<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>druid</artifactId>
     <version>1.1.6</version>
</dependency>
<dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <scope>runtime</scope>
</dependency>
<!-- ============不添加在IDEA 会报红,但并不影响功能 ================= -->
<dependency>
     <groupId> org.springframework.boot </groupId>
     <artifactId>spring-boot-configuration-processor</artifactId>
     <optional>true</optional>
</dependency>
<!--============================================================== -->
# src/resources/application.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/bos
jdbc.username=root
jdbc.password=123456
//src\main\java\com\itheima\config\DruidConfig.java
@ConfigurationProperties(prefix = "jdbc")
public class DruidProperties {
	private String url;
	private String driverClassName;
	private String username;
	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;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}
//src\main\java\com\itheima\config\DruidConfig.java
@Configuration
@EnableConfigurationProperties(DruidProperties.class)
public class DruidConfig {
	@Bean
	public DataSource dataSource(DruidProperties dp) {
		DruidDataSource dataSource = new DruidDataSource();
		dataSource.setDriverClassName(dp.getDriverClassName());
		dataSource.setUrl(dp.getUrl());
		dataSource.setUsername(dp.getUsername());
		dataSource.setPassword(dp.getPassword());
		return dataSource;
	}
}

解读:

@ConfifigurationProperties注解声明当前类为属性读取类,在类上定义各个属性,名称必须与属性文件中 jdbc. 后面部分一致。

@EnableConfigurationProperties()声明要使用的属性读取类,使用该类有三种注入方式

  1. @Autowired注入

    //src\main\java\com\itheima\config\DruidConfig.java
    @Configuration
    @EnableConfigurationProperties(DruidProperties.class)
    public class DruidConfig {
        @Autowired
        private DruidProperties dp;
    	@Bean
    	public DataSource dataSource() {
    		DruidDataSource dataSource = new DruidDataSource();
    		//setter
    		return dataSource;
    	}
    }
    
  2. 构造函数注入

    //src\main\java\com\itheima\config\DruidConfig.java
    @Configuration
    @EnableConfigurationProperties(DruidProperties.class)
    public class DruidConfig {
       	private DruidProperties dp; 
        public DruidConfig(DruidProperties dp){ this.dp = dp; }
    	@Bean
    	public DataSource dataSource() {
    		DruidDataSource dataSource = new DruidDataSource();
    		//setter
    		return dataSource;
    	}
    }
    
  3. 作为@Bean的方法参数注入(本例使用)

    //src\main\java\com\itheima\config\DruidConfig.java
    @Configuration
    @EnableConfigurationPerProperties(DruidProperties.class)
    public class DruidConfig {
    	@Bean
    	public DataSource dataSource(DruidProperties dp) {
    		DruidDataSource dataSource = new DruidDataSource();
    		//setter
    		return dataSource;
    	}
    }
    

方式二通过属性读取类解决了@Value不能读取对象属性(如user.friend.name)的问题,但似乎就更加麻烦了

方式三(推荐使用)

事实上,如果一段属性只有一个Bean需要使用,我们无需将其注入到一个类。

<!--pom.xml -->
<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>druid</artifactId>
     <version>1.1.6</version>
</dependency>
<dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <scope>runtime</scope>
</dependency>
<!-- ============不添加在IDEA 会报红,但并不影响功能 ================= -->
<dependency>
     <groupId> org.springframework.boot </groupId>
     <artifactId>spring-boot-configuration-processor</artifactId>
     <optional>true</optional>
</dependency>
<!--============================================================== -->
# src/resources/application.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/bos
jdbc.username=root
jdbc.password=123456
@Configuration
public class DruidConfig {
	@Bean
	@ConfigurationProperties(prefix = "jdbc")
	public DataSource dataSource() {
		return new DruidDataSource();
	}
}

方式四

<!--pom.xml -->
<dependency> 
    <groupId>com.alibaba</groupId> 		     	
    <artifactId>druid</artifactId> 
    <version>1.1.6</version> 
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
# src/resources/application.properties
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/bos
spring.datasource.username=root
spring.datasource.password=123456

思考:为什么这种方式不需要配置类可以读取配置信息?

启动类跑main方法时候,查看SpringApplication构造方法,如下追踪
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
容易发现,它是从 META-INF/spring.factories 中获取类名信息,存储在一键多值的Map中,打开spring.factories,debug对比

在这里插入图片描述
发现键是文件蓝色部分,值是绿色部分,往回看不难发现它将这些获取的类都生成了实例,注入到IOC容器中。

打开 DataSourceProperties 发现这不是方式二吗?
在这里插入图片描述

点进DataSourceProperties.class
在这里插入图片描述
总结:当我们添加依赖后,执行启动类时自动加载DataSourceAutoConfiguration,读取DataSourceProperties类,根据默认的前缀spring.datasource在application.xml中读取信息

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Spring Boot 提供了多种读取配置文件的方式,以下是其中几种常用的方式: 1. application.properties/application.yml:在 src/main/resources 目录下创建 application.properties 或 application.yml 文件,可以在其中设置应用程序的配置信息,例如: ``` server.port=8080 spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase spring.datasource.username=root spring.datasource.password=123456 ``` 2. @Value 注解:在代码中使用 @Value 注解读取配置信息,例如: ``` @Value("${server.port}") private int serverPort; @Value("${spring.datasource.url}") private String dataSourceUrl; @Value("${spring.datasource.username}") private String dataSourceUsername; @Value("${spring.datasource.password}") private String dataSourcePassword; ``` 3. @ConfigurationProperties 注解:通过 @ConfigurationProperties 注解将配置文件中的属性值注入到 Bean 中,例如: ``` @ConfigurationProperties(prefix = "spring.datasource") public class DataSourceProperties { private String url; private String username; private String password; // getter/setter } ``` 4. Environment 接口:通过 Environment 接口读取配置信息,例如: ``` @Autowired private Environment env; int serverPort = env.getProperty("server.port", Integer.class); String dataSourceUrl = env.getProperty("spring.datasource.url"); String dataSourceUsername = env.getProperty("spring.datasource.username"); String dataSourcePassword = env.getProperty("spring.datasource.password"); ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值