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不可并存。


posted @ 2022-05-05 22:25  长情c  阅读(141)  评论(0)    收藏  举报