以前一直想写点东西,可一直没有开始实施,各类缘由都有,最大缘由可能仍是本身太懒了,嘿嘿。最近在看Spring in action这本书,为了能让本身坚持下去把书看完,此次决定同步的在博客园上写个Spring系列栏目,期中部分代码案例是本身发挥写的,和书上不同,你们参考理解,有钱的小伙伴也能够买一本本身看看。另外,因为我不是什么专业的编辑,也不多写文章,全部文章中有个别病句或者错别字的你们别介意,我本身也尽可能避免。前端
在接触java开发以前,我是一个 .net Developer,作了4年多的 .net后公司技术方向开始全面转向java,又得从菜鸟阶段开始学习java web方面的知识,刚开始接触Spring的时候并不知道它具体到底能作什么,学习java web开发的大部分应该都知道model1=>model2=>MVC这样的演变过程,可这里主要注重的仍是前端界面和后台服务代码的交互方式升级,若是抛除掉这部分,咱们在实现复杂业务逻辑的时候,确定会用到不少的业务类,第三方组件等,还有涉及到数据库的访问,咱们后台服务的代码结构该怎么处理呢?java
之前作 .net的时候第一个阶段,全部代码都写在一块儿,界面处理,业务逻辑,数据访问都在一个类里面,而后就是开始三层架构,把业务层、数据访问层、对象模型层分开,代码结构更清晰,更容易维护,再下一个阶段随着系统愈来愈复杂,为了更好的可维护性,开始在各层之间增长接口,使用面向接口的编程,慢慢的把代码的耦合性下降。全部道理都是互通的,Spring已个人个人理解,它的使命就是尽可能的简化Java开发工做,为了下降Java开发的复杂性,让咱们的代码结构更简洁明了,更易维护,增长代码的重复利用。总结下来,为了下降Java开发的复杂性,Spring采起了如下4中策略web
Spring竭力的避免因自身API而弄乱项目的代码,她不会强迫你实现Spring规范的接口或者继承Spring的类,咱们本身编写的java类在Spring以外也能够无缺的运行,因此Spring提供的一种非引入性或者最小引入性的编程。spring
首先简单说明下什么是依赖注入,依照惯例,第一个例子怎么能少的了Hello World呢,嘿嘿,请看代码,首先咱们定义一个HelloWorld的类:数据库
public class HelloWorld { /* * syaHello方法,和世界说你好。 */ public void sayHello(){ System.out.println("Hello World!"); } }
如今咱们已经用java代码实现了咱们的第一个类,调用sayHello()方法就能够向这个世界说一声Hello了,可咱们本身说话的声音过小,听到的人太少,怎么办呢?咱们须要借助一些工具来让更多的人听到,下面咱们定义一个工具类编程
public class RadioTool { public void say(String message){ System.out.println(message); } }
咱们来修改下以前的HelloWorld类:架构
public class HelloWorld { /* * 定义说话工具 */ private RadioTool radio; public RadioTool getSayTool() { return radio; } public void setSayTool(RadioTool radio) { this.radio = radio; } /* * syaHello方法,和世界说你好。 */ public void sayHello(){ //使用工具 radio.say("Hello World!"); } }
下面咱们来测试下程序ide
import com.seven.springTest.service.impl.HelloWorld; import com.seven.springTest.service.impl.RadioTool; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub //定义HelloWorld对象 HelloWorld hw= new HelloWorld(); //定义SayTool工具对象 RadioTool radio = new RadioTool(); //把工具对象赋给HelloWorld对象hw hw.setSayTool(radio); //调用hw的sayHello()说出“Hello World” hw.sayHello(); } }
好了,咱们的案例代码写完了,咱们的HelloWorld类依靠RadioTool类向更多的人说出“Hello World”,HellWorld类对RadioTool类就是一种依赖关系,若是没有RadioTool类,它就没办法让更多的人听到。传统的方式,咱们经过代码来手动的给对象注入依赖,咱们构造一个RadioTool的实例并经过setSayTool()方法赋给HelloWorld实例,这个过程就是一种依赖注入,只不过这个注入是由咱们本身经过代码来完成的。耦合性很是强,若是咱们代码在编写的时候不知道要给HelloWorld提供RadioTool类对象,那么程序就会报错,另外若是有一天咱们须要更换新的工具,咱们就必须从新编写代码。代码维护性就比较差。为了更好的解除HelloWorld和RadioTool之间的耦合性,咱们引入面向接口的编程,首先咱们定义通用的工具类接口:工具
package com.seven.springTest.service; public interface SayTool { public void say(String message); }
而后咱们修改以前的RadioTool类,让它继承SayTool接口学习
package com.seven.springTest.service.impl; import com.seven.springTest.service.SayTool; public class RadioTool implements SayTool { public void say(String message){ System.out.println(message); } }
咱们来修改HelloWorld类
import com.seven.springTest.service.SayTool; public class HelloWorld { /* * 定义说话工具 */ private SayTool tool; public HelloWorld(SayTool tool){ this.tool=tool; } /* * syaHello方法,和世界说你好。 */ public void sayHello(){ //使用工具 tool.say("Hello World!"); } }
这里咱们以前依赖的RadioTool更换成了SayTool接口对象,HelloWorld类与SayTool接口之间耦合,而不是与具体的SayTool接口实现类来耦合,咱们能够很方便的替换实现方式。同门在再定义一个电视工具
import com.seven.springTest.service.SayTool; public class TVTool implements SayTool { @Override public void say(String message) { System.out.println(message); } }
咱们分别定义了RadioTool和TVTool两种SayTool接口的具体实现类,HelloWorld类中依赖的是SayTool接口,全部能够很方便的更换具体的实现,而不用在从新编写代码。一般状况下咱们定义接口变量,并经过实例化具体的实现类来给接口对象赋予具体的实现,==这种建立应用组件以前的协做的行为一般称为装配==,针对给接口提供哪个具体的实现,也就是装配哪种具体的实现bean,在Spring中提供了多种方式,主要包括3种: