前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Spring @Autowired 注入到List和Map

Spring @Autowired 注入到List和Map

作者头像
春哥大魔王
发布于 2019-05-05 02:33:03
发布于 2019-05-05 02:33:03
13.5K10
代码可运行
举报
运行总次数:0
代码可运行

前言

我们系统中有一段这样的代码,很多新来的同学看起来比较蒙,这会不会报空指针啊!

其实spring是支持这种基于接口实现类的直接注入的。

实例

BeanInterface只是一个接口无方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.Autowired.ListMap;  
  
import org.springframework.core.annotation.Order;  
import org.springframework.stereotype.Component;  
/** 
 * order:把实现类排序输出 只适合List 
 * @author liu 
 * 
 */  
@Order(2)  
@Component  
public class BeanImplOne implements BeanInterface {  
  
}  


package com.Autowired.ListMap;  
  
import org.springframework.core.annotation.Order;  
import org.springframework.stereotype.Component;  
  
@Order(1)  
@Component  
public class BeanImplTwo implements BeanInterface {  
  
}  

测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.Autowired.ListMap;  
  
import java.util.List;  
import java.util.Map;  
  
  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.beans.factory.annotation.Qualifier;  
import org.springframework.stereotype.Component;  
  
@Component  
public class BeanInvoke {  
      
    @Autowired  
      private List<BeanInterface> list;  
        
    @Autowired  
    private Map<String,BeanInterface> map;  
      
    /** @Autowired默认为byType的  所以有两个相同类型的bean   
     * 如果不使用 @Qualifier指定具体的bean就会抛出异常 
     *  private BeanInterface beaninterface; 
     */  
    @Autowired  
   @Qualifier("beanImplOne")  
    private BeanInterface beaninterface;  
    public void say(){  
        System.out.println("list...");  
        if(null !=list &&0!=list.size()){  
            for(BeanInterface bean :list){  
                System.out.println(bean.getClass().getName());  
            }  
              
        }else{  
            System.out.println("List<BeanInterface> list is null !!!!");  
        }  
        System.out.println();  
        System.out.println("map...");  
        if(null !=map &&0!=map.size()){  
            for(Map.Entry<String, BeanInterface> m:map.entrySet()){  
                  System.out.println(m.getKey()+"    "+m.getValue().getClass().getName());  
            }  
        }else{  
            System.out.println("Map<String,BeanInterface> map is null !!!!");  
  
        }  
        System.out.println("-------------------------");  
        if(null !=beaninterface){  
            System.out.println(beaninterface.getClass().getName());  
        }else{  
            System.out.println("beaninterface is null !!!");  
        }  
    }  
      
      
}  


package com.Autowired.ListMap;  
  
import org.junit.Test;  
  
import com.imooc.test.base.UnitTestBase;  
  
  
public class TestListMap  extends UnitTestBase{  
    public TestListMap(){  
        super("classpath*:spring-beanannotation3.xml");  
    }  
      
    @Test  
    public void test(){  
        BeanInvoke  bean=super.getBean("beanInvoke");  
        bean.say();  
    }  
}  

配置文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:context="http://www.springframework.org/schema/context"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
        http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://www.springframework.org/schema/context  
        http://www.springframework.org/schema/context/spring-context.xsd" >  
          
        <context:component-scan base-package="package com.Autowired.ListMap;"></context:component-scan>  
          
 </beans>  

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2017-6-4 15:38:26 org.springframework.context.support.AbstractApplicationContext prepareRefresh  
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@58a17083: startup date [Sun Jun 04 15:38:26 CST 2017]; root of context hierarchy  
2017-6-4 15:38:26 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions  
信息: Loading XML bean definitions from URL [file:/E:/myeclipse/workspace/Spring2/bin/spring-beanannotation3.xml]  
2017-6-4 15:38:27 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor <init>  
信息: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring  
list...  
2017-6-4 15:38:27 org.springframework.context.support.AbstractApplicationContext doClose  
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@58a17083: startup date [Sun Jun 04 15:38:26 CST 2017]; root of context hierarchy  
com.Autowired.ListMap.BeanImplTwo  
com.Autowired.ListMap.BeanImplOne  
  
