国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本
首頁
|
新聞
|
娛樂
|
游戲
|
科普
|
文學
|
編程
|
系統
|
數據庫
|
建站
|
學院
|
產品
|
網管
|
維修
|
辦公
|
熱點
首頁
>
學院
>
開發設計
> 正文
關于spring IOC和AOP的解析原理和舉例
2019-11-06 06:33:07
字體:
大
中
小
來源:
轉載
供稿:網友
1.關于s
PR
ing
ioc
這段時間也著實好好的看了下spring的相關書籍,對其也有了大概和初步的認識和理解,雖然之前也一直聽說spring是一個非常優秀的開源框架,可一直沒有機會學習和使用(是不是有點落伍了?呵呵),所以呢,這段時間就重點學習了spring(一個星期的時間當然是入門級的啦~~)
大家一直都說spring的IOC如何如何的強大,其實我倒覺得不是IOC如何的強大,說白了IOC其實也非常的簡單。我們先從IOC說起,這個概念其實是從我們平常new一個對象的對立面來說的,我們平常使用對象的時候,一般都是直接使用關鍵字類new一個對象,那這樣有什么壞處呢?其實很顯然的,使用new那么就表示當前模塊已經不知不覺的和new的對象耦合了,而我們通常都是更高層次的抽象模塊調用底層的實現模塊,這樣也就產生了模塊依賴于具體的實現,這樣與我們
java
中提倡的面向接口面向抽象編程是相沖突的,而且這樣做也帶來系統的模塊架構問題。很簡單的例子,我們在進行
數據庫
操作的時候,總是業務層調用DAO層,當然我們的DAO一般都是會采用接口開發,這在一定程度上滿足了松耦合,使業務邏輯層不依賴于具體的數據庫DAO層。但是我們在使用的時候還是會new一個特定數據庫的DAO層,這無形中也與特定的數據庫綁定了,雖然我們可以使用抽象工廠模式來獲取DAO實現類,但除非我們一次性把所有數據庫的DAO寫出來,否則在進行數據庫遷移的時候我們還是得修改DAO工廠類。
那我們使用IOC能達到什么呢?IOC,就是DAO接口的實現不再是業務邏輯層調用工廠類去獲取,而是通過容器(比如spring)來自動的為我們的業務層設置DAO的實現類。這樣整個過程就反過來,以前是我們業務層主動去獲取DAO,而現在是DAO主動被設置到業務邏輯層中來了,這也就是反轉控制的由來。通過IOC,我們就可以在不修改任何代碼的情況下,無縫的實現數據庫的換庫遷移,當然前提還是必須得寫一個實現特定數據庫的DAO。我們把DAO普遍到更多的情況下,那么IOC就為我們帶來更大的方便性,比如一個接口的多個實現,我們只需要配置一下就ok了,而不需要再一個個的寫工廠來來獲取了。這就是IOC為我們帶來的模塊的松耦合和應用的便利性。
那為什么說IOC很簡單呢?說白了其實就是由我們平常的new轉成了使用反射來獲取類的實例,相信任何人只要會用java的反射機制,那么自己寫一個IOC框架也不是不可能的。比如:
……
public
ObjectgetInstance(String
className)
throws
Exception
{
Object
obj
=
Class.forName(className).newInstance();
Method[]
methods
=
obj.getClass().getMethods();
for
(Method
method
:
methods)
{
if
(method.getName().intern()
==
"setString")
{
method.invoke(obj,
"hello
world!");
}
}
}
……
上面的一個方法我們就很簡單的使用了反射為指定的類的setString方法來設置一個hello
world!字符串。其實可以看到IOC真的很簡單,當然了IOC簡單并不表示spring的IOC就簡單,spring的IOC的功能強大就在于有一系列非常強大的配置文件維護類,它們可以維護spring配置文件中的各個類的關系,這才是spring的IOC真正強大的地方。在spring的Bean定義文件中,不僅可以為定義Bean設置屬性,還支持Bean之間的繼承、Bean的抽象和不同的獲取方式等等功能。
下次俺再把spring的Bean配置的相關心得和大家一起分享下,如果說的不好,大家可以提意見哦,可千萬不要仍臭雞蛋,嘿嘿~~~~
2.關于spring
aop
反射實現
AOP
動態代理模式(Spring
AOP
的實現
原理)
好長時間沒有用過Spring了.
突然拿起書.我都發現自己對AOP都不熟悉了.
其實AOP的意思就是面向切面編程.
OO注重的是我們解決問題的方法(封裝成Method),而AOP注重的是許多解決解決問題的方法中的共同點,是對OO思想的一種補充!
還是拿人家經常舉的一個例子講解一下吧:
比如說,我們現在要開發的一個應用里面有很多的業務方法,但是,我們現在要對這個方法的執行做全面監控,或部分監控.也許我們就會在要一些方法前去加上一條日志記錄,
我們寫個例子看看我們最簡單的解決方案
我們先寫一個接口IHello.java代碼如下:
1package
sinosoft.dj.aop.staticaop;
2
3public
interface
IHello
{
4
8
void
sayHello(String
name);
9}
10
里面有個方法,用于輸入"Hello"
加傳進來的姓名;我們去寫個類實現IHello接口
package
sinosoft.dj.aop.staticaop;
public
class
Hello
implements
IHello
{
public
void
sayHello(String
name)
{
System.out.println("Hello
"
+
name);
}
}
現在我們要為這個業務方法加上日志記錄的業務,我們在不改變原代碼的情況下,我們會去怎么做呢?也許,你會去寫一個類去實現IHello接口,并依賴Hello這個類.代碼如下:
1package
sinosoft.dj.aop.staticaop;
2
3public
class
HelloProxy
implements
IHello
{
4
private
IHello
hello;
5
6
public
HelloProxy(IHello
hello)
{
7
this.hello
=
hello;
8
}
9
10
public
void
sayHello(String
name)
{
11
Logger.logging(Level.DEBUGE,
"sayHello
method
start.");
12
hello.sayHello(name);
13
Logger.logging(Level.INFO,
"sayHello
method
end!");
14
15
}
16
17}
18
其中.Logger類和Level枚舉代碼如下:
Logger.java
1package
sinosoft.dj.aop.staticaop;
2
3import
java.util.Date;
4
5public
class
Logger{
6
11
public
static
void
logging(Level
level,
String
context)
{
12
if
(level.equals(Level.INFO))
{
13