第三方bean管理

开始前注入依赖

  1. <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>druid</artifactId>
  5. <version>1.2.10</version>
  6. </dependency>

一般情况下

@Configuration
public class SpringConfig {
    //1.定义一个方法获得要管理的对象
    //2.添加@Bean,表示当前方法的返回值是一个Bean
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/xxsxpt1");
        ds.setUsername("root");
        ds.setPassword("密码");
        return ds;
    }
}

会得到初始化的结果
如果说你们前面有了一些@Service等定义在其他地方,你们需要配置包扫描注解和配置文件的注解

@Configuration
@ComponentScan(value = "com.chentianyu")
@PropertySource({"classpath:one.properties"})
public class SpringConfig {
    //1.定义一个方法获得要管理的对象
    //2.添加@Bean,表示当前方法的返回值是一个Bean
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/xxsxpt1");
        ds.setUsername("root");
        ds.setPassword("qw18358174722er");
        return ds;
    }
}
public class App 
{
    public static void main( String[] args )
    {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        BookServiceImpl ctxBean = ctx.getBean(BookServiceImpl.class);
        ctxBean.save();
        DataSource dataSource = ctx.getBean(DataSource.class);
        System.out.println(dataSource);

    }
}

出现结果:

book dao init...
this service save ...
book dao save...chentianyu
{
    CreateTime:"2022-05-25 21:00:33",
    ActiveCount:0,
    PoolingCount:0,
    CreateCount:0,
    DestroyCount:0,
    CloseCount:0,
    ConnectCount:0,
    Connections:[
    ]
}

Process finished with exit code 0

对于Spring中一般有专门的类进行单独的配置管理

第一种方式

package com.chentianyu.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class JdbcConfig {
    //1.定义一个方法获得要管理的对象
    //2.添加@Bean,表示当前方法的返回值是一个Bean
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/xxsxpt1");
        ds.setUsername("root");
        ds.setPassword("qw18358174722er");
        return ds;
    }
}
@Configuration
@ComponentScan(value = "com.chentianyu.config")
@PropertySource({"classpath:one.properties"})
public class SpringConfig {
}

以上的Jdbc配置方式不推荐使用,也看不出来导入了哪个

第二种方式

package com.chentianyu.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;

public class JdbcConfig {
    //1.定义一个方法获得要管理的对象
    //2.添加@Bean,表示当前方法的返回值是一个Bean
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/xxsxpt1");
        ds.setUsername("root");
        ds.setPassword("qw18358174722er");
        return ds;
    }
}
@Configuration
@ComponentScan(value = "com.chentianyu")
@PropertySource({"classpath:one.properties"})
@Import({JdbcConfig.class})//这样可以看出来你导入了哪个
public class SpringConfig {
}

推荐使用

第三方bean管理

  • 使用@Bean配置第三方bean
  • 将独立的配置类加入核心配置
    • 方式2:导入式
      • 使用@Import注解手动导入配置类到核心配置,此注解只能添加一次,多个数据请用数组格式
      • @Bean public DataSource dataSource(){}
      • @Import({JdbcConfig.class})
    • 方式1: 扫描式(不推荐)
      • @Configuration
      • @ComponentScan(value = “com.chentianyu.config”)

        第三方bean依赖注入

        简单数据类型依赖注入

        ```java import javax.sql.DataSource;

//@Configuration public class JdbcConfig { @Value(“com.mysql.cj.jdbc.Driver”) private String diver; @Value(“jdbc:mysql://localhost:3306/xxsxpt1”) private String url; @Value(“root”) private String userName; @Value(“qw18358174722er”) private String password;

//1.定义一个方法获得要管理的对象
//2.添加@Bean,表示当前方法的返回值是一个Bean
@Bean
public DataSource dataSource(){
    DruidDataSource ds = new DruidDataSource();
    ds.setDriverClassName(diver);
    ds.setUrl(url);
    ds.setUsername(userName);
    ds.setPassword(password);
    return ds;
}

}

**自动装配: 它检测到了你的方法在做第三方Bean或者你要配置一个Bean你的形参它要给你提供,所以他要在容器中帮你找这个类型的Bean,有就给你了。(按类型装配)**

<a name="bSOUf"></a>
#### 引用类型依赖注入

- 用于类型依赖注入
```java
@Bean
public DataSource dataSource(BookService bookService){
    System.out.println(bookService);
    DruidDataSource ds = new DruidDataSource();
    ds.setDriverClassName(diver);
    ds.setUrl(url);
    ds.setUsername(userName);
    ds.setPassword(password);
    return ds;
}
  • 引用类型注入只需要为bean定义的方法设置形参即可,容器会根据类型自动装配对象(前提是你有这个引用类型的Bean和spring能够找到这个Bean)

小结

  • 第三方Bean管理
    • @Bean
  • 第三方的依赖注入
    • 引用类型:方法形参
    • 简单类型: 成员变量