spring的核心技术:ioc,aop,能实现模块之间、类之间的解耦合。
依赖:class a 中使用了class b的属性或者方法,则称class a依赖class b。
1.ioc(Inversion of control):控制反转
使用ioc的目的是减少对代码的改动,实现不同的功能,即解耦合。
2.ioc的技术实现时DI(Dependency Injection,依赖注入)
spring是使用了di实现了ioc的功能,spring底层创建对象,使用的是反射。
3.实现步骤
(1)新建项目(之前的blog里写的创建maven项目的方法)
项目结构:
pom.xml文件如下:
pom.xml文件中properties标记的maven-compile都改为1.8(使得编译时生成的target文件夹中含有.xml文件),添加spring-context插件。
新建一个接口SomeServive:
新建接口实现类SomeServiceImpl:
resources目录下建立beans.xml文件:
这个文件是spring的核心,注意beans标记里的bean标记,每一个bean标记相当于new的一个对象(即用bean标记来替代代码中的new语句):
主程序代码:
ClassPathXmlApplicationContext类从类路径(编译生成的target文件夹下的classes文件夹寻找与参数指定的.xml文件,返回一个ApplicationContext对象,如果beans.xml不是在classes目录下则要修改路径字段:
ApplicationContext对象就是spring容器,通过容器的getBean()方法获取对象(注意别忘了强制类型转换),参数是.xml文件中bean标记的id值
运行程序,getBean()方法从容器中获取已创建的对象:
注意:ApplicationContext对象就是spring容器,当生成一个ApplicationContext对象时就已经通过类的构造函数生成了.xml文件中所有的对象。
例如,在SomeServiceImpl类中加一个构造函数:
去掉main程序中的getBean方法,发现类的构造函数依然执行了:
注意:当我们用获取同一个bean的对象赋给两个新建的不同的对象时 ,会发现它们指向同一个对象:
(2)获取spring容器中java对象的信息:
运行结果:
上图的输出结果是beans中所有bean的id值。
(3)spring还可以创建一个非自定义类对象
运行结果:
(4)spring给对象基本属性赋值
格式:
步骤:
在实现类中添加字段及其get,set方法并重载toString():
修改beans.xml:
注意:property标记给对象属性赋值是调用set()方法,如果类中未写则程序会报错。
(5)spring给对象引用类型属性赋值
格式:
本质上是一个bean创建对象时给属性赋值时调用set()方法时使用另一个bean创建的对象。
(6)构造注入
在实体类中添加含参数的构造方法:
或者:
补充spring中存放对象的情况:放入到spring容器中的对象有dao类、service类、controller类、工具类放到spring容器中,这些对象默认是单例的,在容器中这个名称的对象只有一个。不放入到spring容器中的对象有实体类对象(实体类数据来自数据库)、servelet,listener,filter(这三种对象交给tomcat创建,不放入到容器中)等。