1.使用autowire属性为自定义对象进行自动赋值
我们可以在IOC容器中,使用autowire属性为bean中的引用数据类型进行自动赋值(也就是我们注册到IOC中的自定义对象,基本数据类型因为是要给定具体的值所以直接赋值就好了)。
autowire分别有5个属性:default,no,byName,byType,constructor,采用不同的检索规则为对象赋值
1. autowire="byName"通过属性名称在IOC容器中匹配id对应的bean对象
当User中有一个Organization类型的org时,并且Organization已经注入到IOC容器中,我们就可以使用byName来进行自动装配了
自动装配时属性名和id的匹配是以当前bean对象中的为准,也就是说当IOC容器中的Organization的bean对象id为‘organization’时,是无法自动赋值的 ,因为跟user中的属性名不一致
2. autowire="byType"通过类型在IOC容器中匹配类型对应的bean对象
所以当我们无法保证当前bean中的属性名和IOC容器中的对象id一致时,就可以使用byType进行自动装配
如果当前容器中有两个以上相同类型的对象时,会报错: org.springframework.beans.factory.NoUniqueBeanDefinitionException
3. autowire="constructor"
constructor是使用构造器进行赋值,这时spring会先根据类型赋值,如果IOC容器中没有对应类型的对象则停止赋值,如果有两个以上相同类型的值则根据属性名称匹配,没有则停止赋值,所以始终都不会报错
- 使用constructor属性首先需要保证在当前对象的类中有对应的有参构造器
- 有参构造器的形参必须全部存在于IOC容器中,构造器才会被调用
4. autowire="default/no"不进行自动装配
2.spEL表达式
基本语法:#{表达式},spEL表达式的目的和EL表达式的目的是一样的,都是为了我们更加方便的获取对象
1.调用IOC容器中其他bean对象
<bean id="user" class="com.hao.spring.user.User">
<property name="org" value="#{organization01}"></property>
</bean>
2.调用IOC容器中其他bean对象的属性
<bean id="user" class="com.hao.spring.user.User" autowire="constructor">
<property name="userName" value="#{organization01.orgName}"></property>
</bean>
3.做基本的算术运算
<bean id="user" class="com.hao.spring.user.User" autowire="constructor">
<property name="age" value="#{2*8}"></property>
</bean>
4.调用动态方法
<bean id="user" class="com.hao.spring.user.User" autowire="constructor">
<property name="userName" value="#{rule.getRuleName()}"></property>
</bean>
调用动态方法时,和我们用非静态工厂方法创建bean对象一样,需要先将要调用方法的对象注入IOC中
5.调用静态方法
静态方法调用语法稍有不同:#{T(className).method(arg1,arg2)}
<bean id="user" class="com.hao.spring.user.User" >
<property name="userName"
value="#{T(com.hao.spring.factory.StaticFactory).getBean('qianghao',13,'男').getUserName()}"></property>
</bean>