Spring3.1概要x di

9,538 views

Published on

2/13

Published in: Technology
0 Comments
14 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
9,538
On SlideShare
0
From Embeds
0
Number of Embeds
1,613
Actions
Shares
0
Downloads
111
Comments
0
Likes
14
Embeds 0
No embeds

No notes for slide

Spring3.1概要x di

  1. 1. Spring概要とDI for Beginner 2012/2/13
  2. 2. SpringFrameworkからSpringへ!?SpringFramework概要
  3. 3. Spring•  Spring Framework ‒  ロッド・ジョンソン氏(SpringSource[旧社名: Interface21])が中心に開発 ‒  Java/JEEアプリケーション開発用フレームワーク •  DIxAOPコンテナ ‒  ASL(Apache Software Licence) Ver2.0に基づいたオープ ンソース 3
  4. 4. springsource.org
  5. 5. Springの年譜•  2002年11月 書籍:Expert One-on-One J2EE•  2004年3月 Spring 1.0•  2004年9月 Spring 1.1•  2005年5月 Spring 1.2•  2006年10月 Spring 2.0•  2007年11月 Spring2.5•  2009年12月 Spring3.0•  2011年12月 Spring3.1 ‒  Java7, Spring Cache...•  201x年 Spring3.2 ‒  Hibernate4 FullSupport... 5
  6. 6. Springの主なプロジェクト•  Spring AMQP •  Spring Mobile•  Spring Android •  Spring .NET•  Spring Batch •  Spring Roo•  Spring BlazeDS •  Spring Security•  Spring Data •  Spring Security•  Spring Framework OAuth•  Spring Gemfire •  Spring Social•  Spring Integration •  Spring Web Flow •  Spring Web Services 6
  7. 7. 何があるのか、どこへ行くのか!?SpringSource
  8. 8. springsource.com
  9. 9. SpringSourceの年譜
  10. 10. 開発-実行-管理
  11. 11. Spring Roo•  コマンドラインを利用してソースを自動生成するツール ‒  生産性の向上及び仕様変更や機能追加にも耐えうる継続的な開発 ‒  Java界隈においてメジャーなフレームワークを利用 ‒  自動生成した後もモデルクラスの変更に対して、ビューやコントロー ラクラスが自動で再作成される 11
  12. 12. STS•  SpringSource Tool Suite ‒  EclipseベースのSpringアプリケーション開発環境 ‒  各種サーバへのデプロイ管理
  13. 13. VMforce•  Force.comで実行可能なSpringアプリケーションを Javaで開発、実行、実行するためのサービス•  Force.com ‒  リレーショナルデータベース、全文検索エンジン、レポートや 分析、ユーザやアイデンティティ情報の管理...
  14. 14. vFabric•  VMwareの今後の方向性を占うソリュー ション ‒  クラウド向けのアプリケーション基盤(ミド ルウェア) Spring Application vFabric VMware
  15. 15. vFabric•  VMWare が提供する Java アプリケーションプラットホーム ‒  AP サーバーやデータベースやメッセージキューなどのソフトウェアを 1セットで提供する•  VMware vFabric Cloud Application Platform ‒  vSphere のメモリ管理機能を利用したコンピュータリソースの有効活 用 ‒  vCenter によるアプリケーションの監視 ‒  仮想マシンの数に応じた価格体系を提供
  16. 16. tc Server•  エンタープライズ向けにカスタマイズさ れた Tomcat ‒  開発者に馴染みの Tomcat互換 ‒  Springを利用して作成したアプリケーション を実 行するのに適した環境•  Tomcat + α ‒  Webベースの管理UI ‒  アプリケーションの設定とデプロイ管理 ‒  パフォーマンスのモニターおよび状態の診断
  17. 17. ERS(Enterprise Ready Server)•  Web サーバーとロードバランスの機能を提供 ‒  Apache HTTP Server を使用 ‒  Apache と比較して最大 100% のパフォーマンスアップ•  迅速にバグフィックスするサポートを提供 ‒  Apache HTTP Server のサポートを提供していた Covalent 社 を SpringSource が買収 tc Server ERS tc Server
  18. 18. RabbitMQ•  AMQP(Advanced Message Queuing Protocol) を実 装したメッセージキュー•  多彩なメッセージングのパターンに対応 ‒  point-to-point, publishsubscribe,routing...•  多彩なプロトコル、言語(クライアント側)に対応 Spring RabbitMQ tc Server Apprication Cloud時代のスケール メッセージBus
  19. 19. GemFire•  メモリーベースの分散型のデータ管理プラット ホーム(永続化も可能) ‒  Key-Value ストア ・マシンを動的に追加可能 ‒  非同期のイベント通知 Spring GemFire tc Server Apprication Cloud時代のスケール データストレージ
  20. 20. Hyperic•  tc Serverの管理・監視・計測 ‒  他のミドルウェアや OS リソースも監視できる•  管理 ‒  ランタイムインスタンスの起動・停止 ‒  JVM オプション・ JDBC データソースなどの設定 ‒  Web アプリケーションのデプロイ•  監視 ‒  リソースの閲覧・監視・コントロール ‒  デッドロックの検知 ‒  ガベージコレクションの時間 ‒  JDBC データソースの監視•  計測 ‒  instrumented 版の Spring Framework を利用し、 bean のメ ソッドの処理時間などを表示
  21. 21. これから!?•  エンタープライズ開発 ‒  Spring Framework + その他のプロダクト•  プライベートCloud ‒  vFablic + vSphere•  PaaS ‒  VMforce ‒  CloudFoundary
  22. 22. システム開発と部品化…DIコンテナ
  23. 23. ソフトウェアを部品化したい•  電気製品みたいなことがしたい! ‒  部品化 = インタフェース接続
  24. 24. 部品化とインタフェース•  インタフェースが穴の方•  部品(コンポーネント)化するときに、インタ フェースをもつのは「偉い方」 部品 部品 ステレオ スピーカ
  25. 25. インタフェースとレイヤ,パッケージ•  変更単位や開発単位に適宜導入する ‒  レイヤ •  パソコン, ディスプレイ, キーボード... ‒  パッケージ(コンポーネント) •  パソコンの中のCPU, メモリ, HDD... 表示の仕組み 業務の仕組み 永続化の仕組み プレゼン ビジネス データベース テーション ロジック アクセス RDBブラウザ 25
  26. 26. インタフェースで分散開発•  分割単位毎(レイヤ,パッケージ,コンポーネ ントなど)に、インタフェースを利用して、開 発チームを分ける R R 疑似 Q QImpl Q 疑似 QImpl Q 26
  27. 27. インタフェース導入の難しさ•  インタフェースの実装を、インタフェースを利用するク ラスが生成(インスタンス化)してはいけないpublic class R { ②利用・・・ QImplQ q = new QImpl(); // ダメ R (Qの実装)q.methodA(); QString m = q.methodB();・・・ ①生成 27
  28. 28. インタフェース導入とFactory•  インタフェースの実装を生成(インスタンス化)する Factory(FactoryMethod)を用意(自作)すること で解決するpublic class R { ③利用 ・・・ QImplQ q = R (Qの実装) (Q)Factory.create(KEY); Q ①生成の q.methodA(); 要求 String m ②生成 Factory = q.methodB(); ・・・ KEY=QImpl 28
  29. 29. Factoryの例 ③利用 QImpl R (Qの実装) Q①生成の 要求 ②生成 Factory KEY=QImplpublic static Object create(String keyName) { // keyNameを元にファイルを読み込んで、生成するクラス名を取得する Class<?> clazz = Class.forName(createName); Object obj = clazz.newInstance(); return obj;} 29
  30. 30. Factoryにもうひと工夫•  Webアプリケーションは、マルチスレッドで動作する•  マルチスレッド配下の(ステートレスな)処理は、スレッド単にイ ンスタンス化するのではなく、システム内に1つあれば良い :Employee インスタンス化 ServiceImpl :FindAction :Employee ServiceImpl マルチスレッド :Employee ServiceImpl インスタンス化 :Employee :FindAction ServiceImpl マルチスレッド 30
  31. 31. FactoryをSingleton対応にする•  1度インスタンス化されたクラスは、2回目のインスタ ンス化のリクエストに対して、同じインスタンスを返し てしまえば良い ‒  クラスのSingleton化が不要 はしょってる ので注意 private EmployeeServiceImpl empService = null;・・・ public static Object create(String keyName) { // keyNameが同じだったら、リターン return (Object)EmpService; // 初めてのkeyNameだったら、シンクロナイズして以下を実行 Class<?> clazz = Class.forName(createName); Object obj = clazz.newInstance(); return obj;} 31
  32. 32. DIコンテナを利用する!•  Factoryではなく、DIコンテナを使用することでインタ フェースが容易に扱える•  しかも、Factoryのようにソースコードに現れないpublic class R { @Autowired QImpl private Q q; R (Qの実装) ・・・ Q q.methodA(); String m = q.methodB(); ・・・ DIコンテナ ②セット ①生成 DIコンテナ導入後 32
  33. 33. ようやくDIの登場!•  DI(Dependency Injection) ‒  依存性の注入•  インタフェースの導入が楽 ③利用 EmpServiceImpl DB2EmpDao EmpDao ②セット (依存性の注入) ①生成 DIコンテナ 33
  34. 34. Singletonへの対応•  一般的に利用されているDIxAOPコンテナ であれば、インスタンスをSingletonとし て生成するか、リクエスト毎にインスタ ンス化のどちらかを選ぶことができる ‒  Spring,Seasar2 ...etc 34
  35. 35. SpringでおこなうDI•  アノテーションの利用 ‒  Spring2.x系以降、アノテーションの利用が増えてい る(大規模開発や大手SI便だでは定義ファイルの利用 が多い) ‒  メリット:定義ファイルの管理が不要 ‒  デメリット:プログラマにアノテーションを意識•  定義ファイルの利用 ‒  Springの基本 ‒  メリット:プログラマにSpringを意識させない ‒  デメリット:定義ファイルの管理 35
  36. 36. アノテーションを使ったINJECTION!
  37. 37. アノテーションを利用したDI•  インジェクションの設定(自動検出) ‒  @Autowired•  Beanの設定 ‒  @Component Injection class Service { @Component @Autowired class DaoImpl private Dao dao; implements Dao { ... ... } Dao } 37
  38. 38. 主なインジェクションの設定•  @Autowired ‒  byType ‒  プロパティ,コンストラクタ,メソッドで有 効 ‒  複数のパラメータやコレクション型に対応 ‒  @Autowired(required=false)•  @Qualifier ‒  @Autowiredと組み合わせてbyName ‒  @Qualifier("hogeImpl"); 38
  39. 39. 主なBeanの設定•  @Component ‒  SpringのBeanとして扱う ‒  @Component( 任意の名前 )も可能。省略時 はクラス名の先頭小文字 ... @Component public class Hoge { ... 39
  40. 40. 問題 こんなことできる?public class Hoge { @Autowired public class Hoge { private Fuga f; @Autowired @Autowired public Hoge(Fuga f, FugaFuga ff) {...} private FugaFuga ff; @Autowired public m(Fuga f, FugaFuga ff) {...} @Component public class FugaImpl @Component implements Fuga { public class FugaFugaImpl ... implements FugaFuga { } ... } 40
  41. 41. アノテーションでも必要。Bean定義ファイル<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans” xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context” xsi:schemaLocation=“ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:annotation-config /> <context:component-scan base-package="sample.di.*"/></beans> 41
  42. 42. タグ解説•  <context:annotation-config /> –  @Autowired,@Resourceを利用する場合•  <context:component-scan  base-package= "パッケージ名, ・・・"/> –  @Component,@Serviceなどを利用する場合" ‒  base-packageで指定したパッケージ名以下のコン ポーネントを検索する 42
  43. 43. その他のスキーマ一覧 名称 スキーマ URI 説明 ファイル utilスキーマ spring-util.xsd http://www.springframework.org/schema/util 定数定義やプロパティ ファイルの読み込み等 のユーティリティ機能 の設定を簡略化 jeeスキーマ spring-jee.xsd http://www.springframework.org/schema/jee JNDIのlookupおよび、 EJBのlookupの設定を 簡略化 langスキーマ spring-lang.xsd http://www.springframework.org/schema/lang スクリプト言語による設 定を簡略化 aopスキーマ spring-aop.xsd http://www.springframework.org/schema/aop AOPの設定を簡略化 txスキーマ spring-tx.xsd http://www.springframework.org/schema/tx トランザクションの設定 を簡略化 43
  44. 44. 問題 2つあったら?•  Autowireでインタフェースを実装するク ラスが2つあったらどうなる?class Service { @Component @Autowired class ADaoImpl private Dao dao; implements Dao { ... ...} Dao } @Component class BDaoImpl implements Dao { ... }
  45. 45. 問題 じゃあ、Unitテストどうする?class Service { @Component @Autowired class DaoImpl private Dao dao; implements Dao { ... ...} Dao } @Component class TestDaoImpl implements Dao { ... }
  46. 46. 解答の1つ:切り替え毎に…<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans” xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context” xsi:schemaLocation=“ http://www.springframework.org/schema/beans ワイルドカードはやめて、 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd コンポーネント毎に宣言する http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:annotation-config /> <context:component-scan base-package="sample.di.service"/> <!-- <context:component-scan base-package="sample.di.dataaccess"/> --> <context:component-scan base-package="test"/></beans> 46
  47. 47. 問題 インターフェイスがない?class Service { @Component @Autowired class Dao { private Dao dao; ... ... }}
  48. 48. 問題 1つもなかったら?•  Autowireでインタフェースを実装するク ラスがなかったらどうなるか? class Service { @Autowired private Dao dao; ... } Dao
  49. 49. レイヤ毎のBeanの設定•  全て@Componentの拡張•  @Controller ‒  プレゼン層SpringMVC用•  @Service ‒  ビジネス層Service用 ‒  トランザクション管理ができるとか はありました…•  @Repository ‒  データアクセス層DAO用 ‒  例外を全てDataAccessExceptionに変換 ... @Service public class Hoge { ... 49
  50. 50. 主なBeanスコープ•  @Scope ‒  @Componentと併用。Beanのスコープを決める ‒  省略時はsingleton ‒  @Scope( Value属性 ) ‒  Value属性 •  singleton・・・シングルトン •  prototype・・・その都度インスタンス生成 ... @Component @Scope(“prototype”) public class Hoge { ... 50
  51. 51. Web用のBeanスコープ•  @Scope ‒  Value属性 •  request・・・Servlet APIのrequestスコープ •  session・・・Servlet APIのsessionスコープ ... @Component @Scope(“session”) public class Hoge { ... 51
  52. 52. ライフサイクル•  @PostConstruct•  @PreDestroy public class Hoge { ... @PostConstruct public void start() {...} @PreDestroy ... public void stop() {...} <context:annotation-config /> ... ... 52
  53. 53. ここには地獄があった?定義ファイルでINJECTION
  54. 54. Bean定義ファイルの基本•  アノテーションを利用することにより、 Bean定義ファイルの記述負荷は減った•  しかし、最低限の知識は必要 ‒  スキーマの設定 ‒  Beanの設定•  大規模開発で、アノテーションをプログ ラマに書かせるのはやっぱり嫌だ! ‒  というのもある 54
  55. 55. Bean定義ファイル<?xml version="1.0" encoding="UTF-8"?> contextがないことに注意<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-3.0.xsd"> <bean id = "service" class = "sample.di.service. ServiceImpl"> <property name = "dao" ref = "dao"/> </bean> <bean id = "dao" class = "sample.di.dataaccess.DaoImpl" /></beans> 55
  56. 56. 主要タグの主な属性<bean> 属性 意味 id システム内で一意とするオブジェクト名。 name Bean定義ファイル内で、id以外に名前を設定したい場合に設 定する別名。 空白、「,」、「;」で区切ることにより、複数の値を設定できる。 class idの実態。パッケージ名+クラス名。 <property> 属性 意味 name ref属性で指定したオブジェクトをインジェクションする属性の名 前。「set + “name属性で指定した属性名”」のメソッドを利用 する(属性名は使われないことに注意)。 ref インジェクションしたいbeanのid(beanタグのid属性で指定され た名前)。 56
  57. 57. セッタインジェクション ServiceImpl DaoImpl Dao setDao Spring public class ServiceImpl implements Service { private Dao dao; public void setDao(Dao dao) { this. dao = dao; } … 57
  58. 58. 定義ファイル ServiceImpl DaoImpl Dao setDao Spring ・・・ <bean id = service" class = com.starlight.business.ServiceImpl"> <property name = dao ref = dao"/> </property> </bean> <bean id = dao" class = com.starlight.dataaccess.DaoImpl" /> ・・・ 58
  59. 59. 定義ファイル ServiceImpl DaoImpl Dao setDao Spring・・・<bean id = service" class = com.starlight.business.ServiceImpl" autowire="byType" /><bean id = dao" class = com.starlight.dataaccess.DaoImpl" />・・・ 59
  60. 60. 問題 じゃあ、これはどうなる?•  クラス図を書いてみてください・・・<bean id="hogeService" class="sample.HogeServiceImpl"> <property name = "hogeDao" ref = "hogeDao"/> <property name = "hogehogeDao" ref = "hogehogeDao"/></bean><bean id = "hogeDao" class = "sample.HogeDaoImpl" /><bean id = "hogehogeDao" class = "sample.HogehogeDaoImpl" />・・・
  61. 61. 問題 エラー?どうして?•  前の問題の続きです。エラーの原因はなんでしょうpublic class HogeServiceImpl { private HogeDaoImpl hd; private HogehogeDaoImpl hhd;... public void setHd (HogeDaoImpl hd) { this.hd = hd; } public void setHhd(HogehogeDaoImpl hhd) { this.hhd = hhd; }}
  62. 62. おまけ
  63. 63. サンプルを起動したいとき •  Springをお試しで使う例ですimport org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main { public static void main(String[] args) { // 定義ファイルを読んで、コンテナを生成 ApplicationContext ctx = new ClassPathXmlApplicationContext("/sample/config/applicationContext.xml"); // コンテナからコンポーネントの取り出し ProductService productService = (ProductService) ctx.getBean("productService"); // コンポーネントの動作確認 Product product = productService.getProduct(); System.out.println(product); }}

×