这两天学习了Spring的相关知识,一直没有弄懂控制反转(ioc)是什么意思,今天在做测试的时候突然茅塞顿开,以下是我在写代码时候的心得,通俗易懂,详细的解释了Spring创建对象与传统创建对象的区别。

  • Spring的xml配置文件的含义
1
2
3
4
5
6
7
8
9
10
11
<?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创建对象-->
<!-- 声明bean ,就是告诉spring要创建某个类的对象-->
<!-- id:对象的自定义名称,唯一值。spring通过这个名称找到对象-->
<!-- Class:类的全限定名称 也就是你需要实例化的类(不能是接口,因为spring是反射机制创建对象,必须使用类)-->
<bean id="userdao" class="spring.Userdaoimpl"/>
</beans>
  • 定义一个名为Userdao的接口
1
2
3
4
public interface Userdao {
public void dosome();

}
  • 再定义一个名为Userdaoimpl的接口实现类
1
2
3
4
public interface Userdao {
public void dosome();

}
  • 在测试代码中详细的解释了Spring创建对象与传统创建对象的区别。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Test {
public static void main(String[] args) {

// 传统的new对象
Userdao us=new Userdaoimpl();//多态 上转型
us.dosome();

// spring创建对象的过程
// 定义配置文件路径
String xmlpath="bean.xml";
// 初始化spring容器 加载配置文件时
ApplicationContext ac=new ClassPathXmlApplicationContext(xmlpath);
// 通过容器获取userdao实例(也叫对象)并转换成接口类型
Userdao userdao=(Userdao) ac.getBean("userdao");
//因为bean创建的对象是object类型的 而且userdaoimpl是实现了接口 所以是接口类型的 要强制转换成接口的类型才可以调用
//这里的userdao是新建的对象名,Userdao是接口,(Userdao)是强制转换符
//ac.getBean("userdao")是从容器中获取对象 这里的对象是在spring容器中创建的 而不是你自己new出来的
//ac.getBean("userdao") 括号里的userdao就是你在spring的xml文件中创建一个实例名字叫userdao 他的具体实现类是Userdaoimpl

//调用实例中的dosome()方法
userdao.dosome();
}
}
  • 结果

img