spring in action

# 開(kāi)始spring之旅

## 歷史

javabean -> EJB -> spring

## why

spring 簡(jiǎn)化了企業(yè)級(jí)系統(tǒng)開(kāi)發(fā). 原因是EJB太復(fù)雜了

1.好的設(shè)計(jì)比實(shí)現(xiàn)技術(shù)更重要

2.通過(guò)接口耦合的javabean是一個(gè)很好的模型

3.代碼應(yīng)該容易被測(cè)試

spring是一個(gè)輕量級(jí)的IOC和AOP框架。

## spring模塊

1.core

2.AOP

3.O/R 映射

4.web context

5.applicaiton context

6.jdbc & dao

7.mvc

## spring hello world

首選寫接口類

public interface GreetingService {

public void sayHello();

}

第二步實(shí)現(xiàn)類

public class GreetingServiceImpl implements GreetingService {

private String greeting;

public String getGreeting() {

return greeting;

}

public void setGreeting(String greeting) {

this.greeting = greeting;

}

public void sayHello() {

System.out.println(this.greeting);

}

}

第三步 配置bean.xml

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-3.0.xsd">

hello world

第四步 使用

public class main {

public static??void main(String [] args) {

ClassPathResource resource = new ClassPathResource("beans/beans.xml");

System.out.println(resource.getPath());

BeanFactory factory = new GenericXmlApplicationContext(resource);

GreetingService greeting = (GreetingService) factory.getBean("greetService");

greeting.sayHello();

}

}

但是這樣使用和

GreetingService greeting = new GreetingServiceImpl()

相比為一個(gè)的區(qū)別就是把GreetingService的實(shí)例化用配置來(lái)代替了. 這就是傳說(shuō)中的IOC

##理解IOC

IOC ,即反轉(zhuǎn)控制。 是spring的核心。

當(dāng)然用 依賴注入來(lái)解釋會(huì)更容易理解。 當(dāng)A使用了B, 在A實(shí)例化的時(shí)候,也必須實(shí)例化B,表明類A對(duì)B有了依賴。 我們把B的實(shí)例化抽取出來(lái),而是采用在外部系統(tǒng)控制B的實(shí)例化并負(fù)責(zé)注入到A中,這樣就實(shí)現(xiàn)了A和B的耦合。這就是所謂的依賴注入。

## IOC例子

騎士找圣杯

public class KnightOfRoundTable {

private String name;

private HolyGrailQuest quest;

public KnightOfRoundTable(String name) {

this.name = name;

this.quest = new HolyGrailQuest();

}

public??HolyGrail embarkOnQuest(){

return quest.embark();

}

}

當(dāng)我們寫單元測(cè)試的時(shí)候會(huì)發(fā)現(xiàn)當(dāng)寫了KnightOfRoundTable的時(shí)候順帶把HolyGrailQuest 也寫進(jìn)去了。 因?yàn)镵nightOfRoundTable 和 HolyGrailQuest 耦合在一起了。

耦合的代碼

-難以測(cè)試, 難以使用,帶來(lái)典型的"摧毀大堤"的bug

-但是沒(méi)有耦合的代碼什么也做不了

所以我們要管理耦合

其最常見(jiàn)的一個(gè)方法就是面向接口編程

public interface IQuest {

public??HolyGrail embark();

}

同樣:

public interface IKnight {

HolyGrail embarkOnQuest();

}

在 KnightOfRoundTable 中,就需要把任務(wù)裝配進(jìn)去

public void setQuest(IQuest quest) {

this.quest = quest;

}

然后配置bean:

undefinedundefined

John

創(chuàng)建系統(tǒng)組件之間關(guān)聯(lián)的動(dòng)作叫做裝配。spring中有很多裝配的方式,其中XML是最常見(jiàn)的一種。

以上是以來(lái)控制的全部: 協(xié)調(diào)依賴對(duì)象之間合作的責(zé)任,從對(duì)象之間釋放出來(lái)。

## 應(yīng)用AOP

理想的系統(tǒng)是有很多組件組成,每一個(gè)組件負(fù)責(zé)其中一部分的功能。但是實(shí)際情況是像日志管理這樣的組件,進(jìn)程侵入到其他系統(tǒng)中。

回答上面的例子, 我們假設(shè)需求變更了, 每一次騎士做任務(wù)之前,都需要配置一個(gè)吟游詩(shī)人來(lái)歌頌他的事跡

public??HolyGrail embarkOnQuest(){

this.mistrel.compose(this.name, "embark");

return quest.embark();

}

那么問(wèn)題來(lái)了, 其實(shí)必須每一次都主動(dòng)觸發(fā) mistrel 去干什么。但是騎士騎士不用關(guān)心 mistrel 干了什么事情的。簡(jiǎn)單的說(shuō) mistrel 提供的服務(wù)超出了騎士本來(lái)的責(zé)任,也就是說(shuō)mistrel和騎士的服務(wù)交叉在一起了。所以把mistrel實(shí)現(xiàn)成切面,并把他的服務(wù)提供給騎士是合理的。

public class Minstrel implements MethodBeforeAdvice {

public void before(Method method, Object[] args, Object target) throws Throwable {

IKnight knight = (IKnight)target;

String name = knight.getName();

System.out.println(name + ":" + knight.embarkOnQuest().toString());

}

}

配置bean

chaper01.knight.IKnight

minstrel

最典型的應(yīng)用就是數(shù)據(jù)庫(kù)的事物。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 縱覽Spring , 讀者會(huì)發(fā)現(xiàn)Spring 可以做非常多的事情。 但歸根結(jié)底, 支撐Spring的僅僅是少許的基...
    六尺帳篷閱讀 1,701評(píng)論 0 13
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,658評(píng)論 19 139
  • spring 關(guān)鍵策略 1 基于pojo的輕量級(jí)和最小侵入性編程 2 通過(guò)依賴注入和面向接口實(shí)現(xiàn)松耦合 3 基于切...
    wi11iam閱讀 468評(píng)論 0 0
  • 對(duì)于Java開(kāi)發(fā)者來(lái)說(shuō),現(xiàn)在是一個(gè)很好的時(shí)期。 在20年的歷史中,Java經(jīng)歷過(guò)一些好的時(shí)期以及不好的時(shí)期。盡管存...
    龍?jiān)诎⒗?/span>閱讀 359評(píng)論 0 1
  • 第一章 簡(jiǎn)化Java開(kāi)發(fā) 基于POJO的輕量級(jí)和最小侵入性編程 通過(guò)依賴注入和面向接口實(shí)現(xiàn)松耦合 基于切面和慣例進(jìn)...
    言西棗閱讀 184評(píng)論 0 0

友情鏈接更多精彩內(nèi)容