map...  
beanImplOne    com.Autowired.ListMap.BeanImplOne  
beanImplTwo    com.Autowired.ListMap.BeanImplTwo  
-------------------------  
com.Autowired.ListMap.BeanImplOne  

Spring吧bean放入了List中 那个这个顺序怎么控制呢

在实现类中加入@Order(value) 注解即可 ,值越小越先被初始化越先被放入List

看下源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DependencyDescriptor, String, Set<String>,TypeConverter)

对于@Autowired声明的数组、集合类型,spring并不是根据beanName去找容器中对应的bean,而是把容器中所有类型与集合(数组)中元素类型相同的bean构造出一个对应集合,注入到目标bean中。对应到上问配置文件中,就是把容器中所有类型为java.lang.String的bean放到新建的Set中,然后注入到Manager bean中。也就是把resourcePackage和resourceLoaction这两个String注入了,导致上面的输出结果。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 春哥talk 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
org.springframework.beans.factory.support.DefaultListableBeanFactory#resolveMultipleBeans
org.springframework.beans.factory.support.DefaultListableBeanFactory#resolveMultipleBeans
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Spring使用注解配置依赖注入
大部分情况下,使用Spring配置依赖注入时,都是使用注解来进行配置,因为注解比xml要方便和简单。不过类似于数据源对象这种配置信息容易变更的对象除外,这种对象使用xml文件来进行配置会更适合,方便于在外部进行修改,而不需要打开代码来进行修改。
端碗吹水
2020/09/23
9510
Spring学习笔记
可以看出,UserDaoImplForMySQL中主要是连接MySQL数据库进行操作。如果更换到Oracle数据库上,则需要再提供一个UserDaoImplForOracle,如下:
捞月亮的小北
2024/04/15
2250
Spring学习笔记
面试官常问的Spring依赖注入和Bean的装配问题,今天给大家讲清楚!
小伙伴儿们,Spring 的依赖注入以及 Bean 的装配是面试常问的知识点,今天我们来学习一下Spring中的依赖注入方式,以及如何将自己开发的Bean装配到Spring IoC容器中。
程序员的时光001
2020/10/10
1.5K0
面试官常问的Spring依赖注入和Bean的装配问题,今天给大家讲清楚!
SpringIOC
IOC:控制反转的底层原理就是:工厂模式+反射+配置文件 DI:依赖注入就是通过配置文件设置属性值
用户3112896
2019/09/26
3990
spring之泛型依赖注入
说明:所谓泛型依赖注入,就是在父类建立了引用关系,子类继承父类也会建立这种引用关系,并且真正注入的是T对应的子类类型。
西西嘛呦
2020/08/26
4680
spring之泛型依赖注入
02-Spring5 IOC容器
注意:因为P命名空间注入依赖于Set方法所以增加setter and getter
彼岸舞
2021/12/14
5290
02-Spring5 IOC容器
Spring框架(三) JDBCTemplate,声明式事务,自动装载(注解)
 JDBCTemplate 按照标准正常项目的结构 结构图: model层 dao层 实现  dao:(DateBase Access Object) 数据访问对象,dao层只用来访问数据库和模型层
