`

Spring基本用法3——Spring容器中Bean的相关属性

阅读更多

        前言:Spring容器就是一个超级大工厂,而Spring容器中的Bean就是该工厂的产品,Spring容器能产生哪些产品,则完全取决于开发者在配置文件中的配置。本文就配置Bean时可添加的属性、功能做介绍,基本覆盖开发中的常规功能。

本篇文章重点关注以下问题:

  • Bean的基本定义和属性
  • 配置Bean的依赖关系

1. Bean的基本定义和属性

<?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
                           http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">

    <bean id="pencil"       class="com.wj.chapter1.ioc.constructor.xml.Service.Pencil"></bean>
    <bean id="ballpointPen" class="com.wj.chapter1.ioc.constructor.xml.Service.BallpointPen"></bean>
</beans>

 

1.1 配置文件根元素<beans>

      <beans../>元素是Spring配置文件的根元素,该元素可以指定如下属性:

  • default-lazy-init:指定该 <beans../>元素下配置的所有Bean默认的延迟初始化行为;(默认false)
  • default-merge:指定该 <beans../>元素下配置的所有Bean默认的merge行为(继承父Bean属性);(默认true)
  • default-autowire:指定该 <beans../>元素下配置的所有Bean默认的自动装配行为;(默认no)
  • default-autowire-candidates:指定该 <beans../>元素下配置的所有Bean默认是否作为自动装配的候选Bean;
  • default-init-method:指定该 <beans../>元素下配置的所有Bean默认的初始化方法;
  • default-destroy-method:指定该 <beans../>元素下配置的所有Bean默认的回收方法。

1.2 配置<beans../>的子元素<bean../>

       <beans../>元素可以包含多个<bean../>子元素,每个<bean../>子元素定义一个Bean,每个Bean对应Spring容器里的一个java实例。

       定义Bean时,通常需要指定两个属性:id、class

id:   确定该Bean的唯一标识,容器对该Bean的管理、访问,以及该Bean的依赖关系,都通
       过该属性完成。Bean的id属性在Spring容器中应该是唯一的;(字母开头,字母数字组成)
class:指定该Bean的实现类,而不是接口,通常情况下Spring会直接使用new关键字创建该
       Bean的实例,因此,这里必须提供Bean的实现类的类名。

        <bean../>元素的其他属性:

属性名 属性值类型 默认值 作用
abstract Boolean false 指明该Bean作为父类,spring容器不会为该类创建对象
autowire-candidate Boolean true 指明该Bean是否作为自动装配的候选Bean
autowire String no 指明该Bean是否采用自动装配及采用自动装配的规则
depends-on String —— 显示指明该Bean依赖的其他Bean(确保依赖Bean先实例化)
destroy-method String —— 指明该Bean默认的回收方法
factory-bean String —— 工厂方法创建对象时,指定工厂Bean
factory-method String —— 工厂方法创建对象时,指定工厂Bean中创建对象的方法
init-method String —— 指明该Bean默认的初始化方法
lazy-init Boolean false 指明该Bean的延迟初始化行为(只对单例模式起作用)
name String —— 指明该Bean的别名alias,可以有多个,可以其他Bean重名
parent String —— 指明该bean需要继承的父类Bean
primary Boolean false 自动装配若候选Bean不止一个,则此属性为true的Bean当选
scope String singleton 指明该Bean的作用域

 

    补充说明:

  1. autowire属性有五种模式:no(不采用自动装配)、byName(通过属性的名称自动装配)、byType(通过类型自动装配)、constructor(通过构造函数的参数类型来匹配)、default(采用父级标签,即beans的default-autowire属性的配置);
  2. scope属性有五种模式:singleton(单例模式)、prototype(多例模式)、request(该bean仅在当前HTTP request内有效)、session(该bean仅在当前HTTP session内有效)、global session(作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义)。

2. 配置Bean的依赖关系

       Spring有两种依赖注入方式(设值注入和构造注入),但不管哪种注入,都需要为参数传入参数值,而java类的成员变量可以是各种数据类型,除了基本类型、字符串类型、还可以是其他java实例,也可以是java集合、数组等,所有Spring允许通过如下元素为setter方法、构造器参数指定参数值:

  • value:指定参数值是基本类型及其包装、字符串类型;
  • ref:指定参数值是容器中的另一个Bean实例;
  • bean:指定参数值是一个嵌套Bean实例;
  • list、set、map及props:指定参数值是集合。

2.1 各数据类型的成员变量在配置Bean时的注入方式

2.1.1 设置普通属性值

<!-- 设置普通属性值. -->
<bean id="valueDiBean" class="com.wj.chapter3.di.Di_Bean_Value">
    <!-- 指定int型参数. -->
    <property name="integerField" value="100"/>
    <!-- 指定double型参数. -->
    <property name="doubleField"  value="99.99"/>
    <!-- 指定String型参数. -->
    <property name="stringField"  value="一百分"/>
</bean>

 

2.1.2 配置合作者Bean

 

<!-- 配置合作者Bean. -->
<bean id="refDiBean" class="com.wj.chapter3.di.Di_Bean_Ref">
    <property name="valueBean" ref="valueDiBean"></property>
</bean>

 

 2.1.3 指定使用byName策略自动注入

<!-- 指定使用byName策略,Spring会根据setter方法的方法名与Bean的id(dependOnBeanTTT)进行匹配. -->
<bean id="byNameBean" class="com.wj.chapter3.di.byNameBean.ByNameBean" autowire="byName"/>
<!-- setDependOnBeanTTT(..)方法与id(dependOnBeanTTT)相对应. -->
<bean id="dependOnBeanTTT" class="com.wj.chapter3.di.byNameBean.ByNameDependOn">
    <property name="name" value="熊燕子"/>
</bean>

 

 2.1.4 指定使用byType策略自动注入

<!-- 指定使用byType策略,Spring会根据setter方法的参数类型与Bean的类型进行匹配. -->
<bean id="byTypeBean" class="com.wj.chapter3.di.byTypeBean.ByTypeBean" autowire="byType"/>
<bean id="dependOnBean1" class="com.wj.chapter3.di.byTypeBean.ByTypeDependOn1">
    <property name="name" value="熊燕子1"/>
</bean>
<!-- autowire-candidate指明Bean不作为自动装配的候选Bean. -->
<bean id="dependOnBean2" class="com.wj.chapter3.di.byTypeBean.ByTypeDependOn2" autowire-candidate="false">
    <property name="name" value="熊燕子2"/>
</bean>

 

 

2.1.5 注入嵌套Bean

<!-- 注入嵌套Bean(嵌套Bean不能被容器访问). -->
<bean id="outerBean" class="com.wj.chapter3.di.nestedBean.OuterBean">
    <!-- 驱动调用outerBean的getInnerBean()方法,使用嵌套Bean作为参数 -->
    <property name="innerBean">
        <!-- 嵌套Bean配置的对象仅作为setter方法的参数嵌套Bean不能被容器访问,因此无需指定id属性-->
        <bean class="com.wj.chapter3.di.nestedBean.InnerBean"/>
    </property>
</bean>

 

2.1.6 注入集合值

<bean id="collectionBean" class="com.wj.chapter3.di.DI_Bean_Collection">
        <property name="list">
            <!-- 为调用setList()方法配置List集合作为参数值 -->
            <list>
                <value>List元素1</value>
                <value>List元素2</value>
                <value>List元素3</value>
            </list>
        </property>
        <property name="set">
            <!-- 为调用setSet()方法配置Map集合作为参数值 -->
            <set>
                <value>100</value>
                <value>200</value>
                <value>300</value>
            </set>
        </property>
        <property name="map">
            <!-- 为调用setMap()方法配置Map集合作为参数值 -->
            <map>
                <!-- 每个entry配置一个key-value对 -->
                <entry key="熊燕子 " value-ref="dependOnBean1"/>
                <entry key="wj"    value-ref="dependOnBean2"/>
            </map>
        </property>
        <property name="prop">
            <!-- 为调用setProp()方法配置Properties集合作为参数值 -->
            <props>
                <!-- 每个prop元素配置一个属性项,其中key指定属性名 -->
                <prop key="熊燕子">159</prop>
                <prop key="wj">173</prop>
            </props>
        </property>
        <property name="array">
            <!-- 为调用setArray()方法配置数组作为参数值 -->
            <list>
                <value>小学</value>
                <value>中学</value>
                <value>大学</value>
            </list>
        </property>
    </bean>

 2.2 编写各实体Bean

         这里不做阐述,详细代码可见附件;

 2.3 编写测试代码

public class Main {
    
    // 1.指明xml配置文件位置,便于Spring读取,从而知道Bean的相关信息
    private static final String PATH_XML = "com/wj/chapter3/di/applicationContext-di.xml";

    @SuppressWarnings("resource")
    public static void main(String[] args) {
        // 2.根据xml配置文件,创建Spring IOC容器的上下文
        ApplicationContext cxt = new ClassPathXmlApplicationContext(PATH_XML);
        
        // 3.设置普通属性值测试
        Di_Bean_Value valuebean = cxt.getBean("valueDiBean", Di_Bean_Value.class);
        System.out.println("**************设置普通属性值测试*************");
        System.out.println("int类型:"    + valuebean.getIntegerField());
        System.out.println("double类型:" + valuebean.getDoubleField());
        System.out.println("String类型:" + valuebean.getStringField());
        System.out.println();
        
        // 4. 配置合作者Bean测试
        Di_Bean_Ref refBean = cxt.getBean("refDiBean", Di_Bean_Ref.class);
        System.out.println("**************配置合作者Bean测试*************");
        System.out.println("合作者Bean:" + refBean.toString());
        System.out.println();
        
        // 5. 指定使用byName策略测试
        ByNameBean byNameBean = cxt.getBean("byNameBean", ByNameBean.class);
        System.out.println("**************指定使用byName策略测试*************");
        byNameBean.test();
        System.out.println();
        
        // 6. 指定使用byType策略测试
        ByTypeBean byTypeBean = cxt.getBean("byTypeBean", ByTypeBean.class);
        System.out.println("**************指定使用byType策略测试*************");
        byTypeBean.test();
        System.out.println();
        
        // 7. 测试注入内嵌Bean
        OuterBean outerBean = cxt.getBean("outerBean", OuterBean.class);
        System.out.println("**************测试注入内嵌Bean*************");
        outerBean.test();
        System.out.println();
        
        // 8. 测试注入集合值
        DI_Bean_Collection collectionBean = cxt.getBean("collectionBean", DI_Bean_Collection.class);
        System.out.println("**************测试注入集合值*************");
        collectionBean.test();
    }
}

 

2.4 查看测试结果,验证注入的正确性

       可以看出,测试基本成功。

      补充:Spring还支持组合属性的方式进行注入,但是这不常见,就没写入实例

 

代码下载地址:http://pan.baidu.com/s/1mi0u4Q0密码:p2yv

  • 大小: 67.8 KB
分享到:
评论

相关推荐

    pandas-1.3.5-cp37-cp37m-macosx_10_9_x86_64.zip

    pandas whl安装包,对应各个python版本和系统(具体看资源名字),找准自己对应的下载即可! 下载后解压出来是已.whl为后缀的安装包,进入终端,直接pip install pandas-xxx.whl即可,非常方便。 再也不用担心pip联网下载网络超时,各种安装不成功的问题。

    基于java的大学生兼职信息系统答辩PPT.pptx

    基于java的大学生兼职信息系统答辩PPT.pptx

    基于java的乐校园二手书交易管理系统答辩PPT.pptx

    基于java的乐校园二手书交易管理系统答辩PPT.pptx

    tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl

    tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl

    Android Studio Ladybug(android-studio-2024.2.1.10-mac.zip.002)

    Android Studio Ladybug 2024.2.1(android-studio-2024.2.1.10-mac.dmg)适用于macOS Intel系统,文件使用360压缩软件分割成两个压缩包,必须一起下载使用: part1: https://download.csdn.net/download/weixin_43800734/89954174 part2: https://download.csdn.net/download/weixin_43800734/89954175

    基于ssm框架+mysql+jsp实现的监考安排与查询系统

    有学生和教师两种角色 登录和注册模块 考场信息模块 考试信息模块 点我收藏 功能 监考安排模块 考场类型模块 系统公告模块 个人中心模块: 1、修改个人信息,可以上传图片 2、我的收藏列表 账号管理模块 服务模块 eclipse或者idea 均可以运行 jdk1.8 apache-maven-3.6 mysql5.7及以上 tomcat 8.0及以上版本

    tornado-6.1b2-cp38-cp38-macosx_10_9_x86_64.whl

    tornado-6.1b2-cp38-cp38-macosx_10_9_x86_64.whl

    Android Studio Ladybug(android-studio-2024.2.1.10-mac.zip.001)

    Android Studio Ladybug 2024.2.1(android-studio-2024.2.1.10-mac.dmg)适用于macOS Intel系统,文件使用360压缩软件分割成两个压缩包,必须一起下载使用: part1: https://download.csdn.net/download/weixin_43800734/89954174 part2: https://download.csdn.net/download/weixin_43800734/89954175

    基于MATLAB车牌识别代码实现代码【含界面GUI】.zip

    matlab

    基于java的毕业生就业信息管理系统答辩PPT.pptx

    基于java的毕业生就业信息管理系统答辩PPT.pptx

    基于Web的毕业设计选题系统的设计与实现(springboot+vue+mysql+说明文档).zip

    随着高等教育的普及和毕业设计的日益重要,为了方便教师、学生和管理员进行毕业设计的选题和管理,我们开发了这款基于Web的毕业设计选题系统。 该系统主要包括教师管理、院系管理、学生管理等多个模块。在教师管理模块中,管理员可以新增、删除教师信息,并查看教师的详细资料,方便进行教师资源的分配和管理。院系管理模块则允许管理员对各个院系的信息进行管理和维护,确保信息的准确性和完整性。 学生管理模块是系统的核心之一,它提供了学生选题、任务书管理、开题报告管理、开题成绩管理等功能。学生可以在此模块中进行毕业设计的选题,并上传任务书和开题报告,管理员和教师则可以对学生的报告进行审阅和评分。 此外,系统还具备课题分类管理和课题信息管理功能,方便对毕业设计课题进行分类和归档,提高管理效率。在线留言功能则为学生、教师和管理员提供了一个交流互动的平台,可以就毕业设计相关问题进行讨论和解答。 整个系统设计简洁明了,操作便捷,大大提高了毕业设计的选题和管理效率,为高等教育的发展做出了积极贡献。

    机器学习(预测模型):2000年至2015年期间193个国家的预期寿命和相关健康因素的数据

    这个数据集来自世界卫生组织(WHO),包含了2000年至2015年期间193个国家的预期寿命和相关健康因素的数据。它提供了一个全面的视角,用于分析影响全球人口预期寿命的多种因素。数据集涵盖了从婴儿死亡率、GDP、BMI到免疫接种覆盖率等多个维度,为研究者提供了丰富的信息来探索和预测预期寿命。 该数据集的特点在于其跨国家的比较性,使得研究者能够识别出不同国家之间预期寿命的差异,并分析这些差异背后的原因。数据集包含22个特征列和2938行数据,涉及的变量被分为几个大类:免疫相关因素、死亡因素、经济因素和社会因素。这些数据不仅有助于了解全球健康趋势,还可以辅助制定公共卫生政策和社会福利计划。 数据集的处理包括对缺失值的处理、数据类型转换以及去重等步骤,以确保数据的准确性和可靠性。研究者可以使用这个数据集来探索如教育、健康习惯、生活方式等因素如何影响人们的寿命,以及不同国家的经济发展水平如何与预期寿命相关联。此外,数据集还可以用于预测模型的构建,通过回归分析等统计方法来预测预期寿命。 总的来说,这个数据集是研究全球健康和预期寿命变化的宝贵资源,它不仅提供了历史数据,还为未来的研究和政策制

    基于微信小程序的高校毕业论文管理系统小程序答辩PPT.pptx

    基于微信小程序的高校毕业论文管理系统小程序答辩PPT.pptx

    基于java的超市 Pos 收银管理系统答辩PPT.pptx

    基于java的超市 Pos 收银管理系统答辩PPT.pptx

    基于java的网上报名系统答辩PPT.pptx

    基于java的网上报名系统答辩PPT.pptx

    基于java的网上书城答辩PPT.pptx

    基于java的网上书城答辩PPT.pptx

    婚恋网站 SSM毕业设计 附带论文.zip

    婚恋网站 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B

    基于java的戒烟网站答辩PPT.pptx

    基于java的戒烟网站答辩PPT.pptx

    基于微信小程序的“健康早知道”微信小程序答辩PPT.pptx

    基于微信小程序的“健康早知道”微信小程序答辩PPT.pptx

    机器学习(预测模型):自行车共享使用情况的数据集

    Capital Bikeshare 数据集是一个包含从2020年5月到2024年8月的自行车共享使用情况的数据集。这个数据集记录了华盛顿特区Capital Bikeshare项目中自行车的租赁模式,包括了骑行的持续时间、开始和结束日期时间、起始和结束站点、使用的自行车编号、用户类型(注册会员或临时用户)等信息。这些数据可以帮助分析和预测自行车共享系统的需求模式,以及了解用户行为和偏好。 数据集的特点包括: 时间范围:覆盖了四年多的时间,提供了长期的数据观察。 细节丰富:包含了每次骑行的详细信息,如日期、时间、天气条件、季节等,有助于深入分析。 用户分类:数据中区分了注册用户和临时用户,可以分析不同用户群体的使用习惯。 天气和季节因素:包含了天气情况和季节信息,可以研究这些因素对骑行需求的影响。 通过分析这个数据集,可以得出关于自行车共享使用模式的多种见解,比如一天中不同时间段的使用高峰、不同天气条件下的使用差异、季节性变化对骑行需求的影响等。这些信息对于城市规划者、交通管理者以及自行车共享服务提供商来说都是非常宝贵的,可以帮助他们优化服务、提高效率和满足用户需求。同时,这个数据集也

Global site tag (gtag.js) - Google Analytics