Spring2.1——自动装配、简化配置、嵌套bean、集合

别再手动写Bean转换了!Spring Boot项目集成MapStruct 1.5保姆级配置指南 本文详细介绍了如何在Spring Boot项目中集成MapStruct 1.5,实现高效、安全的Bean转换。通过配置依赖、定义Mapper接口、与Spring深度集成等步骤,开发者可以告别手动编写getter/setter的低效方式。文章还涵盖了高级映射技巧、生产环境最佳实践及常见问题排查,帮助开发者充分利用MapStruct提升开发效率。 阅读详情

1、自动装配

可通过<beans.../>元素的default-autowire属性指定,也可通过<bean.../>元素的autowire属性指定。

自动装配可以减少配置文件的工作量,但降低了依赖关系的透明性和清晰性。尽量少用!

 autowire属性可以接受如下值:

            - no:不使用自动装配。Bean依赖必须通过ref元素定义。这是默认的配置。

            - byName:根据setter方法名来自动装配。Spring查找容器中全部Bean,
              找出其中id属性与setter方法名去掉set前缀后同名的Bean来完成注入。
              如果没有找到匹配的Bean实例,则Spring不会进行任何注入,也不报错。
 
            - byType:根据setter方法形参类型来自动装配。BeanFactory查找容器中全部Bean,
              如果正好有一个Bean类型与setter形参类型匹配,就自动注入这个Bean;
              如果有多个这样的Bean,就抛出一个异常;NoUniqueBeanDefinitionException
              如果没有找到匹配的Bean实例,则Spring不会进行任何注入,也不报错。

              如果希望某个Bean不参与自动装配,可以指定autowire-candidate="false"

            - constructor:与byType类似,区别是用于构造注入的参数。
              如果BeanFactory中不是恰好有一个Bean与构造器参数类型相同,则会抛出一个异常。

            - autodetect:BeanFactory根据Bean内部结构,决定使用constructor或byType。
                          如果找到一个默认的构造函数,那么就会应用byType。

(1)eg: byName

①beans.xml配置:

	<bean id="dog" class="cony.domain.Dog">
		<property name="kind" value="金毛犬"/>
	</bean>

	<bean id="dog2" class="cony.domain.Dog" >
		<property name="kind" value="吉娃娃"/>
	</bean>
	
	<!-- setDog(Dog dog)方法会找类型为Dog的Bean,如果找到一个执行依赖注入 -->
	<bean id="user" class="cony.domain.User" autowire="byName">
		<property name="name" value="Tom" />
		<property name="age" value="19" />
	</bean>
②测试:

		ApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml");
		User user = appContext.getBean("user",User.class);
		System.out.println(user);
③测试结果:

注入了id=dog的bean


(2)eg:byType

①beans.xml配置:
  

	<bean id="dog" class="cony.domain.Dog" autowire-candidate="false">
		<property name="kind" value="金毛犬"/>
	</bean>

	<bean id="dog2" class="cony.domain.Dog">
		<property name="kind" value="吉娃娃"/>
	</bean>
	
	<!-- setDog(Dog dog)方法会找类型为Dog的Bean,如果找到一个执行依赖注入 -->
	<bean id="user" class="cony.domain.User" autowire="byType">
		<property name="name" value="Tom" />
		<property name="age" value="19" />
	</bean>

②测试:

		ApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml");
		User user = appContext.getBean("user",User.class);
		System.out.println(user);

③测试结果:


假设去掉金毛犬上autowire-candidate="false"的配置,那么金毛犬也会参与自动装配,会出现以下错误:


(3)eg:constructor

①beans.xml配置:

	<bean id="dog" class="cony.domain.Dog" >
		<property name="kind" value="吉娃娃"/>
	</bean>
	
	<bean id="user" class="cony.domain.User" autowire="constructor">
	<constructor-arg value="小方"/>
	<constructor-arg value="18" type="int"/>
	</bean> 

②测试:

		ApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml");
		User user = appContext.getBean("user",User.class);
		System.out.println(user);

③测试结果:


constructor与byType类似,也是只能有一个符合的bean。但在constructor中发现这样的情况:如果是下面代码,将会自动注入吉娃娃,没有报错,但如果将id=dog名称改为其他,则会报错:NoUniqueBeanDefinitionException。

所以我觉得可能是在constructor配置下,在出现多个bean时会采取byName的自动注入,如果找不到,才报错。


2、属性简化配置

注意:需要配置命名空间

    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:c="http://www.springframework.org/schema/c"

把子元素变成属性


测试结果:setter的值覆盖了构造器设定的值


3、嵌套bean


4、集合

