一、对象的创建
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
<!--
name:取名
class:类的全路径
scode:“内存范围”,有singleton(默认)、prototype(与Structs2结合的时候使用)、request、session。后两个不怎么用
init-method:配置初始化方法
destroy-method:配置销毁方法
-->
<bean name="user" class="com.xanthuim.spring.User" scope="singleton"
init-method="init" destroy-method="destroy"></bean>
<!-- 静态工厂创建 -->
<bean name="userFactory" class="com.xanthuim.spring.UserFactory"
factory-method="createUserS">
</bean>
<!-- 动态工厂创建 -->
<bean name="userF" class="com.xanthuim.spring.UserFactory"></bean>
<bean name="userFD" factory-bean="userF" factory-method="createUserD"></bean>
</beans>
二、属性的注入(set方法)
<!--
类的属性注入,通过set方法注入的。
name:属性名称
value:属性值
ref:另一个bean的名称
-->
<bean name="user" class="com.xanthuim.spring.User">
<property name="id" value="19" />
<property name="name" value="xanthuim" />
<property name="age" value="20" />
<property name="car" ref="car" />
</bean>
<bean name="car" class="com.xanthuim.spring.Car">
<property name="name" value="兰博基尼" />
<property name="color" value="土豪金" />
</bean>
三、构造方法注入
首先一个User类
public class User {
//属性省略
//构造1
public User(String name, Car car) {
System.out.println("构造方法1:User(String name, Car car)");
this.name = name;
this.car = car;
}
//构造2
public User(Car car, String name) {
System.out.println("构造方法2:(Car car, String name)");
this.name = name;
this.car = car;
}
//构造3
public User(Car car, Integer name) {
System.out.println("构造方法2:(Car car, String name)");
this.age = name;
this.car = car;
}
}
- 构造方法注入1
注意上面的构造1和构造2方法,虽然是类似的,但是如果再配置中怎么配置呢?哪个先执行呢?
<bean name="car" class="com.xanthuim.spring.Car">
<property name="name" value="兰博基尼" />
<property name="color" value="土豪金" />
</bean>
<!--index:就是注入的顺序,数字小的先执行-->
<bean name="user1" class="com.xanthuim.spring.User">
<constructor-arg name="name" value="xanthuim" />
<constructor-arg name="car" ref="car" index="0" />
</bean>
- 构造方法注入2
还有一种情况是构造方法的参数名一样,但类型不一样(构造方法3),那该怎么注入呢?
<!--type:指定属性的类型,注意是类全路径 -->
<bean name="user1" class="com.xanthuim.spring.User">
<constructor-arg name="name" value="10" type="java.lang.Integer" />
<constructor-arg name="car" ref="car" index="0" />
</bean>
四、p名称空间注入
这个是新引入的方式,但是感觉这种方式比较怪异,只是相对比较简单,用的人不多
<!--
p名称空间注入,本质还是set方法而已
1.导入p名称空间 xmlns:p="http://www.springframework.org/schema/p"
2.使用p:属性完成注入
值类型:p:属性名="值"
引用类型:p:属性名-ref="bean名称"
-->
<bean name="user2" class="com.xanthuim.spring.User" p:name="xanthu" p:age="19" p:car-ref="car" />
五、SPEL注入(Spring Expression Language)
<!--
SPEL还是基于属性、构造来获取数据的,因此它的值从别的bean中来。
其实它的用法就类似EL表达式,只不过使用的#号(吐槽:搞不懂老外一会儿#号一会儿$)-->
<bean name="user3" class="com.xanthuim.spring.User">
<property name="name" value="#{user1.name}"/>
<property name="age" value="#{user2.age}" />
<property name="car" ref="car" />
</bean>
注意car还是需要使用ref来引用注入。
六、复杂类型注入(Array、List、Map、Properties)
- Array
<!-- 如果数组中只有一个值的情况,可以直接使用下面的方式 -->
<property name="arr" value|ref="xanthuim" />
<!-- 多个值的注入 -->
<property name="arr">
<array>
<value>huang</value>
<value>19</value>
<ref bean="tomcat" />
</array>
</property>
- List
同Array,array改为list即可。 - Map
<property name="map">
<map>
<entry key="username" value="xanthuim" />
<!-- value是引用 -->
<entry key="password" value-ref="pwd" />
<!-- key是引用,value也是引用 -->
<entry key-ref="tomcat" value-ref="apache" />
</map>
</property>
- Properties
比如应用再配置数据库连接参数
<property name="prop">
<props>
<prop name="driverClass">com.jdbc.mysql.Driver</prop>
<prop name="username">root</root>
<prop name="password">123456</root>
</props>
</property>
不过事实上在XML中这么写还是挺繁琐的,大多数时候还是使用注解来做。