2.2.7 Bean的生命周期
Spring 内的Bean对象从创建到销毁,可控点很多。
2.2.8 <bean>的id与name 属性
name对格式没有限制,id有
2.3 基于XML的DI
2.3.1 注入分类
设值注入:
基本属性用 value
对象对应的属性用 ref
<bean id="mySchool" class="com.bjpowernode.di01.School">
<property name="name" value="清华大学"/>
</bean>
<bean id="myStudent" class="com.bjpowernode.di01.Student">
<property name="name" value="张三"/>
<property name="age" value="23"/>
<property name="school" ref="mySchool"/>
</bean>
构造注入:
少用
<bean id="myStudent" class="com.bjpowernode.di02.Student">
<constructor-arg name="name" value="李四"/>
<constructor-arg name="age" value="24"/>
<constructor-arg name="school" ref="mySchool"/>
<!--
<constructor-arg index="0" value="李四"/>
<constructor-arg index="1" value="24"/>
<constructor-arg index="2" ref="mySchool"/>
-->
<!--
<constructor-arg value="李四"/>
<constructor-arg value="24"/>
<constructor-arg ref="mySchool"/>
-->
</bean>
2.3.3 集合属性注入
properties 的键值对均为String类型,map自定义
①
<?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.xsd">
<bean id="mySchool" class="com.bjpowernode.di05.School">
<property name="name" value="清华大学"/>
</bean>
<bean id="mySchool2" class="com.bjpowernode.di05.School">
<property name="name" value="北京大学"/>
</bean>
<bean id="mySome" class="com.bjpowernode.di05.Some">
<property name="schools">
<array>
<ref bean="mySchool"/>
<ref bean="mySchool2"/>
</array>
</property>
<property name="myStr">
<array>
<value>中国</value>
<value>北京</value>
</array>
</property>
<property name="myList">
<list>
<value>海淀</value>
<value>六道口</value>
</list>
</property>
<property name="mySet">
<set>
<value>中国农业大学</value>
<value>男生公寓</value>
</set>
</property>
<property name="myMap">
<map>
<entry key="mobile" value="1234567"/>
<entry key="QQ" value="7654321"/>
</map>
</property>
<property name="myProperties">
<props>
<prop key="education">大学</prop>
<prop key="gender">男</prop>
</props>
</property>
</bean>
</beans>
②:对于set,array,list等集合类型的属性,数据注入时可采用简写的形式<property name="" value=", , ,">
<?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.xsd">
<bean id="mySchool" class="com.bjpowernode.di06.School">
<property name="name" value="清华大学"/>
</bean>
<bean id="mySchool2" class="com.bjpowernode.di06.School">
<property name="name" value="北京大学"/>
</bean>
<bean id="mySome" class="com.bjpowernode.di06.Some">
<property name="schools">
<array>
<ref bean="mySchool"/>
<ref bean="mySchool2"/>
</array>
</property>
<property name="myStr" value="中国,北京"/>
<property name="myList" value="海淀,六道口"/>
<property name="mySet" value="中国农业大学,男生公寓">
</property>
<property name="myMap">
<map>
<entry key="mobile" value="1234567"/>
<entry key="QQ" value="7654321"/>
</map>
</property>
<property name="myProperties">
<props>
<prop key="education">大学</prop>
<prop key="gender">男</prop>
</props>
</property>
</bean>
</beans>
2.3.4 对于域属性的自动化注入
①:autowire="byName" 会从容器中查找与实体类的域属性同名的Bean的id,并将该Bean对象自动注入给该实体类的域属性。
package com.bjpowernode.di07;
public class Student {
private String name;
private int age;
private School school;
......
<?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.xsd">
<bean id="school" class="com.bjpowernode.di07.School">
<property name="name" value="清华大学"/>
</bean>
<!-- 注册Student
autowire="byName" 会从容器中查找与实体类的域属性同名的Bean的id,
并将该Bean对象自动注入给该实体类的域属性。
-->
<bean id="myStudent" class="com.bjpowernode.di07.Student" autowire="byName">
<property name="name" value="张三"/>
<property name="age" value="23"/>
</bean>
</beans>
②:autowire="byType" 会从容器中将与实体类中域属性类型具有is-a关系的bean找到,并将该bean自动注入到域属性。
(因为可向上转型)
同一个类的两个对象和具有is-a关系的多个类的多个对象均不可。
<?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.xsd">
<bean id="mySchool" class="com.bjpowernode.di08.School">
<property name="name" value="清华大学"/>
</bean>
<!--
<bean id="mySchool2" class="com.bjpowernode.di08.PrimarySchool">
<property name="address" value="海淀区"/>
</bean>
-->
<!-- 注册Student
autowire="byType" 会从容器中查找与实体类的域属性类型具有is-a关系的Bean,
并将该Bean对象自动注入给该实体类的域属性。
-->
<bean id="myStudent" class="com.bjpowernode.di08.Student" autowire="byType">
<property name="name" value="张三"/>
<property name="age" value="23"/>
</bean>
</beans>
2.3.5 SPEL注入
可以使用静态方法,
可以访问其他Bean的属性
直接计算表达式
调用其他Bean的方法
package com.bjpowernode.di08;
public class Person {
private String pname;
private int page;
public void setPname(String pname) {
this.pname = pname;
}
public void setPage(int page) {
this.page = page;
}
public String getPname() {
return pname;
}
public int getPage() {
return page;
}
@Override
public String toString() {
return "Person [pname=" + pname + ", page=" + page + "]";
}
public int computeAge(){
return page>25?25:page;
}
}
<?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.xsd">
<bean id="myPerson" class="com.bjpowernode.di08.Person">
<property name="pname" value="李四"/>
<property name="page" value="#{T(java.lang.Math).random()*50}"/>
</bean>
<bean id="myStudent" class="com.bjpowernode.di08.Student">
<property name="name" value="#{myPerson.pname}"/>
<property name="age" value="#{myPerson.computeAge()}"/>
</bean>
</beans>