Spring中bean集合注入的方法详解

目录
  • Map注入
  • List注入
  • Set注入
  • 数组注入
  • 应用

哈喽大家好啊,我是Hydra。

Spring作为项目中不可缺少的底层框架,提供的最基础的功能就是bean的管理了。bean的注入相信大家都比较熟悉了,但是有几种不太常用到的集合注入方式,可能有的同学会不太了解,今天我们就通过实例看看它的使用。

首先,声明一个接口:

public interface UserDao {
    String getName();
}

然后定义两个类来分别实现这个接口,并通过@Component注解把bean放入spring容器中:

@Component
public class UserDaoA implements UserDao {
    @Override
    public String getName() {
        return "Hydra";
    }
}
@Component
public class UserDaoB implements UserDao {
    @Override
    public String getName() {
        return "#公众号:码农参上";
    }
}

准备工作完成后,我们看看几种不同类型的集合注入方式。

Map注入

首先来看Map类型的注入,直接在Service中注入一个Mapkey为字符串类型,value为上面定义的接口类型。

@Service
@AllArgsConstructor
public class UserMapService {
    final Map<String, UserDao> userDaoMap;

    public Map<String,UserDao> getDaos(){
        return userDaoMap;
    }
}

通过接口测试,查看这个Map中的内容:

可以看到,Map中的value是实现了接口的实例对象,key则是beanName,可以通过@Componentvalue属性进行自定义。

修改UserDaoA,指定名称:

@Component(value = "Hydra")
public class UserDaoA implements UserDao {...}

可以看到,key的值发生了改变:

List注入

Service中,这次注入泛型为接口UserDao类型的List

@Service
@AllArgsConstructor
public class UserListService {
    private final List<UserDao> userDaoLists;

    public List<UserDao> getDaos(){
        return userDaoLists;
    }
}

测试这个方法,查看List中的内容,是我们放入容器中的两个bean

我们知道,List是一个有序的数据结构,那么如果想要修改Listbean的排序,该如何做呢?

很简单,修改注入到spring容器中的两个bean,为它们添加@Order注解并指定加载顺序,数字越小越优先加载。

@Component
@Order(1)
public class UserDaoA implements UserDao {……}
@Component
@Order(-1)
public class UserDaoB implements UserDao {……}

修改完成后,再进行测试,可以看到bean的顺序发生了改变:

Set注入

同样,也可以使用无序的Set注入bean,泛型指定为接口类型。

@Service
@AllArgsConstructor
public class UserSetService {
    private final Set<UserDao> userDaoSet;

    public Set<UserDao> getDaos(){
        return userDaoSet;
    }
}

查看Set中的元素,和List相同,只不过顺序变为无序,不会因为@Order注解的值而改变:

数组注入

最后,我们再来看一下数组注入的方式:

@Service
@AllArgsConstructor
public class UserArrayService {
    private final  UserDao[] userDaoArray;

    public UserDao[] getDaos(){
        return userDaoArray;
    }
}

查看数组中的元素:

并且,和List比较类似的,数组中bean的排序会受到@Order注解数值的影响,有兴趣的同学可以自己尝试一下。

应用

了解了这几种注入方式后,再简单提一下它的使用场景。例如,我们可以用Map注入实现策略模式,来替换代码中繁杂的if/else判断。例如,原始的代码中判断逻辑可能是这样的:

public String choice(String name){
    if (name.equals("auth")){
        return "Hydra";
    }else if (name.equals("official")){
        return "#公众号:码农参上";
    }
    return null;
}

使用策略模式进行改造,首先修改beanName

@Component(value = "auth")
public class UserDaoA implements UserDao {
    @Override
    public String getName() {
        return "Hydra";
    }
}
@Component(value = "official")
public class UserDaoB implements UserDao {
    @Override
    public String getName() {
        return "#公众号:码农参上";
    }
}

再修改Servie中的方法,一行代码即可实现原有的if/else判断:

@Service
@AllArgsConstructor
public class TestService {
    final Map<String, UserDao> userDaoMap;

    public String choice2(String name){
        return userDaoMap.get(name).getName();
    };
}

可能在这个例子中,这种写法的优点体现的不十分明显,但是当你有一个非常长的if/else判断时,这种模式能使你的代码看上去简洁很多,并且符合代码按照功能拆分的原则。

