在暑假前就给自己一个小目标:要在暑假时候好好丰富自己的知识结构,在网上找到了好多,mybatis、spring相关学习资源后,终于开始了最难熬但也最充实的学习过程。mybatis最开始学,而且也容易上手,需要导入的jar包也仅仅那一个就够了,所以关于mabatis的总结先放一下,今天闲来聊聊最近十天学习的Spring框架。
言归正传。
Spring,百度百科是这么描述的:Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架.很有趣的是这个full-stack, 刚开始我很不理解,现在回过头来,其实也就那么回事,意思是说 “我,Spring,是一个很牛逼的家伙,你们这些小伙子都得听我的!” 这些”小伙子” 就可以理解成是指其他的一些框架吧,例如持久层框架,WEB层框架这些。Spring有着几个他最为显著的特性,就是 控制反转(IoC)以及面向切面(AOP),这两个是Spring这个大哥的命根子,而Spring之所以能够让其他的“小伙子”听他的也是因为他将IoC以及AoP融合得太完美。
---------------------------------------------------------------------------------------------------------------------------------------------------------
所谓控制反转IoC,网上看了好多详解,但觉得有点官方,我是这么理解的:不要抠字眼,看着这四个汉字真的很难理解,尤其是“反转”两个字,我只知道电影的大反转是什么意思,在这里我真的是一脸懵逼,所以不要理中文,看IoC。这么说吧,因为公司做项目的时候基本都是按照三层架构来的,这样的做的好处我不多说,你只需要知道这样可以分工合作,后端负责后端,前端负责前端。而后端一般也是多个人一起完成的,于是这就会涉及到调用,比如这样子:
/*
* Dao层,有一个insert方法
*/
public class Dao {
public void insert(){
System.out.println("插入一条记录");
}
/*
* Service层,需要调用dao层方法
*/
public class Service {
Dao dao;
public void doService(){
dao = new Dao();
dao.insert();
}
好像这么调用也没什么啊,有必要单独拿出来个框架管理吗? 有!非常有!平时自己一个人练习的时候当然可以这样。但我们所说的SpringIoC是针对项目而言的,也就是说你负责上面的Service层的代码时还这么用new的方法去调用的话就会显得耦合度极高,这会扯什么问题呢?写代码前不好分析,写代码时不好调用,写代码后不好维护!总而言之就是“万恶之源”,因而Spring这个大哥看不下去了,他会这样说:“愚蠢的家伙,看你们这么累我都累了,让我来吧,你Dao层只管写你的就好,而你Service要调用Dao层方法的话就先声明下dao的引用 顺便把setter方法设置好就行,其他的我来!”Spring的意思大概就是这样:
/*
* Service层,需要调用dao层方法
*/
public class Service {
Dao dao;
public void setDao(Dao dao){
this.dao = dao;
}
public void doService(){
dao.insert();
}
}
看吧,现在service与dao层就没有耦合了,而那个new Dao(); 的过程哪里去了啊?当然是交给Spring大哥去啦,至于他怎么创建的会在下面介绍到。其实这个就是控制反转IoC了:不用我们去控制对象的创建,而是交给Spring,这就是反转。而Spring创建dao层对象不叫创建,而是叫注入。比如在这里,就是通过settet方法注入,事实上还有构造注入,但一般用setter方法注入比较多,构造注入就不多说了。
好,下面来看Spring是如何将Dao层对象注入给service的:
在配置文件applicationContext.xml先要注册Dao以及Service,再将Dao注入给了Service。(注册是为了交给Spring管理)
<!-- 注册Dao -->
<bean id="myDao" class="com.czp.ioc.Dao"/>
<!-- 注册Service -->
<bean id ="myService" class="com.czp.ioc.Service">
<property name="dao" ref="myDao"></property>
</bean>
注意Service的property标签的属性 用的不是 value而是ref,这样才能将上面注册的myDao注入进来。