(1)User.java

public class User {

	private String name;
	private int age;
	private Puppy dog;
	
	private String[] nicknames;
	private List<String> hobby;
	private Set item;
	private Map<String,Dog> dogs;
	private Properties health;
	
	public User(){
		System.out.println("---调用无参构造器---");
	}
	public User(String name,int age,Puppy dog){
		super();
		System.out.println("---调用有参构造器---");
		this.name = name;
		this.age = age;
		this.dog = dog;
	}
......//setter、getter
}

(2)beans.xml

	<bean id="dog" class="cony.domain.Puppy" p:kind="古代牧羊犬" />
	<bean id="dog2" class="cony.domain.Puppy" p:kind="萌萌的柯基" />
	<bean id="dinosaur" class="cony.domain.Dinosaur"
	p:kind="霸王龙"/>
	
	
	<bean id="user" class="cony.domain.User"
		p:name="黄豆"
		p:age="21"
		p:dog-ref="dog"
	>
	
	<!-- setNicknames(String[] nicknames)  -->
	<property name="nicknames">
		<list>
			<value>猴子</value>
			<value>华华</value>
		</list>
	</property>
	
	<!--  setHobby(List<String> hobby) -->
	<property name="hobby">
		<list>
			<value>吉他</value>
			<value>烘焙</value>
		</list>
	</property>
	<!-- setItem(Set item) -->
	<property name="item">
		<set>
			<value>书包</value>
			<value>铅笔</value>
			<list>
				<value>小鸭子</value>
				<value>跳跳虎</value>
			</list>
			<ref bean="dog2"/>
			<bean class="javax.swing.JFrame" 
				c:_0="myFrame"
				p:visible="true"
			/>
			<set>
				<value>Peppa pig</value>
			</set>
		</set>
	</property>
	<!-- setDogs(Map<String, Dog> dogs) -->
	<property name="dogs">
		<map>
			<entry key="little child" value-ref="dog2"/>
			<entry key="big girl" value-ref="dinosaur"/>
		</map>
	</property>
	<!-- setHealth(Properties health) -->
	<property name="health">
		<props>
			<prop key="身高">180</prop>
			<prop key="体重">60kg</prop>
		</props>
	</property>
	</bean>

(3)测试:

		ApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml");
		User user = appContext.getBean("user",User.class);
		System.out.println(user);
测试结果:



Spring实战之注入嵌套Bean操作示例 主要介绍了Spring实战之注入嵌套Bean操作,结合实例形式分析了嵌套Bean相关配置与使用操作技巧,需要的朋友可以参考下 立即下载

相关推荐

从逻辑门到存储阵列:NAND与NOR闪存命名与结构原理详解

在数字电路与半导体存储器领域,逻辑门是构建一切复杂功能的基础单元,其输入输出关系定义了计算与存储的基本原理。与非门(NAND)和或非门(NOR)作为通用逻辑门,其真值表和行为模式深刻影响了芯片设计。基于这些原理,现代闪存技术发展出了两种核心架构:NAND Flash和NOR Flash。这两种闪存的命名直接源于其内部存储单元阵列的连接方式,分别模拟了与非门和或非门的逻辑关系。这种结构差异决定了它们根本的技术价值:NOR Flash采用并联结构,支持快速随机读取,适用于代码存储与原地执行(XiP);而NAND

weixin_33377602的博客 337

java 构造函数嵌套_java – spring – 构造函数注入和覆盖嵌套bean的父定义

我不完全确定你想要实现的目标.我不认为您可以无需创建自己的自定义模式(这对于嵌套结构来说是不平凡的),但是下面的例子可能非常接近,而不用这样做.首先,定义一个抽象bean作为外部bean的模板(我的示例使用一个Car作为外部bean,一个Engine作为内部bean),给出所有其他bean可以继承的默认值:由于所有本田思域都具有相同的引擎(在我的世界,我对车无所知),我给它一个默认的嵌套引擎bea...

weixin_29956903的博客 219

Windows11上CUDA 12.3配PyTorch踩坑记:一条官网命令救了我的GPU加速

本文详细介绍了在Windows 11上配置CUDA 12.3与PyTorch的完整指南,包括环境准备、安装要点、兼容性解决方案和性能验证。通过官方推荐的conda命令和实用技巧,帮助开发者解决常见问题,实现高效的GPU加速,提升深度学习开发效率。

weixin_42528974的博客 109

spring 多参数构造器注入bean的实现方式

