IOC的技术实现:
DI: DI是IOC的技术实现。
DI: 依赖注入,只需要在程序中提供要使用的对象名就可以了,至于如何在容器中创建
、赋值、查找都有容器内部来实现
Spring时使用DI实现了IOC的功能,Spring底层创建对象使用的是反射机制
Spring 是一个容器,管理对象、给对象赋值,底层是反射机制
实现步骤:
告诉Spring 创建对象:
声明bean ,声明bean讲就是告诉Spring要创建某个类的对象
id: 对象的名称的自定义名称,且为唯一值,Spring通过这个名称找到这个对象
class: 类的全限定名称(不能是接口,因为Spring是通过反射机制创建对象的,不需使用类)
Spring 就完成SomeServlet someServlet=new SomeService();
一个Bean标签声明一个对象
例如:
Spring配置文件:
Spring的创建时期
在容器的时候时就已经创建了这个对象
public class mySpring {
@Test
public void kda(){
String a="bean.xml";
ApplicationContext ac=new ClassPathXmlApplicationContext(a);
Spring_A a2=(Spring_A) ac.getBean("Hello");
a2.kda();
}
}
//输出结果为:
//午餐
//01
说明文件在ApplicationContext时期就已经创建了,而生成的
01
则是调用其方法 doSome而生成的
其他的方法:
获取容器中定义对象的数量:
//int d=ac.getBeanDefinitionCount();
获取从容器中对象的名称
//
// //此处获得的是一个数组,类型为String
// String[] e=ac.getBeanDefinitionNames();
// //高级for循环进行循环,打印出数组
// for (String kda:e){
// System.out.println(kda);
// }
单元测试——junit:
创建方法:
1.public方法
2.没有返回值 void
3.名称自定义,但是不能有返回值
上有@Test
Spring能够创建一个非自定义类,需要这个类存在
在Spring的配置文件中,给Java对象的属性进行赋值,
DI:依赖注入,表示创建对象,给属性赋值。
DI的两种实现方法:
DI的语法分类:
Set注入方法确实十分的好用,但是存在一个弊端,当我们使用Set注入的时候,不存在Set方法时,就会发生报错此外,Set注入还有另一种方法:引用Set注入方法:
所谓的引用Set注入方法,根据名字可以看出,其实就是进行了引用
<beans>
<bean id="adc" class="com.***.ADC">
<property name="name" value="KDA"/>
<property name="School" ref="MySchool"/>
bean>
<bean id="MySchool" class="com.***.School">
<property name="name" value="哈佛大学"/>
<property name="address" value="哈尔滨"/>
bean>
beans>
<beans>
<bean id="kda" class="wxk.School">
<constructor-arg name="name" value="清华大学"/>
<constructor-arg name="address" value="河南郑州"/>
<constructor-arg name="args" value="2000000"/>
bean>
<bean id="kda" class="wxk.School">
<constructor-arg index="0" value="清华大学"/>
<constructor-arg index="1" value="河南郑州"/>
<constructor-arg index="2" value="2000000"/>
bean>
<bean id="kda" class="wxk.School">
<constructor-arg value="清华大学"/>
<constructor-arg value="河南郑州"/>
<constructor-arg value="2000000"/>
bean>
beans>
##自动注入
当我们的需要赋的值十分多时,重复的代码显得十分冗长,这会使我们的代码利用效率低下,这时候我们采用自动注入的方法
那么 这个该怎么实现自动注入呢?
自动注入分为两种,一种为 byName,一种为byType
###byName
byName的用法十分简单,就是你需要创建一个bean根标签,要求是这个根标签的id和属性的名称一样
,此外还需要我们的class指向相应的位置。此外,包含这个对象的需要在bean标签上加上 autowire=“byName”
这里我以一个对象为例,我需要对一个对象进行赋值,我使用的是byName自动注入的方法
这是一个单独的对象
public class Test{
private String name;
private String sex;
private int age;
public void setName(String name) {
this.name = name;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Test{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
public void setAge(int age) {
this.age = age;
}
}
这是一个类,包含他的toString方法
public class Test01 {
private Test test;
private int a;
public void setA(int a) {
this.a = a;
}
public void setTest(Test test) {
this.test = test;
}
public void k(){
System.out.println(test.toString());
}
}
接下来是咱们的xml文件
<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="kda" class="byName.Test01" autowire="byName">
<property name="a" value="2"/>
bean>
<bean id="test" class="byName.Test">
<property name="sex" value="男"/>
<property name="age" value="99"/>
<property name="name" value="KDA"/>
bean>
beans>
这样子就完成了他的byName赋值,其原理是 当发现类中的一个变量未进行赋值,就会在xml文件中查询,当找到id与其相同且路径也相同的,就把他的值付给他
###byType
byType–按类型注入,这种方法按照他们的类型进行自动注入,与byName的用法相似
我们首先得明白这个同源关系:
方法遇上相似,知识把autowire改为byType,且 下面的id不需要和变量中的相同