Springboot 第三方bean属性绑定
首先引入druid的坐标
```
   <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.16</version>
        </dependency>
```
我们先来测试一下能否通过druid的bean来获取它的属性。
```
    @Bean
    public DruidDataSource getDataSource(){
        DruidDataSource ds= new DruidDataSource();
        return ds;
    }
```
 public static void main(String[] args) {
        ConfigurableApplicationContext ctx = SpringApplication.run(Springboot10ConfigurationApplication.class, args);
        DruidDataSource ds = ctx.getBean(DruidDataSource.class);
        System.out.println(ds.getDriverClassName());
    }
```
```
结果肯定是不能的,因为durid是懒加载的,不能在启动之前就获取属性。它是在运行时获取属性的。
然后通过注入的方式,把yml中的属性注入到DruidDataSource中。
首先编写Druid的yml属性
```
datasource:
  driverClassName: com.mysql.cj.jdbc.Driver456
```
然后通过@ConfigurationProperties获取yml的前缀并绑定bean,注入到DruidDataSource中
```
package com.hxut;
import com.alibaba.druid.pool.DruidDataSource;
import com.hxut.config.ServerConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class Springboot10ConfigurationApplication {
    @Bean
    @ConfigurationProperties(prefix = "datasource")
    public DruidDataSource getDataSource(){
        DruidDataSource ds= new DruidDataSource();
//        ds.setDriverClassName("com.mysql.cj.jdbc.Driver123");
        return ds;
    }
    public static void main(String[] args) {
        ConfigurableApplicationContext ctx = SpringApplication.run(Springboot10ConfigurationApplication.class, args);
        ServerConfig bean = ctx.getBean(ServerConfig.class);
        System.out.println(bean);
        DruidDataSource ds = ctx.getBean(DruidDataSource.class);
        System.out.println(ds.getDriverClassName());
    }
}
```

这里引入一个注解@EnableConfigurationProperties,这个注解呢,就是列举你要配置属性的类,加上这个注解呢,就是告诉我要从那个类里读取属性了。

读取那个属性呢,就是读取servers。

但是呢,这么运行会报下面这个错误。也就是有两个相同的bean,冲突了。
Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.hxut.config.ServerConfig' available: expected single matching bean but found 2: serverConfig,servers-com.hxut.config.ServerConfig
这个原因是配置属性的类有一个bean,

指定配置属性的类中又有一个bean,因为这个注解是要加载spring属性的配置,所以它会自动把它封装成一个bean。所以一共有两个bean。所以,@Component和@EnableConfigruationProperties不可并存。




 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号