使用@Configuration public class User { private String name; private Integer age; User(String name ,Integer age){ this.name = name; this.age = age; System.out.println("---------name--------"+name+"---------age--------.

beiduofen2011的专栏 680

手把手教你用Cesium和RayMarching实现逼真体积云(附完整Shader代码)

本文详细介绍了如何利用Cesium和RayMarching技术实现逼真的体积云效果,包括环境准备、核心逻辑、云层建模和光照增强等关键步骤,并提供了完整的Shader代码。通过噪声函数选型、动态风场模拟和多重散射近似等技术,开发者可以在数字地球可视化项目中创建沉浸式天气效果,显著提升场景的真实感。

weixin_29230649的博客 415

华为S5720交换机堆叠配置

S5720交换机,做下堆叠,两条线,交叉互联(即A交换机23口连到B交换机24口,A交换机24口连接B交换机23口)。PS:S5720堆叠可基于电口或者光口做,本次测试基于电口。 SWA配置 # 改名 [Huawei]sysname SWA # 最好先shutdown接口 [SWA]interface GigabitEthernet 0/0/23 [SWA-GigabitEthernet0/0/23]shutdown [SWA-GigabitEthernet0/0/23]interface G.

Markdown 6340

多级嵌套Bean的字符串解析成JavaBean

【代码】多级嵌套Bean的字符串解析成JavaBean。

weixin_44969766的博客 542

ESP32、MicroPython、天问ASR-PRO,串口发送数据并播报

天问ASRPRO语音芯片内置脑神经网络处理器,支持DNN、TDNN、RNN等神经网络及卷积运算硬件运算,非软件运算,支持语音识别、声纹识别、语音增强、语音检测、单麦克风降噪增强、单麦克风回声消除、360度全方位拾音等功能。ASR-PRO可以图形化编程,降低开发难度,对小白友好。之前使用ASRPRO与ESP32进行过语音控制,这次由于一个项目需要对ESP处理过后的数据进行播报,就想到利用该模块。以下程序主要为测试代码,并非实际项目,仅供参考学习(若有错误,欢迎指正)。二者通过串口通信,波特率为9600。

weak_student的博客 5947

7.5.7:注入嵌套Bean

如果某个Bean所依赖的Bean不想被Spring容器直接访问,可以使用嵌套Bean。元素用来定义嵌套Bean,嵌套Bean只对嵌套它的外部Bean有效,Spring容器无法直接访问嵌套Bean,因此定义嵌套Bean时无须指定id属性: Axe.java : public interface Axe { public String chop(); }Person.java : publ

confirmAname的专栏 2368

AI Agent驱动的多模态情感分析方法:从BERT到Vision Transformer的探索

情感分析(Sentiment Analysis)是自然语言处理(NLP)与计算机视觉(CV)中一项重要任务。传统的情感分析主要依赖于文本数据,但在现实应用中,情感往往通过 语言、语音、表情、姿态 等多模态信号共同传达。因此,结合 多模态深度学习 的 AI Agent 在情感理解中具有广阔的前景。

一键难忘的博客 738

RDKit | 基于Pytorch和RDKit建立QSAR模型

QSAR 定量构效方法(quantitative structure-activity relationship, QSAR)是应用最为广泛的药物设计方法。所谓定量构效方法就是通过一些数理统计方法建立其一系列化合物的生理活性或某种性质与其物理化学性质之间的定量关系,通过这些定量关系。可以预测化合物的生理活性或某些性质,指导我们设计出具有更高活性的化合物。 早在...

DrugOne 5077

注入嵌套Bean

Spring嵌套Bean

ChambersC的博客 720

手把手教你学Simulink——高频隔离型双向DC-AC逆变器的建模与仿真

本文系统讲解高频隔离型双向DC-AC逆变器的Simulink建模与仿真,基于DAB+全桥逆变两级拓扑,详述DAB移相控制原理、双闭环控制策略及分步仿真搭建流程。重点涵盖电路建模、控制环设计、参数设置与常见问题调试,强调模块化分步验证与分层控制逻辑,实现安全、高效、灵活的双向能量流动仿真,适用于储能、微电网等场景的系统开发与验证。

MHD0815的博客 107

Spring入门三 Bean的集合类型

Bean的集合类型 1.相当于是在内部嵌套多个Bean 前者: 后者: value相当于是在编号栏中填空。 2.对于 通过 注入容器中其他的 Bean,这儿注入的Bean写在后面了。 3.留下的问题 System.out.println(customer.getLists().toString()); 为什么要getLists() 从前面单一嵌套来说:System.out.println(obj...

weixin_42074747的博客 426

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【Spring5】嵌套配置属性和集合

一对多关系配置xml:嵌套配置bean和property <bean id="emp" class="com.mjc.spring5.bean.Emp"> <!--先设置两个普通的属性--> <property name="ename" value="lucy"></property> <property name="gender" value="famale"></property> <!--设置

YunnKee的博客 393

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Spring Bean如何配置

Spring读书笔记-----Spring的Bean之设置Bean值           Java实例的属性值可以有很多种数据类型、基本类型值、字符串类型、java实例甚至其他的Bean实例、java集合、数组等。所以Spring允许通过如下几个元素为Bean实例的属性指定值:           value           ref           bean  

2226

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Spring自动装配Map,List等集合@ConfigurationProperties

这个特性的其实还得归纳到@Autowired的特性上,或者说@Autowired包涵了一些我们不知道的能力。 @Autowired private Map<String, BaseValidateCodeGenerator> baseValidateCodeGenerators; 在Spring中,写形式的代码,spring能自动装配值到map中,这种装配不是简单的给Map赋值,而是往...

诗人不写诗 3579

Sprint学习笔记(1)之Spring中的Bean配置

Spring中的Bean配置 IOC & DI概述 1.        IOC(控制反转):器思想是反转资源获取的方向。 1)        传统:资源查找方式要求组件向容器发起请求查找资源。作为回应回应,容器适时的返回资源。  2)        IOC:容器主动地将资源推送给它所管理的组件,组件所要做的就是选择一种合适的方式来接受资源。 2.        DI(依赖注入):IOC

鹏哥技术博客 1631

Spring高级应用之注入嵌套Bean

在Spring中,如果某个Bean所依赖的Bean不想被Spring容器直接访问,可以使用嵌套Bean。和普通的Bean一样,使用元素来定义嵌套的Bean,嵌套Bean只对它的外部的Bean有效,Spring容器无法直接访问嵌套的Bean,因此定义嵌套Bean也无需指定id属性。如下配置片段是一个嵌套Bean的示例: ? 1 2 3 4

caomiao2006的专栏 4463

Spring基于xml注入bean的几种方式

Spring基于XML的Bean注入方式包括构造器注入、Setter方法注入、内部Bean注入、集合注入、通过工厂方法注入和自动装配。这些方式提供了灵活的配置和管理Bean依赖的能力,使得Spring容器可以轻松管理复杂的对象关系。

weixin_45990682的博客 1176

Spring装配Bean——通过XML配置装配Bean

使用XML装配Bean需要定义对应的XML,这里需要引入对应的XML模式(XSD)文件,这些文件会定义配置Spring Bean的一些元素,一个简单的模板如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns...

monkey_wei的博客 251

Spring Set方法注入及简化方法

Tips:针对于不同类型的成员变量,在< property >标签内,需要嵌套其他标签: <property> xxxxx </property> 1. JDK内置类型 1.1 String+8种基本类型 <property name="id"> <value>2</value> </property> 1.2 数组 <!-- 数组注入--> <pro

戴翔的技术博客 787

轻量级Java_EE企业应用实战-Spring容器中的bean

1.1Spring中BeanFactory与ApplicaitonContext的区别 1.2bean设置普通属性值(int double等) 采用value来引入 1.2.1配置合作者bean 1.2.2使用自动装配注入合作者Bean 转存失败重新上传取消 转存失败重新上传取消 转存失败重新上传取消转存失败重新上传取消 转存失败重新上传取消转存失败重新上传取...

Gangplank19的博客 191

Spring Bean - xml 配置文件创建对象

【代码】Spring Bean配置文件创建对象。

gu2022_3_5_21_23的博客 604

Spring XML配置全解析:从依赖注入到集合操作

本文介绍了Spring框架中XML配置依赖注入的核心方法,包括7种主要场景:1)基本值和字符串设置;2)使用p-namespace简化配置;3)Properties类型配置;4)idref安全引用;5)Bean实例引用;6)内部匿名Bean;7)集合类型配置。重点讲解了如何通过<property>标签和属性注入值或引用其他Bean,以及集合合并等高级特性。每种方式都配有XML示例和适用场景说明,帮助开发者灵活选择最合适的依赖注入实现方案。

m0_37607945的博客 830

spring 第2天,bean作用域,自动注入集合

sping容器中的Bean default-lazy-init:指定该beans下的所有bean 默认延迟初始化行为 default-merge:指定beans下的所有bean默认的mege行为 default-autowire:指定beans下的所有bean的默认自动装配行为 default-autowire-candidates:指定beans下所有bean默认是否为自动装配

路虽远行则将至,事虽难做则必成 860
上一篇: Spring1.2——bean相关
下一篇: Spring2.2——实例化Bean的3种方式
ack_Finding
博客等级 码龄10年 6粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值