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>

两个类:


BeanNameViewResolver AbstractRssFeedView配置失效 博客园 bean.xml_spring

然后通过XML配置对象


BeanNameViewResolver AbstractRssFeedView配置失效 博客园 bean.xml_spring_02

BeanNameViewResolver AbstractRssFeedView配置失效 博客园 bean.xml_spring_03

如果赋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标签:

BeanNameViewResolver AbstractRssFeedView配置失效 博客园 bean.xml_自动装配_04

BeanNameViewResolver AbstractRssFeedView配置失效 博客园 bean.xml_spring_05

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>

BeanNameViewResolver AbstractRssFeedView配置失效 博客园 bean.xml_spring_06

BeanNameViewResolver AbstractRssFeedView配置失效 博客园 bean.xml_自动装配_07

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>

BeanNameViewResolver AbstractRssFeedView配置失效 博客园 bean.xml_自动装配_08

BeanNameViewResolver AbstractRssFeedView配置失效 博客园 bean.xml_xml_09

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

BeanNameViewResolver AbstractRssFeedView配置失效 博客园 bean.xml_自动装配_10

BeanNameViewResolver AbstractRssFeedView配置失效 博客园 bean.xml_xml_11

8.5、自动装配

Spring提供了自动装配的功能,在不使用 constructor-arg 和 property 手动装配的情况下也可以进行自动装配bean。(自动装配不能用在字面量的属性上,只能用在我们自定义的类)

Spring 的自动装配功能可以让 Spring 容器依据自动装配的规则(有五种),为指定的 Bean 从应用的上下文中查找它所依赖的 Bean,并自动建立 Bean 之间的依赖关系。

  1. byName:按名字自动装配,bean的 id名或 name 名必须和类中的属性名要一致才能自动装配
  2. byType:按类型自动装配,在容器上下文中自动寻找类型相同的bean(对象类型要全局唯一),byType自动装配时id可省略
  3. constructor:是根据构造器参数的数据类型,进行 byType 模式的自动装配。
  4. default:默认采用上一级元素 beans 设置的自动装配规则(default-autowire)进行装配。
  5. 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>

BeanNameViewResolver AbstractRssFeedView配置失效 博客园 bean.xml_spring_12

BeanNameViewResolver AbstractRssFeedView配置失效 博客园 bean.xml_spring_13