基于XML的DI
bean 实例在调用无参构造器创建对象后,就要对 bean 对象的属性进行初始化。初始化 是由容器自动完成的,称为注入。
根据注入方式的不同,常用的有两类:set注入、构造注入
set注入
set注入
set注入,又叫设值注入,通过setter 方法传入被调用者的实例。这种注入方式简单、 直观,因而在 Spring 的依赖注入中大量使用。
public class student {
private String name;
private int age;
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setEmail(String email){
System.out.println("myemail:" + email);
}
@Override
public String toString() {
return "studenet{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
配置文件
<!--声明student对象-->
<bean id="mystudent" class="com.bytedance.ba01.student">
<property name="name" value="张三"/>
<property name="age" value="12"/>
<property name="email" value="xinghaodong123@163.com"/>
<!--说明不一定是属性才可以注入,spring关心的只是name对应的有没有set方法,有即可设置-->
</bean>
创建java.util.Date,并设置初始的日期时间
<bean id="mydate" class="java.util.Date">
<property name="time" value="123"/>
<!--Date类里面有setTime方法-->
</bean>
当指定 bean 的某属性值为另一 bean 的实例时,通过 ref 指定它们间的引用关系。ref 的值必须为某 bean 的 id 值。
public class Student{
private String name;
private int age;
private School school;
//setter
//toString()
}
<bean id="mystudent" class="com.bytedance.ba02.student">
<property name="name" value="lisi"/>
<property name="age" value="12"/>
<property name="email" value="22"/>
<property name="myschool" ref="myschool"/>
</bean>
<!-- 声明school对象-->
<bean id="myschool" class="com.bytedance.ba02.school">
<property name="name" value="北京大学"/>
<property name="address" value="北京市海淀区"/>
</bean>
构造注入
构造注入是指,在构造调用者实例的同时,完成被调用者的实例化。即使用构造器设置依赖关系。
标签中用于指定参数的属性有:
➢ name:指定参数名称。
➢ index:指明该参数对应着构造器的第几个参数,从 0 开始。不过,该属性不要也行, 但要注意,若参数类型相同,或之间有包含关系,则需要保证赋值顺序要与构造器中的参数 顺序一致。
引用类型属性自动注入
引用类型的自动注入
spring框架根据某些规则可以给“引用类型”赋值,自动注入,不需要程序员再给引用类型赋值了
使用的规则常用的是byName,byType
1.byName(按名称注入):Java类中引用类型的属性名称和spring容器中(配置文件)<bean>的id的名称一样,数据类型一样,这样的容器中的bean,spring能够赋值给引用类型
语法规则:
<bean id="xx",class="yy" autowire="byname">
简单类型属性赋值
</bean>
2.byType(按照类型注入):Java类中引用类型的数据类型和spring容器中(配置文件)<bean>的class属性是同源关系,这样的bean,spring能够赋值给引用类型
同源就是一类的意思:
1.java类中引用类型的数据类型和bean的class的值是一样的
2.Java类中的引用类型的数据类型和bean的class的值是父子类关系
3.java类中的引用类型的数据类型和bean的class的值是接口与实现类的关系
具体说明:
-
byName方式自动注入
当配置文件中被调用者 bean 的 id 值与代码中调用者 bean 类的属性名相同时,可使用 byName 方式,让容器自动将被调用者 bean 注入给调用者 bean。容器是通过调用者的 bean 类的引用类型属性名与配置文件的被调用者 bean 的 id 进行比较而实现自动注入的。
-
byType自动注入
使用 byType 方式自动注入,要求:配置文件中被调用者 bean 的 class 属性指定的类, 要与代码中调用者 bean 类的某引用类型属性类型同源。即要么相同,要么有 is-a 关系(子 类,或是实现类)。但这样的同源的被调用 bean 只能有一个。多于一个,容器就不知该匹配哪一个了。
如果出现同源类在XML文件中出现两个类,只能保留一个,否则会出现BeanDefinitionParsingException异常
为应用指定多个Spring配置文件
spring-total表示主配置文件:用以包含其他的配置文件,主配置文件一般是不定义对象的。
语法:<import resource="其他配置文件的路径"/>
关键字:“classpath”:表示类路径(class文件所在的目录的target路径下;)
在spring的配置文件中要指定其他文件的位置,需要使用classpath,告诉spring到哪里去加载读取文件
在具有包含关系的配置文件中,可以使用通配符(*:表示任意字符) 且这些文件必须在resources下面的一级目录下 。
使用多配置文件时,不能将主文件自身包括进自生主文件