Spring 註解 之 @Autowired

Spring 中的核心思為Ioc 與 DI 而DI 則是去實現 Ioc 的一個方式,而@Autowired就是Spring  2.5 後提供的一種方式,它可以對class成員變量、方法及構造函數進行標註,完成自動裝配的工作

一  .  @Autowired可使用的地方

1.class 的 setter 方法上面

2.class 的 建構函式上

3.成員變量上

二.  @Autowired的實作範例

首先我們先建立一個 Family.java 及 People.java

接著在Spring 的 xml 中加入 People<bean>配置People的value

接著我們在 Family.java 加上@Autowired

如此一來輸出的結果就會是我們在 xml 中配置 People >> name 的值 (  James )

我們只要將想賦予的值定義於xml中,透過@Autowired即可以直接將直注入,而不

須透過程式碼呼叫setter的方法

三. 當被配置的 bean 數量不為1 時,出現BeanCreationException,以下為解決方式

1.當被配置的 bean 數量不為0 時

我們將xml 中的 Family 註解掉,在執行程式時就會出現BeanCreationException

所以我們可以在@Autowired加上 (required=false),意思就是說在注入時Family不是找不到匹配Bean時也不出Exception

2.當被配置的 bean 數量大於1時,在執行程式時也會出現BeanCreationException

我們在xml 中再加入一個Family的bean,在執行程式時也會出現BeanCreationException

我們配置了兩個Family類型的bean,所以當我們對Family類型注入時,spring無法判斷要用哪一個,我們需要透過@Qualifier指定我們要注入的bean名稱,就可以解決此問題,而@Qualifier亦只能配合@Autowired使用

 

 

Facebook Comments

如何啟動Jboss

因為工作的關係需要使用到JBoss來啟動網站,過程中也遇到了需多困難

所以就把過程整理一下,做一下筆記

(一)   在Localhost啟動 Jboss

1. 至官網下載 jboss-as-7.1.1.Final http://www.jboss.org/jbossas/downloads

2. 將檔案解壓縮後,執行 *\\ jboss-as-7.1.1.Final\bin\add-user.bat  >> 增加user

未命名3

3. 執行 *\\ jboss-as-7.1.1.Final\bin\standalone.bat >> 執行 jboss

4. 打開瀏覽器 http://localhost:8080 出現以下畫面表示已成功啟動

未命名

5. http://localhost:9990  >> jboss 管理者介面,輸入設定的帳號密碼後的畫面

未命名1

6. “再啟動 standalone.bat” 的情況下將想要deployed的war檔放置 D:\jboss-as-                   7.1.1.Final\standalone\deployments 目錄下,即可完成deployed,當資料夾中                出現  xxx.wa.deployed 檔案時 表示已經成功 deployed

7 . Jboss as 7.1.1 不支援 jdk 1.8.x , 如果環境是 jdk1.8.x的 必須安裝 jdk1.7.x

           且須設定環境變數 or 使用 Jboss WildFly or Jboss eap

(二)  在Eclipse上加入Jboss

1. Eclipse Help > Eclipse Marketplace… > 搜尋jboss tools 並安裝

2. 安裝完成後 新增一個server

未命名4

     3.在 Home Directory 設定 Jboss 的資料夾路徑

未命名5-1

4.點選完成後,在下方的server 就會出現Jboss

未命名6-1

6.接著把網站加入至此Serve下即可啟動網站

7.當使用Eclipse 出現了一個錯誤訊息

未命名7

經上網查詢料後發現只要在

D:\jboss-as-7.1.1.Final\standalone\configuration\standalone.xml 中加入

即可解決可參考http://www.cnblogs.com/wangjiajun/p/4203373.html 的解說

以上就是啟動JBoss的基本流程~

Facebook Comments

Spring 註解

Spring 提供了方法來更有效的管理創建物件,使得我們不一定要從程式中去建立物件,配置物件,只需藉由Spring Xml 中 bean 的設定即可達到對物件的管理與配置,如此也使我們的物件可以更有效的被管理

以上就是透過在xml中加入bean的方式將 class 註冊於Spring中,如此我們就可於xml去管理這個物件,這也就是Spring的核心思想( Ioc ) ,而從Spring 2.0 開始更提供了另一個方法[ 註解 ]去簡化Spring xml 的設定,註解基於Spring 就等同於bean,而 @Service ,@Controller ,@Repository, @Component 就是可以註解在 class 上的四大類 ,目前來說此四類在Spring 中都是可被註冊為Bean的,

