Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Spring3.1概要x di

10,767 views

Published on

2/13

Published in: Technology
  • Be the first to comment

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); }}

×