(十一)Spring教程——Bean基本配置与依赖注入之属性注入

1.Bean基本配置

        在进行Bean配置的详细讲解之前,先来了解以下Bean配置的基础知识,以快速建立起Bean配置的初步概念。

1.1装配一个Bean

        在Spring容器的配置文件中定义一个简要Bean的配置片段如下所示

        <bean id=”foo” class=”com.smart.Foo”/>

        一般情况下,Spring IoC容器中的一个Bean对应配置文件中的一个<bean>,这种镜像映射关系应该容易理解。其中,id为这个Bean的名称,通过容器的getBean(“foo”)即可获取对应的Bean,在容器中起到定位查找的作用,是外部程序和Spring IoC容器进行交互的桥梁;class属性指定了Bean对应的实现类。

        下面基于XML的配置文件定义了两个简单的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.0.xsd

<!--默认命名空间的配置-->

<bean id="car" class="com.smart.simple.Car" />

<bean id="boss" class="com.smart.simple.Boss" />

</beans>

        这段配置信息提供了实例化Car和Boss这两个Bean必须的信息,Spring IoC容器完全可以据此创建这两个Bean的实例。

1.2Bean的命名

        一般情况下,在配置一个Bean时,需要为其指定一个id属性作为Bean的名称。Id在IoC容器中必须是唯一的,而且id的命名需要满足XML对id的命名规范(id是XML规定的特殊属性):必须以字母开始,后面可以是字母、数字、连字符、下划线、句号、冒号等完整结束的符号,逗号和空格这些非完整结束符是非法的。

        在实际情况下,id命名约束并不会给用户带来影响,但如果用户确实希望用一些特殊字符进行Bean命名,则可以使用<bean>的name属性。name属性没有字符上的限制,几乎可以使用任何字符,如?ab、123等。示例如下:

        <bean name=”#car1” class=”com.smart.simple.Car”>

        Id和name都可以指定多个名字,名字之间可用逗号、分号或者空格进行分隔,如下:

        <bean name=”#car1,123,$car” class=”com.smart.simple.Car”>

     这里为Bean定义了3个名称:其一为#car1;其二为123;其三为$car。用户可以使用getBean(“#car1”)、getBean(“123”)、getBean(“$car”)获取IoC容器中的car Bean。

       Spring配置文件不允许出现两个相同id的<bean>,但却可以出现两个相同name的<bean>。如果有多个name相同的<bean>,那么通过getBean(beanName)获取Bean时,将返回后面声明的那个Bean,原因时后面的Bean覆盖了前面同名的Bean。所以为了避免无意间Bean覆盖的隐患,应尽量使用id而非name命名Bean。

        如果id和name两个属性都未指定,如<bean class=”com.smart.simple.Car”/>,那么Spring自动将全限定名作为Bean的名称,这时用户可以通过getBean(“com.smart.simple.Car”)获取car Bean。如果存在多个实现类相同的匿名<bean>,如下:

<bean class=”com.smart.simple.Car”/>

<bean class=”com.smart.simple.Car”/>

<bean class=”com.smart.simple.Car”/>

   第一个Bean通过getBean(“com.smart.simple.Car”)获得;第二个Bean通过getBean(“com.smart.simple.Car#1”)获取;第三个Bean通过getBean(“com.smart.simple.Car#2”)获得,依次类推。

2.依赖注入

        Spring支持两种方式的依赖注入方式,分别是属性注入和构造函数注入。除此之外Spring还支持工厂方法注入方式。在这里,我们将了解到不同依赖注入方式的具体配置方法。

2.1属性注入

        属性注入指通过setXXX()方法注入Bean的属性值或者依赖对象。由于属性注入方式具有可选择性和灵活性高的优点,因此属性注入是实际应用中最常用的注入方式。

2.1.1属性注入实例

        属性注入要求Bean提供一个默认的构造函数,并为需要注入的属性提供对应的Setter方法。Spring先调用Bean的默认构造函数实例化Bean对象,然后通过反射的方式调用Setter方法注入属性值。

        默认构造函数是不带参数的构造函数。Java语言规定,如果类中没有定义任何构造函数,则JVM会自动为其生成一个默认的构造函数;反之,如果类中显式定义了构造函数,则JVM不会为其生成默认的构造函数。

        下面使用一个例子来说明,创建一个Car.java类,该类提供默认构造函数和Setter,该类的代码如下:

package com.example.servlet001.bean;

//默认构造函数和Setter

public class Car {

    private int maxSpeed;

    private  String brand;

    private String price;

    public void setBrand(String brand){

        System.out.println("调用setBrand()设置属性。");

        this.brand=brand;

    }

    public void setMaxSpeed(int maxSpeed){

        this.maxSpeed=maxSpeed;

    }

    public void setPrice(String price){

        this.price=price;

    }

}

        Car类中定义了3个属性,并分别提供了对应的Setter方法。
        以下XML配置是Spring配置文件中对Car进行属性注入的配置。

<?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:p="http://www.springframework.org/schema/p"

       xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="car1" name="car1" class="com.example.servlet001.bean.Car">

        <property name="maxSpeed"><value>200</value></property>

        <property name="brand"><value>奥迪A6</value></property>

        <property name="price"><value>20000.00</value></property>

    </bean>

</beans>

        上述代码配置了一个Bean,并为该Bean的3个属性提供了属性值。具体来说,Bean的每个属性对应一个<property >标签,name为属性的名称,在Bean实现类中拥有与其对应的Setter方法。

        需要指出的是,Spring只会检查Bean中是否有对应的Setter方法,至于Bean中是否有对应的属性成员变量则不作要求。举个例子,配置文件中<property name=”brand”/>的属性配置项仅要求Car类中拥有setBrand()方法,但Car类不一定有用brand成员变量。

        虽然如此,但在一般情况下,仍然按照约定俗成的方式在Bean中提供同名的属性变量。

2.1.2JavaBean关于属性命名的特殊规范

        Spring配置文件中<property >元素所指定的属性名和Bean实现类的Setter方法满足Sun Java Bean的属性命名规范:xxx的属性对应setXxx()方法。

        一般情况下,Java的属性变量名都以小写字母开头,如maxSpeed、brand等,但也存在特殊的情况。考虑到一些特殊意义的大写英文缩略词(如USA、XML等),Java Bean也允许以大写字母开头的属性变量名,不过必须满足“变量的前两个字母要么全部大写,要么全部小写”的要求,如brand、IDCode、IC、ICCard等属性变量名是合法的,而iC、iCcard、iDCode等属性变量名则是非法的。这个并不广为人知的Java Bean规范条款引发了众多让人困惑的配置问题。

        为了更清楚地理解这个隐晦的问题,我们来看一个具体的实例。

        首先我们在刚才的程序中增加一个入口函数,增加一个Demo1.java类,类的完整代码如下所示

package com.example.servlet001;

public class Demo1 {

    public static void main(String[] args) {

        System.out.println("测试启动");

    }

}

        代码结构如下图所示

        此时我们启动程序,可以看到在控制台成功的打印了“测试启动”。这说明刚才这个Bean的配置是没有问题的。

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jerry95270628

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值