2.3 Bean装配
- Spring框架的类包都已放在应用程序的类路径;
- 应用程序为Spring提供完备的Bean信息;
- Bean的类都已放到应用程序的类路径下。
- Bean的实现类;
- Bean的属性信息(如数据源的连接数、用户名、密码);
- bean的依赖关系,Spring根据依赖关系配置完成Bean间的装配;
- Bean的行为配置(如生命周期范围及生命周期各过程的回调函数)。
![](/assets/blank.gif)
![](/assets/blank.gif)
2)构造函数注入
<!--构造注入-类型匹配入参-->
<bean id="car1" class="com.smart.injection.Car">
<constructor-arg type="java.lang.String">
<value>红旗CA72</value>
</constructor-arg>
<constructor-arg type="double">
<value>20000</value>
</constructor-arg>
<!--Car Bean中必须有和此处一致的构造函数(String、double参数的构造函数)-->
</bean>
②ByIndex:
<!--构造注入-索引匹配入参-->
<bean id="carIndex" class="com.smart.injection.Car">
<!--索引从0开始-->
<constructor-arg index="0" value="红旗CA72"/>
<constructor-arg index="1" value="中国一汽"/>
<constructor-arg index="2" value="20000"/>
<!-- 必须有一个3个入参的构造函数,如果不止一个,将以最后一个构造函数为准 -->
</bean>
③ByTypeIndex:
<!--构造注入-类型、索引 联合匹配入参--><bean id="carTypeIndex" class="com.smart.injection.Car"><constructor-arg index="0" type="java.lang.String"><value>红旗CA72</value></constructor-arg><constructor-arg index="1" type="java.lang.String" value="中国一汽"/><!-- constructor-arg两种格式均可 --> <!-- int、double直接写,不加java.lang,否则异常Could not resolve matching constructor (hint: specify index/type/name arguments for simple parameters to avoid type ambiguities) --><constructor-arg index="2" type="double"><value>20000</value></constructor-arg></bean>
④ByReflection:
<!-- 构造注入-自身类型反射reflection --><bean id="office" class="com.smart.injection.Office"/><bean id="boss" class="com.smart.injection.Boss"><!--未设置type、index,通过入参值的类型完后匹配映射--><constructor-arg><value>xiaofan</value></constructor-arg><!--ref引用现有bean--><constructor-arg><ref bean="car"/></constructor-arg><constructor-arg><ref bean="office"/></constructor-arg></bean>
3)循环依赖问题
如果两个Bean均通过构造函数注入,且通过构造函数入参引用对方,就会发生类似线程死锁的循环依赖问题。
<bean id="boss" ……ref="car">
<bean id="car" ……ref="boss">
因为循环依赖问题,Spring容器无法启动,将构造函数注入方式调整为属性注入即可。
2.3.3 注入参数详解
特殊处理标签:
<![CDATA[ str ]]>,作用是让XML解析器将标签中的字符串当做普通文本对待,防止某些字符串对XML格式造成破坏。
<value><![CDATA[红旗CA72]]></value>
- ②引用其他Bean--<ref>
<ref bean="car"/>
- ①字面值--可通过<value>元素标签注入
<ref>元素引用Bean的3个属性:
- ③集合类型属性
<bean id="boss_list" class="com.smart.injection.Boss"><!--List属性既可通过value注入字符串,也可ref引用其他bean--><property name="list"><list><value>Java</value><value>Pathon</value></list></property></bean>
<bean id="boss_map" class="com.smart.injection.Boss"><property name="mapWeek"><map><entry><key><value>Mon</value></key><value>Reading</value></entry><entry><key><value>Tues</value></key><value>Sporting</value></entry><!-- 如果Map元素的键和值都是对象,可以ref <entry> <key><ref bean="keyBean"/></key> <ref bean="valueBean"/> </entry> --></map></property></bean><bean id="boss_pro" class="com.smart.injection.Boss"><!--Properties键值只能是字符串,值的配置没有value标签--><property name="type"><props><prop key="IDE">IDEA</prop><prop key="SQL">MySQL</prop></props></property></bean>
- ④通过util命名空间配置集合类型的Bean
<!--需在Spring配置文件引入util命名空间--><util:list id="list_util" list-class="java.util.LinkedList"><value>Coding</value><value>Walk</value><!--Set类似--></util:list><util:map id="map_util"><entry key="Wed" value="Java"/><entry key="Thu" value="Spring"/></util:map><!-- <util:list>和Set支持value-type属性;Map支持key-type和value-type属性,指定键值类型 -->
- ⑤简化配置方式
<!--简化XML配置:采用属性而非子元素配置信息--><!--Spring从2.5开始引入p命名空间,使用前需声明xmlns:p="http:~schema/p"--><bean id="car" class="com.smart.injection.Car"p:brand="红旗CA72"p:maxSpeed="260"/><bean id="boss" class="com.smart.injection.Boss"p:car-ref="car"/>
- ⑤自动装配 autowire=“<自动装配类型>”
![](/assets/blank.gif)
![](/assets/blank.gif)
<bean id="accountService" class="com.foo.DefaultAccountService" scope="singleton"/>
@Component("userDao")
public class UserDao{……}
等价于一下XML配置:
Spring2.5后提供了context命名空间,提供了提供扫描包以应用注解定义Bean的方式。
<context:component-scan base-package="com.smart"> <context:include-filter type="regex" expression="com\.smart\.anno.*"/> <context:exclude-filter type="aspectj" expression="com.smart..*Controller+"/></context:component-scan>
<context:include-filter>表示要包含的类,<context:exclude-filter>表示要排除的类;一个component-scan下可包含若干个exclude和include。且这两个过滤元素均支持多种类型的过滤表达式。
![](/assets/blank.gif)
@Service //定义一个Service,将UserService标注为一个Beanpublic class UserService {// 注入UserDao这个Dao层的Bean@Autowired
- ①@Autowired的requried属性
- ②@Qualifier指定注入Bean的名称
- ③标注类方法
- ④标注集合类
Spring将容器中所有类型为Plugin的Bean注入这个变量中。
@Componentpublic class MyComponent {@Autowired(required = false)private List<Plugin> plugins; public List<Plugin> getPlugins() {return plugins; }}
此处,Plugin为接口,有两个实现类且两个实现类都通过@Component标注为Bean,So Spring会将这两个Bean都注入plugins。
- @Configuration注解类本身相当于标注了@Component,即可像普通Bean一样被注入其他Bean中(可直接调用@Configuration中标注@Bean的方法,如上)。
- Spring对配置类所有标注@Bean的方法进行AOP增强,将对声明周期的逻辑植入进来。
- A处调用daoConfig.logDao()逻辑:从Spring容器返回相应Bean的单例,即多次调用daoConfig.logDao()返回的都是相同Bean。Bean若标注@Scope("prototype"),则每次返回新的Bean。
-----------------
@Configuration@ImportResource("classpath:com/smart/conf/beans3.xml") //自动注入XML文件中定义的Beanpublic class LogonAppConfig {@Bean // 定义一个LogonService的Bean @Autowired // 通过入参自动注入UserDao和LogDao的Beanpublic LogonService logonService(UserDao userDao, LogDao logDao) { LogonService logonService = new LogonService(); logonService.setUserDao(userDao); logonService.setLogDao(logDao);return logonService; }}
![](/assets/blank.gif)
![](/assets/blank.gif)
欢迎个人转载,但须在文章页面明显位置给出原文连接;
未经作者同意必须保留此段声明、不得随意修改原文、不得用于商业用途,否则保留追究法律责任的权利。
【 CSDN 】:csdn.zxiaofan.com
【GitHub】:github.zxiaofan.com
如有任何问题,欢迎留言。祝君好运!
Life is all about choices!
将来的你一定会感激现在拼命的自己!
2.3 Bean装配相关推荐
- Spring Bean 装配和依赖注入
Spring IOC 容器的依赖注入工作可以分为两个阶段.第一个阶段可以认为是构建和收集 Bean 定义的阶段,在这个阶段中,我们可以通过 xml 或者 Java 代码的方式定义一些 Bean,然后通 ...
- SpringBoot框架(4)-- 类装配及Bean装配监听器
1.普通方式装配类对象 (1)添加带有@Bean注解的方法 User.java(带@Component注解) 1 package com.demo.boot.bootenable.beanDemo ...
- Spring学习(七)bean装配详解之 【通过注解装配 Bean】【自动装配的歧义解决】...
本文借鉴:Spring学习,@Bean 的用法(特此感谢!) 自动装配 1.歧义性 我们知道用@Autowired可以对bean进行注入(按照type注入),但如果有两个相同类型的bean在IOC容器 ...
- Spring学习(六)bean装配详解之 【通过注解装配 Bean】【基础配置方式】
本文借鉴:Spring学习(特此感谢!) 通过注解装配 Bean 1.前言 优势 1.可以减少 XML 的配置,当配置项多的时候,XML配置过多会导致项目臃肿难以维护 2.功能更加强大,既能实现 XM ...
- Spring Bean装配(上)
Bean:在spring的IOC里面,把配置到IOC容器里面的实体或者是对象都称为Bean Bean配置项 Bean的作用域 Bean的生命周期 Bean的自动装配 Resources&Res ...
- spring Bean装配的几种方式简单介绍
Spring容器负责创建应用程序中的bean同时通过ID来协调这些对象之间的关系.作为开发人员,我们需要告诉Spring要创建哪些bean并且如何将其装配到一起. spring中bean装配有两种方式 ...
- Spring bean 装配
装配 bean 1. 自动化装配 @Component 告知Spring为被注解的类创建bean > 为bean命名: > + Spring为Bean默认命名为类名首字母小写 > + ...
- Spring学习(五)bean装配详解之 【XML方式配置】
本文借鉴:Spring学习(特此感谢!) 一.配置Bean的方式及选择 配置方式 在 XML 文件中显式配置 在 Java 的接口和类中实现配置 隐式 Bean 的发现机制和自动装配原则 方式选择的原 ...
- Spring Bean装配
Spring注入 Spring注入是指在启动Spring容器加载bean配置的时候,完成对变量的赋值行为 常用的两种注入方式: 设值注入 构造注入 Bean配置项及作用域 Bean的配置项 Id Cl ...
- Spring 三种bean装配的方式
1.使用xml配置文件装配 Spring成功启动的三大要件分别是:Bean定义信息.Bean实现类以及Spring本身. 在xml文件中配置bean,然后使用ClassPathXmlApplicati ...
最新文章
- tp5+workman
- 激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解
- sql server使用杂记
- springboot指定首页(静态资源导入)
- sun 些命令可以将服务器设置至ok模式_Python 高手之路:从零开始打造一个Web服务器...
- 广和通再推5G利器,发布高性价比5G模组FM650
- STM32 固件包下载
- vs2012 ultimate 密钥
- 适配ofd签章SES_Signature
- 邮箱登陆不了的解决办法
- android开发软件!Android免打包多渠道统计如何实现?满满干货指导
- docker实战学习2022版本(四)之不灭星辰
- assertThat断言测试方法
- ACM recsys十年回顾(转载)
- python0x452_python at 0x
- 第二阶段--团队冲刺--第四天
- 研发人员在公司内部调岗会发生哪些事情?
- CNN卷积神经网络十二生肖识别项目(一)数据下载篇
- 云南省初中计算机说课稿,云南省实验教材《信息技术》说课稿范文(9页)-原创力文档...
- 机械加工工艺规程设计的内容及步骤
热门文章
- spring security http.rememberMe()使用和原理解析
- 缺芯导致全球汽车减产超一千万辆
- java nas 存储_虚拟机NAS存储的安装
- Python基础(三) | Python的组合数据类型
- 织梦 PHP 字段 调用,织梦怎么调用自定义字段
- php织梦源码安装,如何安装网上下载的织梦源码
- Hue编译安装适配sparksql(hue+livy+sparksql+pyspark)
- kettle案例4.1.1--抽取文本数据---TSV文件的抽取
- 图像语义分割网络FCN(32s、16s、8s)原理及MindSpore实现
- Matplotlib——绘图的几个案例_2013-2021年商业银行不良贷款率变化情况_2014-2021年上半年我国商业银行总资产变化情况_2015-2021年我国商业银行净利润变化情况