spring有两项核心第一项是:
IOC/DI (Inversion of Control/ Dependency Injection):控制反转/依赖注入,与其说这是一门技术,不如说这是一种设计模式
比如有一个类,在类里面你有非静态方法,调用类里面的方法需要创建类的对象,我们通常使用的方法是调用该类的时候去new一个出来,但是使用spring就是把对象的创建交给spring配置创建对象,这时使你以后的代码会非常少出现new这个关键字,因为所有的对象创建都交给spring处理了
再比如说如果有A、B、C、D、E 五个类,要求分别使用这五个类中的一个或多个方法,那我岂不是要把这五个类都new出来?这只是小的项目,万一遇到大型项目可能就不止了。
java本身有着垃圾回收机制,使用spring框架后,java对象的使用和销毁都可以不用开发者处理,这对编程来说影响
是十分巨大的,这也是Rod Johnson成为一个改变Java世界的大师级人物的原因之一。。
咳咳扯远了,下面来讲讲IOC/DI的实现吧
IOC的底层实现包括四种技术:
1、创建XML文件配置
2、dom4j解析XML配置文件
3、工厂设计模式
4、反射机制
IOC的入门程序实现:
第一步:导入jar包
(1)spring所属jar包每一项都有三个jar包(xxx表示的是jar包名)
xxx-release.jar,xxx-release-javadic,xxx-source.jar
(2)做Spring最基本功能实现时,只需要导入四个核心包
Beans、Core、Context、Expression
(3)导入支持日志输出的jar包(xxx表示的是版本号)
commons-logging-xxx.jar
第二步:创建实现类,这里博主简单建立一个类
第三步:创建spring配置文件
(1)spring的配置文件的名字和位置都不是固定的
(2)引用schema约束(bean约束)官方建议配置文件放在src根目录下和使用ApplicationContext作为配置文件的名字
PS:这里讲一下schema约束,XML Schema是一种用于定义和描述XML文档结构与内容模式语言,其出现是为了克服DTD的局限性,比DTD约束更加的严格。
当然,开发者只需要按照其约束编写spring配置文件就可以了,因为Spring框架会提供约束,开发者只需直接引用就行了。
(3)创建配置对象
到这步为止我们的入门程序中的配置就完成了,接下来是时候尝试去体验一下IOC的效果了
我们创建一个text测试类
测试结果如下
到目前为止,我们的第一个入门程序就完成了,这里实现了将对象的创建通过配置文件的配置交给Spring来处理,也是spring bean实例化的第一种方法,当然对于bean实例化还有其他方法
bean实例化的三种方式
第一种使用类的无参数构造方法创建(最常用)如果类里面没有无参的构造方法,会出现异常
第二种 使用静态工厂创建创建静态的方法,返回类对象,这里博主创建一个工厂类,返回的类对象用的是上面的UserService
修改applicationContext.xml中的bean为
开始之间,我们先来创建一个javabean以供使用测试类的写法获取修改为:
这种方法也可以获取对象,但是太麻烦一般不用
第三种 使用实例工厂创建创建非静态的方法,返回类对象,这种方法就不演示了
其余两种方法都是基于无参构造函数是实现的
当然,既然能够通过配置文件来实现通过无参构造函数来创建对象,那换句话我们也能通过配置文件来向对象的属性添加内容,这种技术,阿不,方式,spring称之为DI,也称为属性注入
属性注入有三种方式:
第一种 使用set方法注入
第二种 有参数构造注入
第三种 使用接口注入
在spring框架里面只支持前面两种方式(博主只学了两种QAQ)
第一种 使用set方法注入
我们在user类给里面的name属性和sex属性添加get和set方法
在applicationContext.xml里面配置user的bean
测试类编写如下
能得出结果
ps:这里博主能直接打印是因为博主加入了toString方法
接下来是有参数构造函数注入,给user类添加有参构造函数的方法
修改xml配置文件为
效果与set的注入效果一致那么问题来了?在controller、service、dao三层结构中,应该怎么实现dao向service的注入呢,其实很简单,我们把dao当成service中的一个属性处理就是了,这种称为对象注入
先创建一个dao类
修改service类,给service添加dao的对象属性并进行调用`
下面就是修改配置文件了,这里博主选择构造函数注入对象
测试结果如下:
既然实现了对象的注入了,那么那些复杂的数据怎么注入呢
例如数组、list集合、map集合
我们来配置一下我们给user加几个属性并配置其相应的set方法和get方法
在配置文件中配置user类
运行测试文件,测试结果如下:
IOC和DI的关系
(1)IOC:控制反转,把对象创建交给Spring进行配置
(2)DI:依赖注入,向类里面的属性中设置值
(3)关系:以来注入不能单独存在,需要在IOC的基础上完成操作