- 一、 普通属性注入(重要)
在Spring中所谓普通属性注入,指的是像String、int、List、Set、Array(数组)、Map等类型的注入。
在Spring中只要为其提供相应的setter和getter方法,然后在配置文件中加上相应的配置即可实现。
int类型注入
1、第一种方式
<property name="intValue" value="123"/>
2、第二种方式
<property name="intValue">
<value>123</value>
</property>
String类型配置
1、第一种方式
<property name="strValue" value="Hello,World"/>
2、第二种方式
<property name="strValue">
<value>Hello,World</value>
</property>
List类型注入
<property name="listValue">
<list>
<value>list1</value>
<value>list2</value>
</list>
</property>
Set类型注入
<property name="setValue">
<set>
<value>set1</value>
<value>set2</value>
</set>
</property>
数组类型注入
<property name="arrayValue">
<list>
<value>array1</value>
<value>array2</value>
</list>
</property>
Map类型注入
<property name="mapValue">
<map>
<entry key="k1" value="v1"/>
<entry key="k2" value="v2"/>
</map>
</property>
Spring中使用通配符加载配置文件
当我们在加载Spring配置文件时,可以采用通配符的形式进行加载,如下所示:
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext-*.xml");
上面的代码表示将所有以“applicationContext-”为前缀的配置文件全部加载。
如果要正确使用通配符,需要注意文件名的命名问题!
补充说明:
<value>与<ref>的区别?
value:一般用于普通属性值的注入,如:int、String、List等。
ref:注入的是对另外一个bean的引用,即:当需要注入的是自定义类时,需要使用ref。
-----------------------------
要想使用Spring创建哪个对象,则要通过bean标签将这个对象配置到配置文件中
- 二、公共属性注入(bean的继承)(掌握)
公共的部分形成类似于Java中的父类,其它子类直接继承父类就可以了。
配置文件详解
父类bean的配置
<bean id="abstractBean" abstract="true">
<property name="id" value="1000"/>
<property name="name" value="zhang3"/>
</bean>
注:一旦为<bean>标签指定了abstract属性,那么就不能再为这个<bean>标签指定class属性了!
子类bean的配置
<bean id="bean3" class="com.spring.Bean3" parent="abstractBean"/>
<bean id="bean2" class="com.spring.Bean2" parent="abstractBean">
<property name="name" value="li4"/>
<property name="password" value="123456"/>
</bean>
说明:子类可以将从父类继承过来的属性进行重新赋值,如:<property name="name" value="li4"/>
小结:公共属性注入
- 通过<bean>标签定义公共的属性,指定abstract=true
- 具有相同属性的类在<bean>标签中指定其parent属性
- 三、Bean的作用域(重要)
所谓Bean的作用域指的就是,当我们从IOC容器中采用getBean()方法获取bean的时候,每次取得是同一个实例对象,还是每次取得的是不同的实例对象,Spring默认采用单例模式实现,即:默认情况下,每次使用getBean()方法获取的bean都是同一个实例对象。
当你采用bean标签配置一个类的时候,Spring IOC容器是采用单例模式创建对象的,不论访问多少次,获取的是同一个对象
Spring默认情况下采用单例模式创建对象;Struts2的Action是采用多例模式创建的
Spring配置单例模式的Bean(默认形式)
<bean id="bean1" class="com.spring.Bean1" scope="singleton"/>
说明:Spring默认形式(即:不写scope="singleton")配置的Bean就是单例模式,所以此时scope="singleton"可以写也可以不写,一般当scope="singleton"时不写。
Spring配置多例模式的Bean
<bean id="bean1" class="com.spring.Bean1" scope="prototype"/>
说明:Spring配置多例模式的Bean,有时也称为原型Bean,其含义就是:每次采用getBean()方法返回的实例都是不同的(即:地址不同,也就是说每次返回的对象都是不同的对象)。
Bean的生命周期
Spring的IOC容器只能管理在配置文件中bean的scope属性等于singleton的Bean(即单例模式的Bean),此时Spring在初始化时,会自动创建scope=“singleton”类型的Bean,并将其纳管到IOC容器中进行统一的管理, scope=“singleton”的Bean的生命周期受IOC容器统一管理。
当scope=“prototype”时,Spring只负责创建(实例化)Bean,对于该Bean,Spring的IOC容器对其并不进行管理,即:当用户调用getBean()方法时Spring的IOC容器只负责为用户创建出来该Bean并将该Bean所有依懒关系注入好后,将该Bean返回给用户,该Bean的管理由用户自行管理。即:用户可以自行控制该Bean的生命周期。
IOC容器只能管理单例模式的bean(从创建、依赖关系注入、到销毁),而多例模式的bean Spring(IOC)只管创建、依赖关系注入,由垃圾回收器销毁,不会全部纳入IOC容器的管理
Bean的作用域小结
Spring中Bean的作用域
<bean…/>标签的scope属性可以取以下值:
- singleton:每次调用getBean()方法的时候返回相同的实例对象
- prototype:每次调用getBean ()方法的时候返回不同的实例对象
- 四、根据名称自动装配(了解,不推荐使用)
所谓按名称自动装配是指,类中定义的引用的其它Bean的变量名称与配置文件中定义的bean的id值相同,这样Spring就会根据这个名称自动将相应的Bean注入给该类中相应的属性(成员变量),如下所示:
类中的定义:
public class Bean1 {
private Bean2 bean2;
//setter getter
}
配置文件中的bean的配置
<bean id="bean2" class="com.spring.Bean2"/>
说明:由于类中属性名为”bean2”,配置文中定义的bean的id也为”bean2”,所以Spring就会把配置文件中bean的id等于”bean2”的这个Bean注入到类中属性(成员变量)名为”bean2”的成员变量上来。
配置文件中关于根据按名称自动装配的配置
第1种方式:该方式将影响整个配置文件中依赖关系的注入
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
default-autowire="byName">
default-autowire取值为以下五种:(自动装配有五种类型)
- no(不自动装配,需要显示指定依懒注入关系)
- byName(根据名称自动装配)
- byType(根据类型自动装配)
- constructor(按构造函数参数一致性匹配)
- autodetect(先按constructor ,再按byType )
第2种方式:此种方式只影响某一个Bean的依赖关系的注入
<bean id="bean1" class="com.spring.Bean1" autowire="byName"/>
<bean id="bean5" class="com.spring.Bean5" />
- 五、根据类型自动装配(了解,不推荐使用)
配置文件中配置同样有两种方式,全局和局部,与按名称一样