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的配置是没有问题的。
标签:Spring,Bean,注入,Car,构造函数,属性 From: https://blog.csdn.net/andy987650628/article/details/140621524