...

DIコンテナ Spring Frameworkによる 次世代Java EEアプリケーション開発

by user

on
Category: Documents
11

views

Report

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.
Fly UP