@Component  :  是一個泛型的註解 ,可以被轉換為其他3個類型

@Service : 對應於服務層的註解

@Repository : 對應於數據訪問層(Dao)

@Controller : 對應於控制層 ( mvc 中 action 的應用 )

接著只要我們在 Spring 的 xml 中加入

去啟動自動掃描 ,所以有加入註釋的 class 就會自動被註冊為 Spring <bean>

如此一來我們的 xml 也就簡化了許多,而註解於bean中的默認名稱為 class名稱(第一個字母小寫)

這個例子來說 bean 的名稱就是 myService 如果想自已定義 bean 的名稱可用@service(“name”)

如此一來bean的名稱就為 helloWorld,這總方式產生的bean預設 是singleton(單一的),意思就是說容器只會產生這個bean一次,以下列例子來說

以上述例子來說結果就會是

wang

wang

因為 user 只會被創建一次,所以 userB 一樣是使用之前被創建的 user,所以取出來的值會是一樣的,但如果我們加入@Scope(“prototype”)

結果就會是

wang

yang

因為 prototype就是每次取得Bean時,容器會建立一個新的Bean,而不是傳回同一個Bean,所以userB會在創建一個 user 此時 userB 取出來的值就會是 user 的預設值 yang。

總結 : 註解是Spring提供的另一個方式去配置class於容器中,而不需設定在xml中,妥善的使用註解也可使我們的應用程式更為簡潔,當然Spring還提供其他的註解,此篇介紹的是屬於使用於class上面的四類註解,接下來我也將繼續探討其他的註解

Facebook Comments

何謂 Spring IOC ?

要了解Spring – Ioc前,我想先來說說 Pojo( Plain Ordinary Java Object / Pure Old Java Object)

Pojo可以被歸類為Java的一個對象(Class),但是一個Java Class卻不能說就是Pojo

因為Java Class可以Implement Interface , Extend Parent Class 但是 Pojo 就是一個

乾淨的 Class 可以包含 參數及方法 卻不能 Implement 及 Extend

Ex :

 

而在Spring – Ioc中可以管理任何的對象,但一般來說通常都會是Pojo Spring – Ioc 可以說是 Spring 的核心思想 可翻譯成控制反轉,但何謂控制反轉,控制甚麼?反轉甚麼?

其實簡單來說就是對Java 對象的控制跟我們一般的認知是相反的,一般來說當我們要建立一個物件的時候都會在應用程式中去 new Object() 並且由應用程式去賦予這個 Object 定義這就是一般的由應用程式去管理,配置所需的物件

Ex:

而在Ioc中則是相反的,Ioc會提供一個容器去產生這些物件,並且配置及管理這些物件,當應用程式需要甚麼物件時再跟Ioc 容器在提供給((DI))應用程式使用,如此一來物件的依賴關係就變成是應用程式依賴Ioc 容器,應用程式也由主動變成被動的等待Ioc來注入(DI)它所需的資源

xml

 

至於 DI ( Dependecy Injection ) 則是 Ioc 的核心 當 Ioc 幫我們創建完對象後 在應用程式運行時動態的去注入所依賴的對象

總結:

  1. Spring-Ioc 負責創建管理對象( Pojo ) >> 創建的對象會放在一個容器中
  1. 當應用程式需要使用某些對象時 由容器提供使用
  1. 應用程式的使用對象所需的資源由Ioc注入
  1. 應用程式依賴著 Ioc , 並且需要Ioc 提供對象所需的資源

5.Ioc 是一種思想,所以他可以被應用至其他地方並不是局限於Spring

以上是 Spring-Ioc 的基本概觀 , 接下來要探討的就是 Spring 在程式碼中是用甚麼方式去實現Ioc 對物件的創建,配置與管理

Facebook Comments

D3 繪製點跟線

GitHub : https://github.com/amberchenchen/D3

首先先加入  insights.standalone.js and insights.standalone.css 這兩支檔案

先準備好 Div容器 ,裝點跟線

再來就是 要有點跟線的資料

