spring框架
Spring IOC:
控制反轉(Inversion of Control,IOC),也被稱為依賴注入(Dependency Injection,DI),是面向對象編程中的一種設計理念
依賴注入(spring只有set訪問器注入和構造注入):
1.set訪問器注入(打印機例子)
01.架構
02.引入的Jar包
03.接口及其實現類代碼
package cn.ink; /* * 墨盒接口 */ public interface Ink { public String getColor(); }
package cn.ink; /* * 灰色墨盒類 */ public class GrayInk implements Ink{ @Override public String getColor() { // TODO Auto-generated method stub return "灰色墨盒"; } }
package cn.ink; /* * 彩色墨盒類 */ public class ColorInk implements Ink{ @Override public String getColor() { // TODO Auto-generated method stub return "彩色墨盒"; } }
package cn.paper; /* * 紙張接口 */ public interface Paper { public String getContent(); }
package cn.paper; /* * A4紙張 */ public class A4Paper implements Paper{ @Override public String getContent() { // TODO Auto-generated method stub return "一張淡定的A4紙"; } }
package cn.paper; /* * B5紙張類 */ public class B5Paper implements Paper{ @Override public String getContent() { // TODO Auto-generated method stub return "一張淡定的B5紙"; } }
package cn.printer; /* * 打印機類 */ import cn.ink.Ink; import cn.paper.Paper; public class Print { private Ink ink; private Paper paper; public void print(){ System.out.println("用"+ink.getColor()+"在"+paper.getContent()+"上打印內容"); } public Ink getInk() { return ink; } public void setInk(Ink ink) { this.ink = ink; } public Paper getPaper() { return paper; } public void setPaper(Paper paper) { this.paper = paper; } }
04.Application.xml配置
<?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"> <bean id="colorInk" class="cn.ink.ColorInk"/> <bean id="grayInk" class="cn.ink.GrayInk"/> <!--對Paper的初始化 --> <bean id="paper" class="cn.paper.A4Paper"/> <!-- 對打印機進行配置--> <bean id="printer" class="cn.printer.Print"> <property name="ink" ref="colorInk"></property> <property name="paper" ref="paper"></property> </bean> </beans>
05.測試類
package cn.test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.printer.Print; public class PrintExam { @Test public void testprint(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Print printer = (Print)context.getBean("printer"); printer.print(); } }
2.接口注入
3.構造注入
IOC定義和優點:
IOC(Inverse of Control)控制反轉是Spring容器的內核,AOP,聲明式事務等功能都是在此基礎上開花結果的。所謂IOC,就是通過容器來控制業務對象之間的依賴關系,而非傳統實現中,由代碼直接控制。這也就是“控制反轉”概念所在;控制權由應用代碼轉到了外部容器,控制權的轉移,就是反轉。控制權轉移帶來的好處就是降低了業務對象之間的依賴程度。
二.Spring AOP:
關於為什么要使用AOP,下面這個例子可以很好的解釋。首先,按照軟件重構思想的理念,如果多個類中出現相同的代碼,應該考慮定義一個共同的抽象類,將這些相同的代碼提取到抽象類當中去。比如Horse、Pig、Camel這些對象都有run()、eat()方法,通過引入一個包含這兩個方法抽象的Animal父類,Horse、Pig、Camel就可以通過集成Animal復用到run()和eat()方法。通過引入父類消除多個類中的重復代碼的方式在大多數情況下是可行的,但世界並非永遠這么簡單,比如下面所示的景區管理業務類。
作者:郭無心 鏈接:http://www.zhihu.com/question/19993030/answer/77125144 來源:知乎 著作權歸作者所有,轉載請聯系作者獲得授權。 import com.smart.dao.ViewPointDao; import com.smart.dao.ViewSpaceDao; import com.smart.domain.ViewSpace; /** * 景區管理的服務類 */ public class ViewSpaceService { private TransactionManager transManager; private PerformanceMonitor pmonitor; private ViewSpaceDao viewSpaceDao; private ViewPointDao viewPointDao; /** * 新增一個旅游景區 * * @param viewSpace */ public void addViewSpace(ViewSpace viewSpace) { pmonitor.start(); transManager.beginTransaction(); viewSpaceDao.addViewSpace(viewSpace); transManager.endTransaction(); pmonitor.end(); } /** * 刪除某個景點 * * @param pointId */ public void deleteViewPoint(int pointId) { pmonitor.start(); transManager.beginTransaction(); viewPointDao.deleteViewPoint(pointId); transManager.endTransaction(); pmonitor.end(); } }
其中pmonitor是方法性能監視代碼,它在方法調用前啟動,在方法調用返回前結束,並在內部記錄性能監視的結果信息。其中transManager的代碼是事務開始和事務提交的代碼,我們發現我們的業務代碼淹沒在重復化非業務性的代碼之中,性能監視和事務管理這些非業務性代碼葛藤纏樹搬包圍着業務性代碼。此時我們就不能通過抽象父類的方式消除以上的重復性代碼,因為這些邏輯依附在業務類方法的流程中,它們不能夠轉移到其他地方去。於是產生了AOP這種思想.
優點:AOP主要是提供另外一種編程思路,可以把類似的行為抽離出來統一處理。
總結補充:
IOC是解耦,提供一種構造對象的方式,使得一種功能能有多種實現,且不構成依賴。spring 的IOC的缺點:占用內存多、構造對象慢、啟動慢。springAOP是提供一種基於spring框架的切面編程企業級解決方案,雖然這個已經很強大,但是依然還是沒有aspectj強大,比如:目前還不支持流程切面。織入慢執行效率低、不支持new關鍵字創建的對象的切入,必須使用bean factory織入。