Java知识点总结:想看的可以从这里进入
目录
- 8、用XML装配Bean
- 8.1、XML文件主体
- 8.2、配置Bean对象
- 8.2.1、bean标签
- 8.2.2、属性注入
- 8.2.3、注入内部bean
- 8.2.4、注入其他属性
- 8.3、命名空间装配
- 8.4、导入其他XML
- 8.5、自动装配
8、用XML装配Bean
在Spring中常常使用 XML 文件来注册管理Bean对象的依赖关系,它是通过先定义,然后初始化和依赖注入的。Spring在启动时,就会查找程序中的XML文件,读取其中配置信息,根据配置信息完成一系列的操作。
Spring中的XML配置通常会根据内容起不同的名字,比如:spring-common.xml:用来存放通用的配置、spring-mybatis.xml:用来存放数据库相关的配置、spring-shiro.xml:用来存放shiro相关的配置。其中applicationContext.xml是Spring的默认配置文件,当容器启动时找不到指定的配置文档时,将会尝试加载这个默认的配置文件。
8.1、XML文件主体
使用 beans 作为根标签(pom.xml使用project作为根标签,web.xml使用web-app作为根标签)
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
</beans>
8.2、配置Bean对象
8.2.1、bean标签
在 XML 文件中通过标签 < bean> < /bean> 定义一个Bean对象。
<!--
1、id:是bean对象的唯一标识符,Spring IoC 容器对 Bean 的配置和管理都通过该属性完成。
2、name:别名,可为Bean 同时指定多个名称,之间用逗号或分号隔开。Spring 容器可以通过name配置和管理容器中的 Bean。
3、class:Spring容器可以通过此路径获取对应的class类
4、scope:Bean 的作用域(singleton(单例)、prototype(原型)、request、session)。默认值是 singleton。
5、init-method:可以指定一个方法为初始化方法
6、destroy-method:可以指定一个方法为销毁方法
-->
<bean id="" name="" class="" scope="" init-method="" destroy-method="">
</bean>
8.2.2、属性注入
Bean 属性注入,就是将属性注入到 Bean 中的过程,既可以注入普通属性,也可以注入一个对象(Bean)。
Spring 主要通过以下 2 种方式实现属性注入:
- 通过构造函数注入属性
<!-- name:对应属性名
value:属性的值
index:构造方法中参数的索引位置,从0开始、 type:通过数据类型
ref:属性为bean对象时,加载其他bean对象
-->
<constructor-arg name="" value="" index="" ref=""/>
- setter方法 注入
<!-- name:对应属性名
value:属性的值
ref:属性为bean对象时,加载其他bean对象
-->
<property name="" value="" ref=""/>
<bean id="" class="com.******" scope="" init-method="" destroy-method="">
<!--构造方法注入,可以用name对应,也可以使用index -->
<constructor-arg name="属性名" value="值"/>
<constructor-arg index="" ref="引用对象"/> index是构造参数的顺序,从0开始,
<!--set方法注入 ,和属性值对应-->
<property name="属性名" value="值"/>
<property name="属性名" ref="注入一个bean对象,这里写id值"/> 引用对象
</bean>
两个类:
然后通过XML配置对象
如果赋null值,不能直接 < property name=“” value=“null” /> 这样写,这样赋值赋的是null字符串,应该写成 :
< property name=“name”>
< null />
< /property>
8.2.3、注入内部bean
在一个bean标签中再声明一个bean标签,这就是内部bean,假设一个bean中需要引用其他的对象时,之前我们是通过property、constructor-arg标签的 ref 属性来引入一个bean对象,而现在是直接在标签内创建bean标签:
8.2.4、注入其他属性
除了内部bean外,我们还可以在 property、constructor-arg 便签内部中,配置 Java 集合类型的属性和参数(如 List、Set、Map、Properties 等等)。
标签 | 描述 |
list | 注入一个list类型的值,允许重复 |
array | 注入一个数据类型的值 |
set | 注入set类型的值,不可重复 |
map | 用于注入 key-value 的集合,其中 key 和 value 都可以是任意类型 |
props | 用于注入 key-value 的集合,其中 key 和 value 都是字符串类型 |
null | 注入空值 |
<bean id="" class="">
<!-- 注入数组 -->
<property name="属性名">
<array>
<value>值</value>
<ref bean="bean的id值"/> 注入的是bean对象
</array>
</property>
<!-- 注入list集合 -->
<property name="属性名">
<list>
<value>值</value>
<ref bean="对象id值"/> 注入的是对象
</list>
</property>
<!--注入set集合-->
<property name="属性名">
<set>
<value>值</value>
<ref bean="对象id值"/> 注入的是对象
</set>
</property>
<!-- 注入map集合 value是直接赋值,,ref是引用一个对象 -->
<property name="属性名">
<map>
<entry key="键" value="值"/>
<entry key-ref="" value-ref=""/>
</map>
</property>
<!-- 注入Properties对象-->
<property name="属性名">
<props>
<prop key="键">值</prop>
<prop key="键"/>
</props>
</property>
<!--赋空值 -->
<property name="属性名">
<null/> 赋空值
</property>
</bean>
8.3、命名空间装配
Spring使用XML进行属性装配其实并不是很复杂,不过XML里有命名空间这个概念,所以Spring也提供了 命名空间p和c 装配的方式。(p就是set方法注入,c就是构造方法注入)。除了这个外,还可以使用 util 注入集合等属性
命名空间装配可以减少标签的使用
如果你想使用命名空间p、c、和util,只需要在Spring 的XML 头文件中加入约束文件:
xmlns:c="http://www.springframework.org/schema/c"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- c就是通过构造方法注入,这样不需要在内部使用constructor-arg标签了,其中0,1,2是构造参数的顺序-->
<bean id="person1" class="com.yu.pojo.Person" c:_0="" c:_1="" c:_2=""/>
<!--p通过set方法注入,p:属性名="值" -->
<bean id="person2" class="com.yu.pojo.Person" p:name="" p:sex="" p:age=""/>
<!-- 使用util 可以定义list、map、set等集合,定义后的集合是一个Bean对象,-->
<util:list id="list">
<ref bean="p"/> <!--对象-->
<value>String</value> <!--值-->
</util:list>
<util:set id="set">
<ref bean="p"/>
<value>String</value>
</util:set>
<util:map id="map">
<entry key-ref="p" value-ref="p"/>
</util:map>
</beans>
8.4、导入其他XML
可以多配置一些xml文件,方便区分,然后用主文件引入这些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/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--引入其他的xml -->
<import resource="***.xml"/>
<import resource="***.xml"/>
.......
</beans>
比如我们创建一个application.xml文件,然后在其中引入 beans.xml文件,引入后,我们可以通过获取application文件,就能获取到 beans 中定义的bean
8.5、自动装配
Spring提供了自动装配的功能,在不使用 constructor-arg 和 property 手动装配的情况下也可以进行自动装配bean。(自动装配不能用在字面量的属性上,只能用在我们自定义的类)
Spring 的自动装配功能可以让 Spring 容器依据自动装配的规则(有五种),为指定的 Bean 从应用的上下文中查找它所依赖的 Bean,并自动建立 Bean 之间的依赖关系。
- byName:按名字自动装配,bean的 id名或 name 名必须和类中的属性名要一致才能自动装配
- byType:按类型自动装配,在容器上下文中自动寻找类型相同的bean(对象类型要全局唯一),byType自动装配时id可省略
- constructor:是根据构造器参数的数据类型,进行 byType 模式的自动装配。
- default:默认采用上一级元素 beans 设置的自动装配规则(default-autowire)进行装配。
- no:默认的情况,不自动装配,需要手动装配
自动装配功能能够有效地简化 Spring 应用的 XML 配置,因此在配置数量多时采用自动装配可以降低工作量。Spring 框架式默认使不支持自动装配的,要想使用自动装配,则需要对 Spring XML 配置文件中 bean 元素的 autowire 属性进行设置。
<?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/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--两个对象-->
<bean id="p1" class="****"></bean>
<bean id="p2" class="****"></bean>
<!--手动注入的方式,需要property引用对象-->
<bean id="" class="">
<property name="p1" ref="p1"/>
<property name="p2" ref="p2"/>
</bean>
<!--自动装配的几种方式:
byName:按名字,在容器上下文中自动寻找set方法后相匹配名字的bean(bean的id名和类中的属性名要一致才能自动装配)
byType:按类型,在容器上下文中自动寻找类型相同的bean(对象类型要全局唯一),byType自动装配时id可省略
constructor:通过构造函数,会寻找与构造函数中参数类型相匹配的bean,通过构造函数注入
default:默认采用上一级元素 beans 设置的自动装配规则(default-autowire)进行装配。
no:默认的情况,不自动装配,需要手动装配
-->
<!--如果内部有属性和 IOC中管理Bean一致,就会自动装配进去,其他属性手动设置-->
<bean id="" class="" autowire="byName"/>
</beans>