同理,如果你已经通过@Order注解定义好了bean的加载顺序,也可以将它理解为bean的优先级,例如我想要调用优先级最高的符合类型的bean的方法,那么完全可以这样写:

@Service
@AllArgsConstructor
public class TestService {
    final List<UserDao> userDaoLists;

    public String choiceFirst(){
        return userDaoLists.get(0).getName();
    };
}

通过上面两个简单的例子可以看到,集合注入的方式使用起来非常灵活,我们可以在实际使用中,结合各种设计模式,写出实用而优雅的代码。

以上就是Spring中bean集合注入的方法详解的详细内容,更多关于Spring集合注入的资料请关注我们其它相关文章!

(0)

相关推荐

  • 详解Spring Bean的集合注入和自动装配

    目录 一.Spring Bean 集合注入 集合常用标签 案例 二.Spring Bean自动装配 什么是自动装配 自动装配的方式 案例 注意点 一.Spring Bean 集合注入 在[Spring学习笔记(三)]已经讲了怎么注入基本数据类型和引用数据类型,接下来介绍如何注入比较特殊的数据类型——集合 集合常用标签 集合注入,用法也很简单,只需要在 Bean 标签下的 <property> 或<constructor-arg>元素中添加以下集合的标签,再通过value或者ref进

  • Spring如何正确注入集合类型

    目录 1 注入方式 1.1 收集方式 1.2 直接装配方式 2 源码解析 2.1 收集装配 1 获取集合类型的elementType 2 根据元素类型找出所有Bean 3 将匹配的所有的Bean按目标类型转化 2.2 直接装配方式 3 修正 集合类型的自动注入是Spring提供的另外一个强大功能.我们在方便的使用依赖注入的特性时,必须要思考对象从哪里注入.怎么创建.为什么是注入这一个对象的.虽然编写框架的目的是让开发人员无需关心太多底层细节,能专心业务逻辑的开发,但是作为开发人员不能真的无脑去使

  • Spring实战之注入集合值操作示例

    本文实例讲述了Spring实战之注入集合值操作.分享给大家供大家参考,具体如下: 一 配置 <?xml version="1.0" encoding="GBK"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schema

  • 详解Java的Spring框架中bean的注入集合

    使用value属性和使用<property>标签的ref属性在你的bean配置文件中的对象引用,这两种情况下可以处理单值到一个bean,如果你想通过多元值,如Java Collection类型List, Set, Map 及 Properties.要处理这种情况,Spring提供了四种类型的如下集合的配置元素: 可以使用<list> 或<set> 来连接任何实现java.util.Collection或数组. 会遇到两种情况(a)将收集的直接的值及(b)传递一个bean

  • 详解Spring注入集合(数组、List、Map、Set)类型属性

    注入集合(数组.List.Map.Set)类型属性 (1)创建类,定义数组,list,map,set类型属性,并且生成对应的set方法. (2)在spring配置文件中进行配置. Stu类: package com.Keafmd.spring5.collectiontype; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Set; /** * Keafmd * * @C

  • Spring中bean集合注入的方法详解

    目录 Map注入 List注入 Set注入 数组注入 应用 哈喽大家好啊,我是Hydra. Spring作为项目中不可缺少的底层框架,提供的最基础的功能就是bean的管理了.bean的注入相信大家都比较熟悉了,但是有几种不太常用到的集合注入方式,可能有的同学会不太了解,今天我们就通过实例看看它的使用. 首先,声明一个接口: public interface UserDao { String getName(); } 然后定义两个类来分别实现这个接口,并通过@Component注解把bean放入s

  • Spring中自定义数据类型转换的方法详解

    目录 类型转换服务 实现Converter接口 实现ConverterFactory接口 实现GenericConverter接口 环境:Spring5.3.12.RELEASE. Spring 3引入了一个core.onvert包,提供一个通用类型转换系统.系统定义了一个SPI来实现类型转换逻辑,以及一个API来在运行时执行类型转换.在Spring容器中,可以使用这个系统作为PropertyEditor实现的替代,将外部化的bean属性值字符串转换为所需的属性类型.还可以在应用程序中需要类型转

  • Spring中Bean的命名方式代码详解

    本文主要描述的是关于spring中bean的命名方式,通过简单实例向大家介绍了六种方式,具体如下. 一般情况下,在配置一个Bean时需要为其指定一个id属性作为bean的名称.id在IoC容器中必须是唯一的,此外id的命名需要满足xml对id的命名规范. 在实际情况中,id命名约束并不会给我们带来影响.但是如果用户确实希望用到一些特殊字符来对bean进行命名,那么可以使用bean的name属性来进行命名,name属性没有字符上的限制,几乎可以使用任何字符. 每个Bean可以有一个或多个id,我们

  • Spring中@Scheduled功能的使用方法详解

    目录 前言 一.Spring @Scheduled Annotation 1.2 如何启用@Scheduled 注释 1.3 使用@Scheduled 注释 二.固定的延时和频率使用@Scheduled 三.配合cron表达式使用@Scheduled 四.使用properties文件配置Cron 五.使用context配置Cron 总结 前言 Spring 为任务调度和基于使用@Scheduled 注释的 cron 表达式的异步方法执行提供了极好的支持.可以将@Scheduled 注释与触发器元

  • Python中防止sql注入的方法详解

    前言 大家应该都知道现在web漏洞之首莫过于sql了,不管使用哪种语言进行web后端开发,只要使用了关系型数据库,可能都会遇到sql注入攻击问题.那么在Python web开发的过程中sql注入是怎么出现的呢,又是怎么去解决这个问题的? 当然,我这里并不想讨论其他语言是如何避免sql注入的,网上关于PHP(博主注:据说是世界上最屌的语言)防注入的各种方法都有,Python的方法其实类似,这里我就举例来说说. 起因 漏洞产生的原因最常见的就是字符串拼接了,当然,sql注入并不只是拼接一种情况,还有

  • Spring Bean注册与注入实现方法详解

    目录 1. 逻辑上的 Bean 注册 2. XML 注册 Bean 到自建的库中 2.1 工厂方法 2.2 使用工厂方法和实例化工厂注册 Bean 3. XML 配合注解进行 Bean 注册 4. 使用注解注册 Bean 4.1 注解方式注册的必要条件 4.2 用到的注解 4.3 @Component注解注入 4.4 使用 @Bean 注解注册 5. 通过注解注入 Bean 6. 注入时的一个坑点 7. 获取 库中的对象 上接[Spring]spring核心思想——IOC和DI 上篇文章结尾简单

  • Spring Boot项目中定制拦截器的方法详解

    这篇文章主要介绍了Spring Boot项目中定制拦截器的方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Servlet 过滤器属于Servlet API,和Spring关系不大.除了使用过滤器包装web请求,Spring MVC还提供HandlerInterceptor(拦截器)工具.根据文档,HandlerInterceptor的功能跟过滤器类似,但拦截器提供更精细的控制能力:在request被响应之前.request被响应之后.视

  • Spring中的AutowireCandidateResolver的具体使用详解

    接口定义 用于推断一个特定的beanDefinition是否能作为指定依赖的候选者的策略接口 public interface AutowireCandidateResolver { // 默认情况下直接根据bd中的定义返回,如果没有进行特殊配置的话为true default boolean isAutowireCandidate(BeanDefinitionHolder bdHolder, DependencyDescriptor descriptor) { return bdHolder.g

  • Spring中@Async注解实现异步调详解

    异步调用 在解释异步调用之前,我们先来看同步调用的定义:同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果. 异步调用则是只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕,继续执行下面的流程.例如, 在某个调用中,需要顺序调用 A, B, C三个过程方法:如他们都是同步调用,则需要将他们都顺序执行完毕之后,过程才执行完毕: 如B为一个异步的调用方法,则在执行完A之后,调用B,并不等待B完成,而是执行开始调用C,待C执行完毕之后,就意味着这个过程执行完毕了. 概述说明 Sp

  • Spring利用注解整合Mybatis的方法详解

    目录 一.环境准备 步骤1:数据库相关 步骤2:导入jar包 步骤3:创建模型类 步骤4:创建Dao接口和实现类 步骤5:创建Service接口和实现类 步骤6:添加jdbc.properties文件 步骤7:添加Mybatis核心配置文件 步骤8:编写测试程序 二.整合思路分析 三.整合步骤 步骤1:导入整合jar包 步骤2:创建数据源配置类 步骤3:创建Mybatis配置类 步骤4:创建Spring主配置类 步骤5:编写运行程序 一.环境准备 步骤1:数据库相关 建库建表 创建spring_

随机推荐