1.nodes

  • id: primary key
  • text: node  名稱
  • size: node 大小
  • cluster: node群組的屬性設定,可以把node分類然後針對這類的node去設定顏色大小等等之類的

2.links [1,2] 表示你要在node id=1 跟 node id=2 畫線

3.點跟線都有了,再來就是畫圖 運用 Insights 物件把點跟線以及div容器放入

便會出現點跟線的關析圖 (如下)

螢幕快照 2017-07-02 下午6.36.27

4.node 上的 tooltip ,呼叫已在底層寫好的 tooltip  方法,把想要呈現的內容放入

螢幕快照 2017-07-02 下午6.41.57

 

5. link 線上的 tooltip, 跟node 一樣  ,呼叫已在底層寫好的 PathTooltip方法,把想要呈現的內容放入

螢幕快照 2017-07-02 下午6.46.10

6.再來介紹node的拖拉 drag and drop

主要在 產生node時 ,加上 call back 這個方法  ex: call(node_drag)

  • dragstart : 開始拖拉
  • dragmove : 拖拉過程 , 必須同時update  node 跟 link位置
  • dragend : 拖拉結束

 

螢幕快照 2017-07-02 下午6.54.13

7. node event

首先要先在產生node時 ,先註冊你要的事件

  • click  :  單次點擊
  • dblclick : 雙次點擊

    如何區分單次點擊跟雙次點擊 : 在單次點擊設定 setTimeOut 等250毫秒在去執行單次點擊,如果等待過程中觸發的是雙次點擊那就會進入雙次點擊方法並把正在等待的timeout方法 clear掉直接執行 double click

  • contextmenu : 右鍵觸發

8. Filter node :

基本上就是呼叫 filter這個方法,然後把需要filter的條件組成Json格式放入,最後在update node

螢幕快照 2017-07-02 下午7.15.32

Facebook Comments

Jackson 2 — Java 物件與JSON 相互轉換的好幫手

JSON是現在很流行的一種系統間交換資料的格式,結構簡單且容易閱讀,我們一起來看看怎麼使用Java 來玩玩JSON吧!

增加Maven dependency

使用的JSON lib 是 Jackson2 ,在POM.xml 只需加一個dependency

Java物件轉JSON

以下程式,我們將Java物件 (Department) 轉為JSON string,並輸出到 console
(也可以直接輸出到檔案,如最後一行所示)

輸出結果如下,第一段輸出 JSON string 無斷行,第二段使用了 writerWithDefaultPrettyPrinter() 來輸出我們容易閱讀的格式

JSON轉Java物件

相反地,我們也可以直接把JSON string或是檔案轉為Java物件

輸出結果如下

使用@JsonView來控制會顯示的欄位

有時候,我們可能會因應不同的情境,而回傳不同數量的欄位。舉例來說,User物件中的password欄位可能就不適合傳到前台去(資安考量),但後台管理系統的密碼維護功能可能會需要這欄位。我們當然可以視狀況多寫幾個欄位數量不一的User DTO,但Jackson2提供了一種更有效率的作法!

  1. 視需求定義不同的 view,如下所示,Public 表示資料出現在「公開場合」,Private 則為後台管理使用(必須繼承Public 因為後台可以看到所有欄位),view name 可自訂

  2. 在DTO 類別的欄位上,分別指定適用的view

  3. 在輸出JSON時,可指定要套用哪個 view 來輸出

    輸出結果如下,可以發現第一段輸出使用了Public view 所以看不到 password 欄位,而Private view 繼承了 Public view 所以全部的欄位都會顯示!

 

以上完整範例程式可參考 https://github.com/kennyliao1982/demo-jackson2

 

Facebook Comments

JDBC 再升級 — 使用p6spy監控SQL執行結果

在開發專案時,我們通常會很在意 SQL 的執行狀況,像是

  • 想知道 SQL 執行的效能如何
  • 實際在資料庫執行的 SQL 內容為何
    • 使用 JDBC prepared statement時 “?”參數的內容
    • OR mapping 工具最後產生的 SQL 語句內容

當然我們也可以自己加幾行程式碼來取得這些資訊,但大家可以想一想,這些用來純粹取得 SQL 執行內容的程式碼,無關任何業務邏輯,這樣的程式碼放在專案裡真的好嗎?修改幅度不大的話,或許可以這麼做。但如果是有點規模的專案,光是加這些監控的程式碼就是一項很耗費時間的工作,再加上一個不小心動到原本正常執行的程式,那更是得不償失!

