自定义类型赋值
Person类
public class Person {
//基本类型直接使用
//<property name="lastName" value="小花"></property>自动的进行类型转换;
private String lastName = "小明";
private Integer age;
private String gender;
private String email;
private Double salary;
private Car car;
private List<Book> books;
private Map<String, Object> maps;
private Properties properties;
//xxxxx
Spring为Bean中的自定义类型的属性赋值有两种情况,如为Person里面的自定义类型(基本类型不行,如Integer,String)的属性赋值
第一种是手动赋值
<bean id="car" class="com.atguigu.bean.Car">
<property name="carName" value="宝马"></property>
<property name="color" value="白色"></property>
</bean>
//为Person的car属性赋值
<bean id="person" class="com.atguigu.bean.Person" >
<property name="car" ref="car"></property>
</bean>
第二种是自动赋值(自动装配):
仅限于对自定义类型的属性有效,这里测试的是Person的Car car 属性自动赋值
- autowire=“default/no”:不自动装配;不自动为car属性赋值
- autowire=“byName”:按照名字;
private Car car;
1)、以属性名(car)作为id去容器中找到这个组件,给他赋值;如果找不到就装配null;
形如car = ioc.getBean("car");
- autowire=“byType”:
private Car car;
1)、以属性的类型作为查找依据去容器中找到这个组件;如果容器中有多个这葛类型的组件,报错;
NoUniqueBeanDefinitionException:
No qualifying bean of type [com.atguigu.bean.Car] is defined:
expected single matching bean but found 2: car01,car02
2)、没找到呢?装配null
car = ioc.getBean(Car.class);
- autowire=“constructor”:
public Person(Car car)
按照构造器进行赋值;
1)、先按照有参构造器参数的类型进行装配(成功就赋值);没有就直接为组件装配null即可。
2)、如果按照类型找到了多个;参数的名作为id继续匹配;找到就装配;找不到就null;
3)、不会报错;
自动赋值(测试为Person中的list属性赋值)
// 按照类型自动装配,因为xml中定义了多个Book,所以直接用上了,这里不会像属性Car那样按照类型装配时,遇到xml中定义多个Car的Bean就报错
<bean id="person" class="com.atguigu.bean.Person" autowire="byType">
</bean>
//List<Book> books;容器可以把容器中的所有book封装list赋值给这个属性
<bean id="book01" class="com.atguigu.bean.Book">
<property name="bookName" value="book1"></property>
</bean>
<bean id="book02" class="com.atguigu.bean.Book">
<property name="bookName" value="book2"></property>
</bean>
<bean id="book03" class="com.atguigu.bean.Book">
<property name="bookName" value="book3"></property>
</bean>
Spring Expression Language(Spring 表达式语言)
知识点
在SpEL中使用字面量、
引用其他bean、
引用其他bean的某个属性值、
【 调用非静态方法 调用静态方法、】 使用运算符;都支持
<bean id="person04" class="com.atguigu.bean.Person">
<!-- 字面量:${}; #{} -->
<property name="salary" value="#{12345.67*12}"></property>
<!-- 引用其他bean的某个属性值、 根据bean的id引用-->
<property name="lastName" value="#{book01.bookName}"></property>
<!-- 引用其他bean、 -->
<property name="car" value="#{car}"></property>
<!--
调用静态方法: UUID.randomUUID().toString();
#{T(全类名).静态方法名(1,2)}
-->
<property name="email" value="#{T(java.util.UUID).randomUUID().toString().substring(0,5)}"></property>
<!-- 调用非静态方法; 对象.方法名 -->
<property name="gender" value="#{book01.getBookName()}"></property>
</bean>