Spring 多对象引入.

在以前使用xml配置注入的时候, 可以通过name名称注入, 也可以使用type类型注入.

在SpringBoot中, 可以使用@Resource和@Autowried注解进行注入.

@Resource 默认会使用名称进行注入,  如果找不到, 会使用自动使用类型进行注入.

@Autowried, 则会在容器中寻找匹配的对象, 如果找到则注入成功, 如果没找到或者找到多个, 则会报错.

但是, 如果有多个的情况下, 可以使用 @Qualifier("别名") 进行约束.

1. 创建Bean

1.1  如果使用方法bean注入对象, 给@Bean添加name值.

@Bean(name="别名")

代码样例:

注意,

  1. 下面的@Bean(name = "test01DataSource"), 可以使用applicationContext.getBean("test01DataSource") 进行获取.
  2. @Primary表示 如果以type类型进行选择的话, 首选该Bean.

也即是说, 使用applicationContext.getBean(DataSource.class) applicationContext.getBean("test01DataSource") 获取到的是同一个对象.

源码:

@Configuration

扫描二维码关注公众号,回复: 2784704 查看本文章

public class DataSourceConfig {

    @Bean(name = "test01DataSource")

    @Primary

    @ConfigurationProperties(prefix = "spring.datasource.test01")

    public DataSource getTest01DataSource() {

        return DataSourceBuilder.create().build();

    }

 

    @Bean(name = "test02DataSource")

    @ConfigurationProperties(prefix = "spring.datasource.test02")

    public DataSource test02DataSource() {

        return DataSourceBuilder.create().build();

    }

}

 

测试代码:

@Autowired

ApplicationContext applicationContext;

@Test

public void testDataSourceHashCode() {

    System.out.println(applicationContext.getBean(DataSource.class).hashCode());

    System.out.println((applicationContext.getBean("test01DataSource")).hashCode());

    System.out.println((applicationContext.getBean("test02DataSource")).hashCode());

}

结果样例:

1105282397

1105282397

793657559

1. 2  使用类注解进行注入对象.  @Service, @Component,  ,添加value值进行创建别名.

// 创建接口

public interface IBeanService {

    public void printInfo();

}

 

//创建实例01, 并且添加上@Primary注解, 表名默认使用这个类

@Service(value = "bean01")

@Primary

public class Bean01Service implements IBeanService {

 

    @Override

    public void printInfo() {

        System.out.println("This is bean 01");

    }

}

 

//创建实例02,

@Service(value = "bean02")

public class Bean02Service implements IBeanService {

 

    @Override

    public void printInfo() {

        System.out.println("This is bean 02");

    }

}

@RunWith(SpringRunner.class)

@SpringBootTest

public class IBeanServiceTest {

 

    @Autowired

    ApplicationContext applicationContext;

 

// create default bean.

    @Autowired

    IBeanService beanService;

 

    @Autowired

    @Qualifier("bean01")

    IBeanService bean01Service;

 

    @Autowired

    @Qualifier("bean02")

    IBeanService bean02Service;

 

    @Test

    public void printInfo() {

   // create bean01

        IBeanService bean01 = (IBeanService) applicationContext.getBean("bean01");

   // create bean02

        IBeanService bean02 = (IBeanService) applicationContext.getBean("bean02");

        bean01.printInfo();

        bean02.printInfo();

   // create default bean, and it is bean01

        applicationContext.getBean(IBeanService.class).printInfo();

    }

 

    @Test

    public void printInfoThroughAutowired() {

        beanService.printInfo();

        bean01Service.printInfo();

        bean02Service.printInfo();

    }

}

2. 调用

   2.1.  如果需要创建局部变量,  使用applicationContext.getBean(class/name)创建

                   对于@Primary的对象, 直接使用getBean(class)进行调用.

                    applicationContext.getBean(IBeanService.class)

                    对于其他的Bean, 使用getBean(name)进行调用, 并进行类型强制转换.

                   eg. (IBeanService) applicationContext.getBean("bean02");

  2.2. 如果需要创建成员变量, 使用@Autowired@Qualifier("别名") 进行

  1. 对于有@Primary的对象, 直接使用@Autowired进行调用.代码如下

                         @Autowired

                          IBeanService beanService;

  1. 对于其他的bean, 通过添加@Qualifier("别名")进行调用, 代码如下

                      @Autowired

                       @Qualifier("bean02")

                       IBeanService bean02Service;

猜你喜欢

转载自blog.csdn.net/sanpic/article/details/81662034