Spring多对象引入方法

 更新时间:2019年01月30日 11:47:05   作者:裴星宙  
今天小编就为大家分享一篇关于Spring多对象引入方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

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

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

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

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

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

1.创建Bean

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

@Bean(name="别名")

代码样例:

注意

下面的@Bean(name = "test01DataSource"), 可以使用applicationContext.getBean("test01DataSource") 进行获取.

@Primary表示 如果以type类型进行选择的话, 首选该Bean.

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

源码:

@Configuration
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("别名") 进行

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

@Autowired
IBeanService beanService;

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

@Autowired
@Qualifier("bean02")
IBeanService bean02Service;

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • 一文详解Java闭锁和栅栏的实现

    一文详解Java闭锁和栅栏的实现

    闭锁与栅栏是在多线程编程中的概念,因为在多线程中,我们不能控制线程的执行状态,所以给线程加锁,让其按照我们的想法有秩序的执行。本文将详解Java闭锁和栅栏的实现,需要的可以参考一下
    2022-06-06
  • java写的伪微信红包功能示例代码

    java写的伪微信红包功能示例代码

    这篇文章主要介绍了java写的伪微信红包功能示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Spring事务失效的8大原因详解

    Spring事务失效的8大原因详解

    这篇文章主要介绍了Spring事务失效的8大原因详解,这里以 MySQL 为例,其 MyISAM 引擎是不支持事务操作的,InnoDB 才是支持事务的引擎,一般要支持事务都会使用 InnoDB,需要的朋友可以参考下
    2023-09-09
  • 通过实例解析Spring argNames属性

    通过实例解析Spring argNames属性

    这篇文章主要介绍了通过实例解析Spring argNames属性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • SpringBoot整合Drools的实现步骤

    SpringBoot整合Drools的实现步骤

    Drools是一个易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。业务分析师或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行所需的业务规则。本文将讲述SpringBoot整合Drools的步骤
    2021-05-05
  • Java打包工具jar包详解

    Java打包工具jar包详解

    这篇文章主要介绍了Java打包工具jar包详解,在本例中我们引入一个叫jaxen.jar的库,并将所有以”org.jaxen”开头的类重命名以”org.example.jaxen”开头,具体实例代码跟随小编一起看看吧
    2021-10-10
  • Java 线程池详解及创建简单实例

    Java 线程池详解及创建简单实例

    这篇文章主要介绍了Java 线程池详解及创建简单实例的相关资料,需要的朋友可以参考下
    2017-02-02
  • Java map.getOrDefault()方法的用法详解

    Java map.getOrDefault()方法的用法详解

    这篇文章主要介绍了Java map.getOrDefault()方法的用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 在springboot中如何使用线程池

    在springboot中如何使用线程池

    在SpringBoot中,可以通过定义ThreadPoolTaskExecutor的Bean并使用@Autowired注入来使用线程池,具体步骤包括创建ThreadPoolTaskExecutor的Bean配置,本文给大家介绍springboot使用线程池的例子,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • Java 可视化垃圾回收_动力节点Java学院整理

    Java 可视化垃圾回收_动力节点Java学院整理

    Ben Evans是一名资深培训师兼顾问,他在演讲可视化垃圾回收中从基础谈起讨论了垃圾回收。以下是对其演讲的简短总结。感兴趣的朋友一起学习吧
    2017-05-05

最新评论