这种模式与 byType 非常相似,但它应用于构造器参数。Spring 容器看作 beans,在 XML 配置文件中 beans 的 autowire 属性设置为 constructor。然后,它尝试把它的构造函数的参数与配置文件中 beans 名称中的一个进行匹配和连线。如果找到匹配项,它会注入这些 bean,否则,它会抛出异常。

例如,在配置文件中,如果一个 bean 定义设置为通过构造函数自动装配,而且它有一个带有 SpellChecker 类型的参数之一的构造函数,那么 Spring 就会查找定义名为 SpellChecker 的 bean,并用它来设置构造函数的参数。

也就是说,将构造函数的参数类型同candidate bean的ID进行匹配。

你仍然可以使用 标签连接其余属性。

TextEditor:

public class TextEditor {private SpellChecker spellChecker;private String name;public TextEditor( SpellChecker spellChecker, String name ) {this.spellChecker = spellChecker;this.name = name;}public SpellChecker getSpellChecker() {return spellChecker;}public String getName() {return name;}public void spellCheck() {spellChecker.checkSpelling();}
}

by constructor装配模式下的beans.xml:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><!-- Definition for textEditor bean --><bean id="textEditor" class="com.sap.TextEditor" autowire="constructor"><constructor-arg value="Generic Text Editor"/></bean><!-- Definition for spellChecker bean --><bean id="SpellChecker" class="com.sap.SpellChecker"></bean></beans>

注意,将com.sap.SpellChecker这个bean的ID改成任意值均可。

但是如果将这个bean注释掉,就会报异常:

Jul 25, 2020 10:42:12 AM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@4ee285c6: startup date [Sat Jul 25 10:42:12 CST 2020]; root of context hierarchy
Jul 25, 2020 10:42:12 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [Beans.xml]
Jul 25, 2020 10:42:12 AM org.springframework.context.support.ClassPathXmlApplicationContext refresh
WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'textEditor' defined in class path resource [Beans.xml]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.sap.SpellChecker' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'textEditor' defined in class path resource [Beans.xml]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.sap.SpellChecker' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:729)at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:192)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1270)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1127)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502)at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:758)at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:144)at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:85)at com.sap.MainApp.main(MainApp.java:8)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.sap.SpellChecker' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1504)at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1101)at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1062)at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:815)at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:721)... 15 more

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

Spring 自动装配模式之构造函数装配方式相关推荐

  1. Spring AOP的两种动态代理方式的原理和实现(JDK和CGLIB)

    代理机制 Spring 的AOP 部分使用使用JDK动态代理,部分使用CGLIB来为目标对象创建代理.如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理:如果目标对象没有实现任何接口,则会 ...

  2. Spring自动装配的常用方式

    在applicationContext.xml中通过<bean>元素来声明bean和通过使用 XML 配置文件中的<constructor-arg>及<property& ...

  3. Spring 自动装配模式之byType

    Spring 容器看作 beans,在 XML 配置文件中 beans 的 autowire 属性设置为 byType.然后,如果它的 type 恰好与配置文件中 beans 名称中的一个相匹配,它将 ...

  4. java 自动装配_spring自动装配是什么?spring自动装配方式

    Spring是受欢迎的企业级Java应用程序开发框架,数以百万的来自世界各地的开发人员都在使用 Spring 框架创建高性能.易于测试和可重用的代码. 自动装配是Spring框架的重要功能,是使用Sp ...

  5. 学习篇(一)- Spring自动装配的方式

    Spring自动装配的方式 1. 什么是自动装配? ​ 自动装配就是会通过Spring 的上下文为你找出相应依赖项的类,通俗的说就是Spring 会在上下文中自动查找,并自动给Bean装配与其相关的属 ...

  6. Spring自动装配的方式

    Spring自动装配的方式 Spring 装配包括手动装配和自动装配,手动装配是有基于xml 装配.构造方法.setter 方法等 自动装配有五种自动装配的方式,可以用来指导Spring 容器用自动装 ...

  7. spring自动装配Bean的五种方式

    no:默认方式,手动装配方式,需要通过ref设定bean的依赖关系 byName:根据bean的名字进行装配,当一个bean的名称和其他bean的属性一致,则自动装配 byType:根据bean的类型 ...

  8. Spring自动装配Beans

    在Spring框架,可以用 auto-wiring 功能会自动装配Bean.要启用它,只需要在 <bean>定义"autowire"属性. <bean id=&q ...

  9. 第六篇 Spring 自动装配

    <Spring>篇章整体栏目 ----------------------------- [第一章]spring 概念与体系结构 [第二章]spring IoC 的工作原理 [第三章]sp ...

最新文章

  1. 为了智能驾驶,李彦宏要改造城市道路了!
  2. [转载] 杜拉拉升职记——30 我保证以后一直对你好
  3. 新笔记本怎么在桌面添加计算机文件夹,win10桌面悬浮文件夹怎么弄_win10电脑桌面悬浮文件夹如何添加-win7之家...
  4. 学习笔记(十四)——MySQL(CRUD)
  5. mysql提高并行并行_oracle 并行之并行度篇
  6. mysql5.1编译安装centos7_CentOS7下 Nginx1.13.5 + PHP7.1.10 + MySQL5.7.19 源码编译安装
  7. 速读训练软件_记忆力训练:如何提高注意力呢?
  8. 以《剑与远征》为例,浅析新型挂机放置游戏的游戏特色特点
  9. apache camel 相关配置_MyBatis-Plus返回map自动转驼峰配置object-wrapper-factory
  10. 单片机课程设计数字心率计_光学心率传感器详细使用教程
  11. 深入理解JavaScript闭包(closure) 【收藏】
  12. Nacos安装详细过程
  13. 小米11顶配版屏幕参数曝光:2K 120Hz高刷屏支持运动补偿
  14. 【报告分享】2020直播生态研究报告.pdf(附下载链接)
  15. 计算机中华五岳说课稿,关于说课稿集合6篇
  16. 用计算机制作演示文稿教案博客,制作演示文稿[教案].doc
  17. 编译原理:cminus_compiler-2021-fall Lab3
  18. 软链接与硬链接的区别
  19. 智行者王肖:自动驾驶本质在于对待数据的态度、获取及应用方式 | 自动驾驶这十年... 1
  20. 摩斯电码php源码,PHP实现基于文本的摩斯电码生成器

热门文章

  1. SSAS系列——【02】多维数据(维度对象)
  2. 多线程异步处理:AsyncTask异步更新UI界面(详细完整总结篇)
  3. Apache Jakarta Commons 工具集简介
  4. docker中使用golang:alpine镜像制作开启goweb的dockerfile
  5. 图的遍历、最小生成树、最短路径
  6. 5.5 关于数据的问题
  7. web后端学习过程中技巧总结(持续更新。。。)
  8. angular ng-href
  9. JavaScript中正则表达式学习笔记
  10. hdu4533 威威猫系列故事——晒被子