2.3.2
引用类型属性自动注入
对于引用类型属性的注入,也可不在配置文件中显示的注入。可以通过为
<bean/>
标签
设置
autowire
属性值,为引用类型属性进行隐式自动注入(
默认是不自动注入引用类型属
性
)。根据自动注入判断标准的不同,可以分为两种:
byName
:根据名称自动注入
byType
: 根据类型自动注入
(
1
)
byName
方式自动注入
当配置文件中被调用者
bean
的
id
值与代码中调用者
bean
类的属性名相同时,可使用
byName
方式,让容器自动将被调用者
bean
注入给调用者
bean
。容器是通过调用者的
bean
类的属性名与配置文件的被调用者
bean
的
id
进行比较而实现自动注入的。
![](https://img-blog.csdnimg.cn/f6f2b6d9ca18480ea7cabe4ff1d42e83.png)
项目结构
项目展示
1.创建Student实体类
package com.it.bao4;
public class Student {
private int sno;
private String sname;
private int sage;
private School school;
public Student(){
System.out.println("spring调用了无参构造方法");
}
public Student(int sno, String sname, int sage, School school) {
this.sno = sno;
this.sname = sname;
this.sage = sage;
this.school = school;
System.out.println("spring调用了有参构造方法!");
}
public School getSchool() {
return school;
}
public void setSchool(School school) {
this.school = school;
}
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public int getSage() {
return sage;
}
public void setSage(int sage) {
this.sage = sage;
}
@Override
public String toString() {
return "Student{" +
"sno=" + sno +
", sname='" + sname + '\'' +
", sage=" + sage +
", school=" + school +
'}';
}
}
2.创建School实体类
package com.it.bao4;
public class School {
private String schName;
private String schAddress;
public String getSchName() {
return schName;
}
public void setSchName(String schName) {
this.schName = schName;
}
public String getSchAddress() {
return schAddress;
}
public void setSchAddress(String schAddress) {
this.schAddress = schAddress;
}
@Override
public String toString() {
return "School{" +
"schName='" + schName + '\'' +
", schAddress='" + schAddress + '\'' +
'}';
}
}
3.创建applicationContext.xml文件
<?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">
<!-- 声明student对象-->
<bean id="myStudent" class="com.it.bao4.Student" autowire="byName">
<property name="sno" value="1"/>
<property name="sname" value="小明"/>
<property name="sage" value="18"/>
<!-- <property name="school" ref="mySchool"/>-->
</bean>
<bean id="mySchool" class="com.it.bao4.School" >
<property name="schName" value="北京理工大学"/>
<property name="schAddress" value="中国北京"/>
</bean>
<bean id="school" class="com.it.bao4.School">
<property name="schName" value="北京师范大学"/>
<property name="schAddress" value="中国北京"/>
</bean>
</beans>
4.创建测试文件
package com.it;
import com.it.bao4.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Unit test for simple App.
*/
public class AppTest4
{
@Test
public void test1(){
String config="bao4/applicationContext.xml";
ApplicationContext ac= new ClassPathXmlApplicationContext(config);
//从容器中获取student对象
Student myStudent = (Student) ac.getBean("myStudent");
System.out.println("student对象:"+myStudent);
}
}
项目结果展示
![](https://img-blog.csdnimg.cn/f421118f8df647e8a21d0209076956b5.png)
(
2
)
byType
方式自动注入
使用
byType
方式自动注入,要求:配置文件中被调用者
bean
的
class
属性指定的类,
要与代码中调用者
bean
类的某引用类型属性类型同源。即要么相同,要么有
is-a
关系(子
类,或是实现类)。但这样的同源的被调用
bean
只能有一个。多于一个,容器就不知该匹配
哪一个了。
![](https://img-blog.csdnimg.cn/05a13e14e2864f1087bf3b841c0aee1b.png)
项目结构
同上
项目展示
1.创建Student实体类
同上
2.创建School实体类
同上
3.创建applicationContext.xml文件
<?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">
<!-- <!– 声明student对象–>-->
<!-- <bean id="myStudent" class="com.it.bao4.Student" autowire="byName">-->
<!-- <property name="sno" value="1"/>-->
<!-- <property name="sname" value="小明"/>-->
<!-- <property name="sage" value="18"/>-->
<!--<!– <property name="school" ref="mySchool"/>–>-->
<!-- </bean>-->
<!-- 声明student对象-->
<bean id="myStudent" class="com.it.bao4.Student" autowire="byType">
<property name="sno" value="1"/>
<property name="sname" value="小明"/>
<property name="sage" value="18"/>
<!-- <property name="school" ref="mySchool"/>-->
</bean>
<bean id="mySchool" class="com.it.bao4.School" >
<property name="schName" value="北京理工大学"/>
<property name="schAddress" value="中国北京"/>
</bean>
<!-- <bean id="school" class="com.it.bao4.School">-->
<!-- <property name="schName" value="北京师范大学"/>-->
<!-- <property name="schAddress" value="中国北京"/>-->
<!-- </bean>-->
</beans>
4.创建测试文件
package com.it;
import com.it.bao4.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Unit test for simple App.
*/
public class AppTest4
{
@Test
public void test1(){
String config="bao4/applicationContext.xml";
ApplicationContext ac= new ClassPathXmlApplicationContext(config);
//从容器中获取student对象
Student myStudent = (Student) ac.getBean("myStudent");
System.out.println("student对象:"+myStudent);
}
}
项目结果展示
2.3.3
为应用指定多个
Spring
配置文件
在实际应用里,随着应用规模的增加,系统中
Bean
数量也大量增加,导致配置文件变
得非常庞大、臃肿。为了避免这种情况的产生,提高配置文件的可读性与可维护性,可以将
Spring
配置文件分解成多个配置文件。
包含关系的配置文件:
多个配置文件中有一个总文件,总配置文件将各其它子文件通过
<import/>
引入。在
Java
代码中只需要使用总配置文件对容器进行初始化即可。
代码:
![](https://img-blog.csdnimg.cn/8b7f78c22f384a059caed14fcb50d6e5.png)
Spring 配置文件:
也可使用通配符
*
。但,此时要求父配置文件名不能满足
*
所能匹配的格式,否则将出现循环递归包含。就本例而言,父配置文件不能匹配
spring-*.xml
的格式,即
不能起名为
spring-total.xml
。
total.xml
项目结构
同上
项目展示
1.创建Student实体类
同上
2.创建School实体类
同上
3.创建spring-student.xml文件
<?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">
<!-- 声明student对象-->
<bean id="myStudent" class="com.it.bao5.Student" autowire="byName">
<property name="sno" value="1"/>
<property name="sname" value="小明"/>
<property name="sage" value="20"/>
<!-- <property name="school" ref="mySchool"/>-->
</bean>
</beans>
4.创建spring-school.xml文件
<?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.it.bao5.School" >
<property name="schName" value="复旦大学"/>
<property name="schAddress" value="中国上海"/>
</bean>
<bean id="school" class="com.it.bao5.School">
<property name="schName" value="清华大学"/>
<property name="schAddress" value="中国北京"/>
</bean>
</beans>
5.创建total.xml文件
<?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">
<!-- spring-total表示主配置文件:包含其他的配置文件的,
主配置文件一般是不定义对象的。
下面的引入写法均可以实现正确结果
-->
<!-- <import resource="classpath:bao5/spring-student.xml"/>-->
<!-- <import resource="classpath:bao5/spring-school.xml"/>-->
<!--使用通配符*-->
<!-- <import resource="classpath:bao5/spring-*.xml"/>-->
<!-- <import resource="classpath:bao5/spring*.xml"/>-->
<import resource="classpath:bao5/spring*"/>
</beans>
4.创建测试文件
同上
项目结果展示
![](https://img-blog.csdnimg.cn/4e1a554878324507adaef1266ec3d762.png)