Comments
Transcript
DIコンテナ Spring Frameworkによる 次世代Java EEアプリケーション開発
DIコンテナ Spring Frameworkによる 次世代Java EEアプリケーション開発 河村 嘉之 日立ソフト 研究部 技師/ソリューションアーキテクト © 2005 Hitachi Co., Software Co., Ltd. ©Copyright Hitachi Softweare Engineering Ltd. 2004Engineering All rights reserved. ○○○のご提案 自己紹介 河村 嘉之 • 日立ソフトウェアエンジニアリング㈱ – 研究部 – 技師/ソリューション・アーキテクト – http://hitachisoft.jp/research/techdoc 2 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 目次 • J2EE 現在までの道のりと問題点 • アプリケーション開発の新しい流れ – – – – DIコンテナ O/Rマッピングツール Webフレームワークとの連携 Ease of Testing – チーム構成 • Java EE5、EJB3.0に向かって 3 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 目次 • J2EE 現在までの道のりと問題点 • アプリケーション開発の新しい流れ – – – – DIコンテナ O/Rマッピングツール Webフレームワークとの連携 Ease of Testing – チームビルディング • Java EE5、EJB3.0に向かって 4 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 Java 10年の歴史 Java登場 Applet JavaBeans HotJava JDK 1.0 1995 JDBC Servlet EJB Java 2 SDK1.2 J2SE、J2EE、J2ME 2000 Eclipseプロジェクト J2EE 1.3 JBoss 2.0 Struts JSF J2SE 5.0 2005 JSP Spring Framework 10年でサーバサイドの開発技術の本命に! 5 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 J2EE(EJB)の問題点 Servlet EJB JSP JMS この中でどれを 使ってますか? J2EE EJBを使っていますか? •テストしづらい •インターフェース、DDといった構成要素が多い •プログラミング上の制約も多い 6 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 J2EEアプリケーションの特性 war war Web コンテナ ear EJB EJB EJB EJB コンテナ J2EEアプリケーションサーバ コンテナがないとプログラムが動かない 各コンポーネントは、コンテナに依存 コンテナとコンポーネントは切っても切れない関係 7 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 J2EE™の問題点 コンテナベースの開発 たとえば、EJB • 構成要素が多い – インターフェース x 4 – デプロイメントディスクリプター • プログラミング上の制約が多い – コールバックメソッド – 特定のインターフェースを実装 難しい!! – 開発が難しい – テストが難しい – 習得が難しい • デプロイしないと動かない – テストの効率が悪い 8 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 目次 • J2EE 現在までの道のりと問題点 • アプリケーション開発の新しい流れ – – – – DIコンテナ O/Rマッピングツール Webフレームワークとの連携 Ease of Testing – チーム構成 • Java EE5、EJB3.0に向かって 9 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 いままでのアプリケーション開発 Web フレーム ワーク Business Logic DB EJB J2EEサーバ 10 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 アプリケーション開発の新しい流れ Action Business Logic Web フレームワーク DIコンテナ Data Access Object DB O/Rマッピング ツール AOP J2EEサーバ 11 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 DIコンテナ • DIコンテナとは? 属するレイヤの異なるコンポーネントを組み 合わせるもの – POJOの利用(コンテナ非依存・テストが簡単) – IoC/DIによるコンテナによるオブジェクト管理 – AOPのサポート • 代表的なDIコンテナ – Spring Framework – Seasar2 – PicoContainer 12 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 POJO • POJO (Plain Old Java Object) – 特定のクラスを継承していたり、特定のインター フェースを実装していたりしない、シンプルな Java オブジェクト – 特定のフレームワークに依存しない。 – 簡単に生成でき、安心して使える。 • POJOではないもの – Entity Beanを使うときは? 13 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 IoC/DI Objectの結びつけも コンテナが担当 Objectをコンテナが生成 Objectをコンテナが呼び出す Object Inversion of Control (制御の反転) 生成 Object 参照 Dependency Injection (依存性の注入) Object 参照 生成 生成 DIコンテナ インターフェースドリブンの開発 = レイヤ間の疎結合を実現 14 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 AOP • Aspect Oriented Programming (アスペクト指向プログラミング) – プログラムの本来の目的とは違う処理(アスペクト)を切り出す – アスペクトを外から織り込む – プログラムの本来の処理とアスペクトの密結合を防ぐ • AOPの使いどころ – ログの出力 – トランザクション処理 など • DIコンテナ+AOP – アスペクトの織り込みを設定ファイルを用いて行う 15 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 依存性の排除 今までの プログラミングモデル コンポーネント ログを呼び 出すコード ログ 他のコンポ ーネントを探 すコード コンポーネン ト間の独立 性の確保 コンポーネント コンポーネン ト間の依存 性が高い DI コンポーネント ログ AOP コンポーネント DIコンテナ DIコンテナ上での プログラミングモデル 16 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 Spring Framework • Rod Johnson氏が中心となって開発したJavaフレー ムワーク • http://www.springframework.org にて公開 • 最新版は1.2.6 (2005年11月現在) • IoC/DIをベースとしたフレームワーク • DIコンテナ – 各要素がPOJOで構成 • Web、MVC、DAO、AOPなど豊富な機能を持つ 17 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 Spring Frameworkの構成要素 Spring ORM Spring Web Spring DAO Spring Context Spring AOP Spring Web MVC Spring Core ORMとしてHibernate、JDO、 WebフレームワークとしてStrutsなど 既存のフレームワークを有効に活用できる 18 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 Spring Framework コード例 BeanFactory bf = new ClassPathXmlApplicationContext(“bean.xml"); UserService service = (UserService)bf.getBean(“userService"); Beanを利用するコード 設定ファイル(bean.xml) <<interface>> UserService ……… UserServiceImpl -userDAO:UserDAO +setUserDAO() ……… <beans> <bean id ="userService" class="sample.service.UserServiceImpl"> <property name="userDAO"> <ref local="userDAO"/> </property> </bean> 関連付け <bean id="userDAO" class="sample.dao.UserDAOImpl"> </beans> <<interface>> UserDAO ……… UserDAOImpl ……… 19 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 DIのメリット・デメリット • メリット – コンポーネント間の依存性が軽減 – 実装と設定の分離 • デメリット – コードを見ただけでは、コンポーネントをまたいだ プログラムの動きが追いにくい →使う人のスキルを必要とする 20 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 O/Rマッピングツール Action Business Logic Web フレームワーク DIコンテナ Data Access Object DB O/Rマッピング ツール AOP J2EEサーバ 21 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 O/Rマッピングツール Javaオブジェクト Public class User { private long id; private String name; public void setId(long id) { this.id = id; } public long getId() { return id; } …… } データベース Mapping ID Name 1 鈴木 一郎 …… …… O/Rマッピングツール データベーステーブルとJavaオブジェクトを自動的にマッピング 開発者は、Javaオブジェクトに対して操作をする データベースにアクセスするコードを 一気に削減 22 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 Hibernate • Gavin King氏が中心となって開発したJavaのO/Rマッピン グツール • http://www.hibernate.org にて公開 • 最新版は3.0.5 (2005年11月現在) • XMLを用いてJavaオブジェクトをRDBのテーブルとマップ する • 扱うJavaオブジェクトはPOJOなので、フレームワークへの 依存か少ない。 • 高機能な検索言語 HQL • キャッシュやLazy Loadingなどによるハイパフォーマンス 23 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 Hibernate コード例 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="sample.entity.User" table="User"> <id name="id" type=“long" column="ID"> <generator class="native"/> </id> <property name=“name" type="java.lang.String" column="USER_NAME" length="10"/> </class> </hibernate-mapping> マッピングファイル POJO public class User { private long id; private String name; public void setId(long id) { this.id = id; } public long getId() { return id; } public void setName(String name) { this.name = name; } public String getName() { return name; } } 24 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 Hibernate コード例 public class UserDAOImpl implements UserDAO { public List findUser(String name) { Session session = null; try { SessionFactory sf = new Configuration().configure().buildSessionFactory(); session = sf.openSession(); String query = “from User user where user.name = ?”; return session.find(query, name, Hibernate.STRING); } catch (HibernateException he) { return null; } finally { if (session != null) { try { session.close(); } catch (HibernateException he) {} } } } } 25 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 Spring + Hibernate HibernateTemplate public class UserDAOImpl implements UserDAO { public List findUser(String name) { Session session = null; try { SessionFactory sf = new Configuration().configure().buildSessionFactory(); Configuration().configure().buildSessionFactory(); session = sf.openSession(); sf.openSession(); String query = “from User user where user.name = ?” ?”; return session.find(query, session.find(query, name, Hibernate.STRING); Hibernate.STRING); } catch (HibernateException (HibernateException he) { return null; } finally { if (session public != null) { class UserDAOImpl extends HibernateDaoSupport try { implements UserDAO { session.close(); session.close(); } catch (HibernateException he)findUser(String {} (HibernateException public List name) { } String query = “from User user where user.name = } } return getHibernateTemplate().find(query, name, } Hibernateを 使うコードを 一気に簡略化 ?”; Hibernate.String) } Hibernate } Only Hibernate + Spring 26 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 Spring + Hibernate 宣言的トランザクション AOPを 利用 コードの変更なしに トランザクション設定 を変更 userService transaction Interceptor userServiceTarget UserServiceImpl removeUser= PROPAGATION_REQUIRED editUser= PROPAGATION_REQUIRED userDAO UserDAOImpl transaction Manager 27 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 Web フレームワーク Action Business Logic Web フレームワーク DIコンテナ Data Access Object DB O/Rマッピング ツール AOP J2EEサーバ 28 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 Webフレームワークとの連携 • Web MVC Framework – Model-View-Controlデザインパターンをもとに、ページ遷移 などのコントロールを行うWebアプリケーション用フレーム ワーク – Struts (struts.apache.org) が有名 – Java EEの世界では、JSF (JavaServer Faces)が標準 • Spring Frameworkとの連携 – Struts、JSFとの連携モジュールを提供 – その他のフレームワークとの連携も進んでいる 29 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 StrutsとSpring Frameworkの連携 View JSP Controller Struts 設定ファイル アクション サーブレット JSP Strutsの弱点 Actionに ビジネスロジック、 DBアクセスが混在 Model アクション フォーム Validator DIコンテナで管理 アクション Struts Action以下を DIコンテナで 管理 ビジネス ロジック DBアクセス DB Spring Framework 30 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 J2EEアプリケーションのテスト いままでJ2EEアプリケーションの Unitテストをしていましたか? コンテナに デプロイしないと テストできない Cactus、 JUnitEE、 難しい... テストに時間がかかる お互いが依存していて どこをテストしてるか わからない テストの効率が悪い 31 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 テストをしよう! 対象のクラスを しっかりテスト <<interface>> UserService ……… UserServiceImpl -userDAO:UserDAO +setUserDAO() ……… テスト対象クラス デプロイしないでテストできる →簡単にテストができる →J2SEだけでもテストができる →Eclipseの上でもテストができる →ビルドプロセスに統合し自動化 DIコンテナによって、 クラス間を疎結合に 保てる <<interface>> UserDAO ……… UserDAOMock ……… テスト用の 実装に 入れ替え 32 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 テストをしよう! テストができるようになると – 繰り返しテストを行う •品質の向上 •他の修正によるデグレードを回避 – テストしやすいコードを書く •プログラムの可読性の向上 33 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 DIコンテナとチームビルディング よりシンプルな 開発ができる コンポーネント 一般開発者 コンポーネント コンポーネント より重要に AOP アーキテクト DIコンテナ DIコンテナ+AOP = アーキテクトの強力な武器に! 34 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 目次 • J2EE 現在までの道のりと問題点 • アプリケーション開発の新しい流れ – – – – DIコンテナ O/Rマッピングツール Webフレームワークとの連携 Ease of Testing – チーム構成 • Java EE5、EJB3.0に向かって 35 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 EJB 3.0 EJB 3.0 (JSR220) Public Draft • Expert Group – Spec Lead: Sun Microsystems Linda DeMichel – BEA、IBM、Oracleなどに加えて、JBossからGavin Kingな どが参加 • ドキュメントは3部構成 – EJB 3.0 Simplified API EJB開発の簡略化 – Enterprise JavaBeans Core Contracts and Requirements EJBの利用および実装に必要な項目の定義 – Java Persistence API POJO Persistenceを中心とした新しい永続化API →このAPI単独で使用可能 36 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 EJB 3.0 EJB 3.0の方向 • POJO/POJIによるコンポーネント開発 – 特定のクラス・インターフェースに依存しない – POJOパーシステンス • EoD – Annotationによるメタデータの記述 – Deployment Descriptorが必須ではない – インターフェースの簡略化 • Resource Injectionのサポート – リソース参照、EJB参照などをコンテナが注入する • AOPのサポート 37 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 EJB 3.0 • POJO Persistence @Entity public class User{ private Long id; private String name; @Id(generate=AUTO) @Stateless public Long getId() { public class UserService { return id; @PersistenceContext } EntityManager em; public void setId(Long id) { public User findUser(Long id) { this.id = id; return (User)em.find(“User”, id); } } public String getName() { } return name; } public void setName(String name) { this.name = name; } 38 } Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 EJB 3.0 • DI/AOP (from EJB 3.0 Simplified API) @Stateless public class UserDAO { DI @Resource(name=“UserDB”) public DataSource userDB; public void removeUser(int id) @Stateless { try { @Intercepters({sample.Debug}) Connection con = public class UserService { userDB.getConnection(); ..... …… } } catch (Exception ex) { …… public class Debug } @AroundInvoke } public Object debugOut( InvocationContext i) { AOP System.out.println(i.getMethod()+ “ is called.”); return i.proceed(); 39 } Copyright © 2005 Hitachi Software Engineering Co., Ltd. } ○○○のご提案 Java EE 5 ~JSFとEJB3.0の連携~ JSFのManaged BeanにSession Beanを注入 Managed Bean Session Bean @EJB JSF DB Entity EJB Java EEサーバ 40 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 J2EE5.0(EJB3.0)へ向かって 2005 Spring Struts Hibernate J2EEサーバ 現状での 現実解 実際に使えるのは 1~2年先 2006 JSF Session Bean Entity Java EE 5 2007 41 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 Java EE 5とDIコンテナ Spring Framework Java EE 5 Hibernate それぞれカバーする範囲が異なる 42 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 まとめ • サーバサイドのJavaアプリケーション開発に おける変化 – その中心はDIコンテナやO/RマッピングツールなどPOJO を中心に据えたフレームワーク/ツール • この流れは、次期のJava EE 5にも取り込ま れている 43 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 せっかくなので • 実践 Spring Framework – 日経BP社 – 3,990円 • 展示会場の書店にて 発売中! 44 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 ご質問をどうぞ 45 Copyright © 2005 Hitachi Software Engineering Co., Ltd. ○○○のご提案 補足 • 商標 – JavaおよびEJB、J2EE、J2SE、J2ME、JavaBeans、JDK、HotJava、JDBC、JSP は、Sun Microsystems社の米国およびその他の国における商標です。 – JBossは、JBoss社の米国およびその他の国における商標です。 46 Copyright © 2005 Hitachi Software Engineering Co., Ltd.