二十三年蝉
2018/02/28
2.6K0
Spring框架(三) JDBCTemplate,声明式事务,自动装载(注解)
spring6-IOC容器
IOC 是 Inversion of Control 的简写,译为“控制反转”,它不是一门技术,而是一种设计思想,是一个重要的面向对象编程法则,能够指导我们如何设计出松耦合、更优良的程序。
程序员小甲
2023/09/28
6000
spring6-IOC容器
Spring-AOP @AspectJ进阶之增强织入的顺序
一个连接点可以同时匹配多个切点,切点对应的增强在连接点上的织入顺序到底是如何安排呢?这个问题需要分三种情况讨论:
小小工匠
2021/08/17
5240
spring开发_Annotation_AOP_Before增强处理
http://www.cnblogs.com/hongten/gallery/image/112691.html
Hongten
2018/09/13
4300
Spring-2.装配
通过@Configuration租借表明类是配置类,该类应该包含在Spring应用上下文中如何创建bean的细节。 注意和上一节相比,移除了@ComponentScan注解。
悠扬前奏
2019/05/30
6420
Spring详解篇之IoC控制反转
一.Spring概况 spring是一个开源框架 是一个轻量的控制反转和面向切面的容器框架 大小和开销都是轻量的。 通过控制反转技术可以达到松耦合的目的 切面编程,允许通过分离应用的业务逻辑。 包含并
方志朋
2017/12/29
1.4K0
Spring注解-@Autowired注解使用
首先要知道另一个东西,default-autowire,它是在xml文件中进行配置的,可以设置为byName、byType、constructor和autodetect;比如byName,不用显式的在bean中写出依赖的对象,它会自动的匹配其它bean中id名与本bean的set**相同的,并自动装载。 @Autowired是用在JavaBean中的注解,通过byType形式,用来给指定的字段或方法注入所需的外部资源。 两者的功能是一样的,就是能减少或者消除属性或构造器参数的设置,只是配置地方不一样而已。 autowire四种模式的区别
SerMs
2022/04/11
1K0
Spring注解-@Autowired注解使用
Spring Bean 的装配方式以及Autowired与Resource的使用及区别
在Spring的使用中,如果要将一个bean实例化,可以通过配置文件,也可以通过在java代码里面的注解来实现,Spring能够根据自动协作这些bean之间的关系,这种自动协作的过程,也称之为自动装配。 自动装配模式有如下四种模式:
冬天里的懒猫
2021/09/08
7290
Spring高手之路3——揭秘Spring依赖注入和SpEL表达式
我们在前面的文章中已经使用过XML进行setter方法的属性注入了,下面让我们再来回顾一下:
砖业洋__
2023/06/10
9490
Spring高手之路3——揭秘Spring依赖注入和SpEL表达式
Spring-基于注解的配置[02自动装载bean]
@Autowired默认按照类型(byType)匹配的方式在容器中查找匹配的Bean,当且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。
小小工匠
2021/08/16
4420
spring开发_Annotation_注解
http://www.cnblogs.com/hongten/gallery/image/112614.html
Hongten
2018/09/13
3900
Spring-使用外部属性文件01
在进行数据源或者邮件服务器等资源配置时,用户可以直接在Spring配置文件中配置用户名、密码、连接信息等,但是有一种更好的方法是将这些配置信息独立到一个外部属性文件中,并在Spring配置文件中通过形如{user}、{password}的占位符引用属性文件中的属性项。
小小工匠
2021/08/16
7460
Spring框架自学之路——简易入门
  Spring框架是个轻量级的Java EE框架。所谓轻量级,是指不依赖于容器就能运行的。Struts、Hibernate也是轻量级的。   轻量级框架是相对于重量级框架而言的,重量级框架必须依赖特定的容器,例如EJB框架就必须运行在Glassfish、JBoss等支持EJB的容器中,而不能运行在Tomcat中。——《Java Web整合开发 王者归来》   Spring以IoC、AOP为主要思想,其中IoC,Inversion of Control 指控制反转或反向控制。在Spring框架中我们通过配置创建类对象,由Spring在运行阶段实例化、组装对象。AOP,Aspect Oriented Programming,面向切面编程,其思想是在执行某些代码前执行另外的代码,使程序更灵活、扩展性更好,可以随便地添加、删除某些功能。Servlet中的Filter便是一种AOP思想的实现。   Spring同时也是一个“一站式”框架,即Spring在JavaEE的三层架构[表现层(Web层)、业务逻辑层(Service层)、数据访问层(DAO层)]中,每一层均提供了不同的解决技术。如下:
Java团长
2018/08/06
4480
Autowired用法
三、Autowired注解,有三种形式的注解,分别是注解字段、构造器、setting。
麻辣醉虾
2022/01/27
3410
相关推荐
Spring使用注解配置依赖注入
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文