今天要介紹一個工具:p6spy,只要透過幾個簡單設定,就可以觀察所有 SQL 的執行狀況,而且移除也很容易,非常適合專案在開發階段時使用!

  1. 請 clone 以下專案
    https://github.com/kennyliao1982/demo-p6spy
  2. 匯入 Eclipse 之後,執行 mvn  package,確保需要的 dependency 都有抓到
  3. 執行 src/main/java 底下的 com.appx.demo.p6spy.App.java
  4. 觀察 console

大家可以看到 log 的上半部記載了 SQL 執行狀況,log的格式如下:(以”|”分隔)
執行當下時間 | 執行耗費時間 | log種類 | connection id | prepared statement SQL語句
實際執行的SQL語句

這次的測試一樣使用了H2 database + Hikari connection pool,主要執行流程如下:
(可參考App.java 的 main 方法)

  1. 啟動資料庫
  2. 建立 DataSource,新建 user table,新增幾筆 user 資料
  3. 查詢所有 user資料
  4. 關閉資料庫

大部分的操作都和之前在示範 connection pool 時一樣,究竟在哪裡用到 p6spy 呢?答案在 App.java 第61行

對,程式碼的異動,就只有這麼一行!這一行只是把原本建立好的 HikariDataSource 物件用 p6spy 提供的 P6DataSource 包裝起來,後續的參數一律使用 P6DataSource,這樣就達到 SQL logging 的效果了!( log 輸出格式的設定可以參考 src/main/resources/spy.properties,基本上都用預設值)

P6DataSource 針對原有 DataSource 作了包裝並加上 logging 機制,實現了 design pattern 中的 decorator pattern (另一個典型例子就是 Java IO 的 BufferedReader )

我們這個案例是手動建立資料庫連線,所以使用 p6spy 需要動一點程式碼,如果是在使用了 framework 的架構下,基本上資料庫連線都是由 framework 讀取設定後負責建立的,這種情況下要使用 p6spy 只需動動設定檔就好,對於程式碼來說沒有任何影響,之後要移除也是非常容易!

Facebook Comments

JDBC 再升級 — connection pool 牛刀小試

這回要透過一個簡單的例子,讓大家實際感受使用了 connection pool 前後的差異!

  1. 把這個專案 clone 下來
    https://github.com/kennyliao1982/demo-connection-pooling
  2. 在專案根目錄下執行  mvn test
  3. 從console log 就可以看出測試的數據囉!

    *測試說明:測試方式為開關 connection 5000 次,並計算其平均以及全部所花費的時間 (單位是毫秒),由上圖可看出

    • 最慢: NoConnectionPoolingTest,開關一次 connection要 7.106 毫秒,跑完5000回合需要35530毫秒
    • 最快: HikariConnectionPoolingTest,開關一次 connection要 0.017 毫秒,跑完5000回合需要85毫秒

看到這裡,相信大家已經深刻的體會到 connection pool 對於效能優化帶來多麼大的幫助。 connection pool 在市面上有不少團隊推出自己的實作: c3p0, dbcp2, BoneCP, tomcat, vibur, HikariCP…等等,經由上面的簡單測試可以稍微比較一下哪家的效能比較好


如果對於上面測試的程式有興趣的同學,可參考以下說明:

  • 使用了快速、輕巧的資料庫H2 database,可以內嵌在應用程式裡,方便執行測試
  • 基於JUnit,可參考 AbstractConnectionTest.java
    • 在@BeforeClass, @AfterClass 裡啟動/關閉H2資料庫
    • 標註了 @Test的 testOpenCloseConnections 為主要測試流程
    • abstract method initDataSource() 由子類別自行實作,這是 design pattern 的 Template (method) pattern

Facebook Comments

JDBC 再升級 — 使用 connection pool

我們在學習了基本JDBC的操作之後, 如果要更進一步在正式專案使用JDBC,我自己過去的專案經驗是100%都會使用 connection pool 來處理資料庫連線。雖然這已經是一種很普遍的作法,但從學習的角度來看,我們必須知其然,也知其所以然!

Continue reading →

Facebook Comments