jjug springセッション

70
まだまだ Spring~3.1 1

Upload: hasegawa-yuichi

Post on 30-Nov-2014

3.343 views

Category:

Technology


8 download

DESCRIPTION

JJUGのセッション資料です。

TRANSCRIPT

Page 1: Jjug springセッション

まだまだ Spring~3.1

1

Page 2: Jjug springセッション

自己紹介 •  長谷川 裕一(日本Springユーザ会 会長)

‒  1986年、イリノイ州警察指紋システムのアセンブリ言語プログラマからスタートして、PL,PMと経験し、アーキテクト、コンサルタントへ

‒  現在はオブジェクト指向(特にJava/Spring)を中心に、コンサルティング(IT戦略、技術導入/検証、プロセスetc)や教育で活動

•  書籍 ‒  プログラムの育てかた(ソフトバンク),Spring入門(技術評論社),Spring2.0入門(技術評論社),間違いだらけのソフトウェア・アーキテクチャ(技術評論社)

•  その他 ‒  Starlight&Storm LLC代表社員、SQuBOK策定メンバ ‒  株式会社フルネス取締役、チェンジビジョン・コンサルティング・パートナー

2

Page 3: Jjug springセッション

おしながき •  Spring概要~SpringFrameworkからSpringへ!?

‒  SpringSource.org ‒  SpringSource.com

•  Spring3.1~主な追加機能 ‒  Bean定義のプロファイル機能 ‒  組込みデータベースサポート ‒  Object/XMLマッピング連携 ‒  Cache Abstraction機能 ‒  非同期実行/スケジューリング実行

•  これからのJava EnterpriseとSpring~みんなの生き残り戦略 ‒  Spring 現状の問題と解決の術 ‒  Javaの方向性と生き残りの術(JavaOneから見えてきた)

3

Page 4: Jjug springセッション

Spring概要 SpringFrameworkからSpringへ!?

Page 5: Jjug springセッション

springsource.org

Page 6: Jjug springセッション

Spring •  Spring Framework

‒  ロッド・ジョンソン氏(SpringSource[旧社名:Interface21])が中心に開発

‒  Java/JEEアプリケーション開発用フレームワーク •  DIxAOPコンテナ

‒  ASL(Apache Software Licence) Ver2.0に基づいたオープンソース

6

Page 7: Jjug springセッション

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, Hibernate4... •  201x年 Spring3.2

‒  Hibernate4 FullSupport...

7

Page 8: Jjug springセッション

Springの主なプロジェクト •  Spring Framework •  Spring AMQP •  Spring Android •  Spring Batch •  Spring BlazeDS •  Spring Data •  Spring Gemfire •  Spring Integration

8

•  Spring Mobile •  Spring .NET •  Spring Roo •  Spring Security •  Spring Security OAuth

•  Spring Social •  Spring Web Flow •  Spring Web Services

Page 9: Jjug springセッション

springsource.com

Page 10: Jjug springセッション

Spring 開発-実行-管理 •  開発(Java Leadership)

‒  Spring ‒  Groovy&Grails ‒  SpringSource Tool Suite ‒  Cloud Foundary

•  実行(Application Platform) ‒  vFablic ERS ‒  vFablic tc Server ‒  vFablic RabitMQ ‒  vFablic GemFire

•  管理(Apllication Management) ‒  vFablic Hyperic

Page 11: Jjug springセッション

Grailsの代わりにSpring Roo •  コマンドラインを利用してソースを自動生成するツール

‒  生産性の向上及び仕様変更や機能追加にも耐えうる継続的な開発 ‒  Java界隈においてメジャーなフレームワークを利用 ‒  自動生成した後もモデルクラスの変更に対して、ビューやコントロー

ラクラスが自動で再作成される

11

Page 12: Jjug springセッション

STS •  SpringSource Tool Suite

‒  EclipseベースのSpringアプリケーション開発環境 ‒  各種サーバへのデプロイ管理

Page 13: Jjug springセッション

cloudfoundry.com

Page 14: Jjug springセッション

vFabric •  VMwareのソリューション

‒  クラウド向けのアプリケーション基盤(ミドルウェア) ‒  vSphere のメモリ管理機能を利用したコンピュータリソースの有効活用

‒  vCenter によるアプリケーションの監視 ‒  仮想マシンの数に応じた価格体系を提供

vFabric

VMware

Spring + Application

Page 15: Jjug springセッション

vFabric •  VMWare が提供するクラウド向けのアプリケーション基盤 ‒  AP サーバーやデータベースやメッセージキューなどのソフトウェアを1セットで提供する

‒  Springを使用することで仮想アプリケーションとクラウド アプリケーションの開発期間が最大 50 % 短縮

Hyperic (モニタリング と監視)

ERS(Enterprise Ready Server) Webサーバ

tc Server

RabbitMQ (メッセージング)

GemFire (データ管理)

Page 16: Jjug springセッション

ERS(Enterprise Ready Server) •  Web サーバーとロードバランスの機能を提供

‒  Apache HTTP Server を使用 ‒  Apache と比較して最大 100% のパフォーマンスアップ

•  迅速にバグフィックスするサポートを提供 ‒  Apache HTTP Server のサポートを提供していた Covalent 社を SpringSource が買収

ERS

tc Server

tc Server

Page 17: Jjug springセッション

tc Server •  エンタープライズ向けにカスタマイズされた Tomcat

‒  開発者に馴染みの Tomcat互換 ‒  Springを利用して作成したアプリケーションを実行するのに適した環境

•  Tomcat + α ‒  Webベースの管理UI ‒  アプリケーションの設定とデプロイ管理 ‒  パフォーマンスのモニターおよび状態の診断

ERS tc Server

ERS tc Server

ERS tc Server

ERS tc Server

Rabbit MQ

Rabbit MQ

Page 18: Jjug springセッション

RabbitMQ •  AMQP(Advanced Message Queuing Protocol) を実装したメッセージキュー

•  多彩なメッセージングのパターンに対応 ‒  point-to-point, publishsubscribe,routing...

•  多彩なプロトコル、言語(クライアント側)に対応

RabbitMQ tc Server

Cloud時代のスケール メッセージBus

ERS

Page 19: Jjug springセッション

GemFire •  メモリーベースの分散型のデータ管理プラットホーム(永続化も可能) ‒  Key-Value ストア ・マシンを動的に追加可能 ‒ 非同期のイベント通知

Cloud時代のスケール データストレージ

GemFire tc Server ERS

Page 20: Jjug springセッション

Hyperic •  tc Serverの管理・監視・計測

‒  他のミドルウェアや OS リソースも監視できる •  管理

‒  ランタイムインスタンスの起動・停止 ‒  JVM オプション・ JDBC データソースなどの設定 ‒  Web アプリケーションのデプロイ

•  監視 ‒  リソースの閲覧・監視・コントロール ‒  デッドロックの検知 ‒  ガベージコレクションの時間 ‒  JDBC データソースの監視

•  計測 ‒  instrumented 版の Spring Framework を利用し、 bean のメソッドの処理時間などを表示

Page 21: Jjug springセッション

Spring3.1 主な追加機能

21

Page 22: Jjug springセッション

主な追加機能 • Bean定義のプロファイル機能 • 組込みデータベースサポート • Object/XMLマッピング連携 • Cache Abstraction機能 • 非同期実行/スケジューリング実行

22

Page 23: Jjug springセッション

主な追加機能 • Bean定義のプロファイル機能 • 組込みデータベースサポート • Object/XMLマッピング連携 • Cache Abstraction機能 • 非同期実行/スケジューリング実行

23

Page 24: Jjug springセッション

Bean定義のプロファイル機能 •  Bean定義をプロファイルという形でグループ化

‒  Bean定義の有効範囲を指定できる機能

24

<?xml version="1.0" encoding="UTF-8"?> <beans ・・・> <beans profile="test"> <bean id="dataSource" class="org.springframework・・・DriverManagerDataSource"> </bean> <bean ・・・ </beans> <beans profile="production"> <jee:jndi-lookup id="dataSource" jndi-name="・・・"/> <bean ・・・ </beans> </beans>

Page 25: Jjug springセッション

DIコンテナ作成時に指定 • DIコンテナの作成時にtestを指定

25

GenericXmlApplicationContext factory = new GenericXmlApplicationContext(); // プロファイルは複数選択可 factory.getEnvironment().setActiveProfiles("test"); factory.load("classpath:/META-INF/spring/beans.xml"); factory.refresh();

Page 26: Jjug springセッション

SpringJUnit4ClassRunnerで指定

26

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration        ("classpath:/META-INF/spring/beans.xml") @ActiveProfiles("test") public class BeanProfileSpringTest { ・・・

•  SpringJUnit4ClassRunnerを使用したテストクラスでtestを指定

Page 27: Jjug springセッション

Webアプリで指定(1)

27

<context-param> <param-name>spring.profiles.active</param-name> <param-value>production</param-value> </context-param>

•  Webアプリケーションでtestを指定 ‒  ContextLoaderListenerの場合

web.xml

Page 28: Jjug springセッション

Webアプリで指定(2)

28

•  Webアプリケーションでtestを指定 ‒  DispatcherServlet

<servlet> <servlet-name>dispatcherServlet</servlet-name> ・・・省略・・・ <init-param> <param-name>spring.profiles.active</param-name> <param-value>test</param-value> </init-param> ・・・省略・・・ </servlet>

web.xml

Page 29: Jjug springセッション

主な追加機能 • Bean定義のプロファイル機能 • 組込みデータベースサポート • Object/XMLマッピング連携 • Cache Abstraction機能 • 非同期実行/スケジューリング実行

29

Page 30: Jjug springセッション

組込みデータベースサポート •  組込みデータベースをDIコンテナで管理

‒  DataSourceオブジェクトとしてアクセスすることができる機能

‒ データベースの起動/停止を意識することなくアプリケーションを実行可能

‒ メモリ上で起動、終了時には破棄 • テーブルやデータをSQLスクリプトファイルに記述

•  Javaの軽量なデータベース ‒  HSQLDB(http://www.hsqldb.org/) ‒  H2(http://www.h2database.com/) ‒  Apache Derby(http://db.apache.org/derby/)

30

Page 31: Jjug springセッション

HSQLを利用

31

<?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:jdbc="http://www.springframework.org/schema/jdbc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd">   ・・・ <jdbc:embedded-database id="dataSource"> <jdbc:script location="classpath:/META-INF/sql/ddl.sql"/> <jdbc:script location="classpath:/META-INF/sql/data.sql"/> </jdbc:embedded-database>   ・・・ </beans> <jdbc:embedded-database id="dataSource" type="H2">

※type ="DERBY"

Page 32: Jjug springセッション

主な追加機能 • Bean定義のプロファイル機能 • 組込みデータベースサポート • Object/XMLマッピング連携 • Cache Abstraction機能 • 非同期実行/スケジューリング実行

32

Page 33: Jjug springセッション

Object/XMLマッピング連携 •  OXM(Object/XMLマッピング )共通のインタフェースを定義 ‒  Marshallerインタフェース

•  Object→XML ‒  Unmarshallerインタフェース

•  XML→Object

•  実装クラス ‒  JAXB(http://jcp.org/en/jsr/summary?id=222) ‒  Castor(http://castor.org/xml-framework.html) ‒  XMLBean(http://xmlbeans.apache.org/) ‒  JiBX(http://jibx.sourceforge.net/) ‒  XStream(http://xstream.codehaus.org/)

33

Page 34: Jjug springセッション

OXMサンプル

34

Spring MVC

Http Message Converter

:Customer

:Customer

XML

XML

HTTPリクエスト

HTTPレスポンス

メソッドの引数

メソッドの戻り値

Page 35: Jjug springセッション

Bean定義ファイル(JAXB利用)

35

<?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:oxm="http://www.springframework.org/schema/oxm" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.1.xsd">

<oxm:jaxb2-marshaller id="marshaller"> <oxm:class-to-be-bound name="sample.customer.biz.domain.Customer" /> </oxm:jaxb2-marshaller>

<bean id="marshallingConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"> <property name="marshaller" ref="marshaller"/> <property name="unmarshaller" ref="marshaller"/> </bean>

</beans>

Page 36: Jjug springセッション

主な追加機能 • Bean定義のプロファイル機能 • 組込みデータベースサポート • Object/XMLマッピング連携 • Cache Abstraction機能 • 非同期実行/スケジューリング実行

36

Page 37: Jjug springセッション

Cache Abstraction機能 • キャッシュを抽象化する機能

‒ アプリケーション開発者がキャッシュを管理するオブジェクトを全く意識することなくキャッシュを実現

‒ CacheManagerをBean定義ファイルに設定 ‒ アノテーションやBean定義でキャッシュを実現

37

Page 38: Jjug springセッション

SimpleCacheManagerの利用

38

<bean id="cacheManager" class="org.springframework.cache.support.                             SimpleCacheManager"> <property name="caches"> <list> <bean class="org.springframework.cache.            concurrent.ConcurrentMapCacheFactoryBean"> <property name="name" value="users"/> </bean> <bean class="org.springframework.cache.             concurrent.ConcurrentMapCacheFactoryBean"> ・・・省略・・・ </list> </property> </bean>

Page 39: Jjug springセッション

アノテーションの利用(1) •  cache:annotation-drivenタグを設定

39

<?xml version="1.0" encoding="UTF-8"?> <beans ・・・省略・・・ xmlns:context="http://www.springframework.org                                  /schema/context" xsi:schemaLocation=" ・・・省略・・・ http://www.springframework.org/schema/cache http://www.springframework.org           /schema/cache/spring-cache-3.1.xsd">

<cache:annotation-driven />

・・・省略・・・

Page 40: Jjug springセッション

アノテーションの利用(2)

40

@Cacheable(value = "users", key = "#userId") public User findById(long userId){ ・・・省略(データベースアクセスなど)・・・

findById(..)

:User userId=001

:User userId=003

:UserTBL

userId="001"の場合

userId="009"の場合

Page 41: Jjug springセッション

アノテーションの利用(3)

41

@CacheEvict(value = "users", key = "#user.id") public void update(User user) { ・・・省略(データベースアクセスなど)・・・

update(..)

:User userId=001

:User userId=003

:UserTBL

userId="001"の場合

update

delete

Page 42: Jjug springセッション

Bean定義の利用 • キャッシュの設定をソースに書きたくない場合

42

<cache:advice id="cacheAdvice"> <cache:caching cache="users"> <cache:cacheable method="findById" key="#userId"/> <cache:cache-evict method="update" key="#user.id"/> ・・・省略・・・ </cache:advice>

Page 43: Jjug springセッション

主な追加機能 • Bean定義のプロファイル機能 • 組込みデータベースサポート • Object/XMLマッピング連携 • Cache Abstraction機能 • 非同期実行/スケジューリング実行

43

Page 44: Jjug springセッション

非同期実行/スケジューリング実行 • アノテーションで非同期実行やスケジューリング実行が可能 ‒ @Asyncアノテーション ‒ @Scheduledアノテーション

44

Page 45: Jjug springセッション

Bean定義ファイル •  task:annotation-drivenタグを設定

45

<?xml version="1.0" encoding="UTF-8"?> <beans ・・・省略・・・ xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" ・・・省略・・・ http://www.springframework.org/schema/task http://www.springframework.org/schema/                              task/spring-task-3.1.xsd">

<task:annotation-driven/> ・・・省略・・・

Page 46: Jjug springセッション

非同期メソッド(戻りなし)

46

@Async public void foo() { ・・・

@Async public String foo() { ・・・ // 戻り値を指定してもnullしか戻らないので注意

Page 47: Jjug springセッション

非同期メソッド(戻りあり)

47

@Async public Future<String> foo() { ・・・ String result = ・・・ return new AsyncResult<String>(result); }

Future<String> asyncResult = object.foo(); ・・・ String result = asyncResult.get();

非同期メソッド

呼び出し/受け取り

Page 48: Jjug springセッション

スケジューリング

48

@Scheduled(fixedDelay = 5000) public void bar() { ・・・ //属性は1つしか指定できない

属性 説明

cron cron形式で指定したスケジュールに従って実行する 例)毎日12時に実行 cron = "0 0 12 * * ?"

fixedDelay 指定されたミリ秒の間隔でメソッドを実行する メソッドが実行されるまでの間隔は、前のメソッドが終了した時点からカウントされる

fixedRate 指定されたミリ秒の間隔でメソッドを実行する メソッドが実行されるまでの間隔は、前のメソッドが開始した時点からカウントされる

Page 49: Jjug springセッション

これからのJava EnterpriseとSpring

みんなの生き残り戦略

49

Page 50: Jjug springセッション

•  Spring 現状の問題と解決の術 •  Javaの方向性と生き残りの術(JavaOneから見えてきた)

50

Page 51: Jjug springセッション

•  Spring 現状の問題と解決の術 •  Javaの方向性と生き残りの術(JavaOneから見えてきた)

51

Page 52: Jjug springセッション

Springの現状 • 大手SIが標準アーキテクチャ(フレームワーク)のベースとして利用するなど、多くの企業で採用

•  JSUG発表事例から ‒ CSK(当時) ‒ NTTデータ ‒ 日本UNISYS ‒ アクセンチュア

52

Page 53: Jjug springセッション

Spring利用時の問題点(昔) • Webアプリで、様々なクラスがApplicationContextを生成してクラスをgetしていた ‒ ネット連載の初回しか見なかったのか?

• 何でもかんでもInterfaceを付加してInjection(今でもちょっとある) ‒ 書籍や記事等で強調し過ぎた!?

• 「うちではそんな高度なフレームワークは使いこなせません」 ‒ これはちょっと…

53

Page 54: Jjug springセッション

Spring利用時の問題点(今) •  Spring3なのにSpring1

‒ 勉強不足です… • 「Rooを使えばCOBOLERだけでもレガシーマイグレーション可能ですよね」 ‒ 過信しすぎ…

• ビジネスロジックの作りの酷さが目立つようになってきた ‒ WebやDAOなど全体的に奇麗になってきたので、余計に目立つ

54

Page 55: Jjug springセッション

これからSpringを使うには • ドメインモデリング重要

‒ 責務が明確で、分かり易く、変化に対応できるビジネスロジック • トランザクションスクリプトからドメインモデルへリファクタリングすることも、ひとつの手としはアリかも!?

• 例:トランザクション内に分散したValidationをエンティティに移動する

‒ Springが得意とするレイヤ間の疎結合は、その前提

‒ DDDは教材の1つとして有効

55

Page 56: Jjug springセッション

•  Spring 現状の問題と解決の術 •  Javaの方向性と生き残りの術(JavaOneから見えてきた)

56

Page 57: Jjug springセッション

Javaの目指すところ •  JavaOneで見えてきた、クラウドへの道

‒ Cloud Device+PaaS

57

Cloud

Page 58: Jjug springセッション

JavaEE •  JavaEE7

‒ 標準的なPaaSの提供を目指す • クラウド環境に対応した自動プロビジョニングや、多岐にわたる参加者の管理モデルも提唱

‒  JDK(Project Lambda) •  JDK8 2013年

‒ 使い易くなるキャッシュ機能(JCache 1.0) ‒ 既存のAPIにはマルチテナント対応の拡張(JPA2.1)

‒ コンポーネントの容易な組み合わせ(CDI 1.1)

58

PaaS

Page 59: Jjug springセッション

JDK8(Project Lambda) • 関数型の採用 • マルチコア対応

59

(int x, int y) -> x + y

() -> 42

(String s) -> { System.out.println(s); }

http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html

Page 60: Jjug springセッション

JCache •  分散環境でデータをキャッシュすることにより、アプリケーションの性能と拡張性を確保することができる

•  Cacheに大事なものをしまって、キーを与える ‒  CacheManager, CacheFactory

60

キャッシュ

APサーバ

データベース

Page 61: Jjug springセッション

Contexts and Dependency Injection • コンポーネントを簡単に組み合わせる仕組み ‒ 仕様の異なるコンポーネントを、組み合わせるのが大変だった • @Inject

‒ Web Beans • JBoss Seam

61

EJB JSF JPA

CDI

Page 62: Jjug springセッション

JPAのマルチテナント対応 •  SaaSの効率を高める仕組み

‒  マルチテナンシー(マルチテナントの性格をもつ)なアプリケーション

•  アノテーションと設定ファイルでテナントを使い分け ‒  @Multitenant、@TenantDiscriminatorColum

62

AP AP AP AP

Page 63: Jjug springセッション

GlassFish •  Java EEのリファレンス実装

‒  JavaEE7 → GlassFish4 ‒ 2013年第2四半期ころに登場予定 ‒ 他のAP Serverの対応状況は不明

63

3.1.2 4

2013 2012

Page 64: Jjug springセッション

Spring+αで十分 • Spring3.1 ‒ Cache(JCache) ‒ DIxAOP(CDI)

•  Scala ‒ 関数型(Lambda)

• Hibernate4 ‒ マルチテナンシー(JPA)

64

新SSH

Page 65: Jjug springセッション

まとめ

65

Page 66: Jjug springセッション

中心にはSpring • やっぱりまだまだSpring

66

Cloud

Spring

Java

Hight

Low

Page 67: Jjug springセッション

CM まだまだSpringだと思った貴方へ

67

Page 68: Jjug springセッション

JSUG勉強会 • 是非ご参加下さい

‒ 2ヶ月に1回あれば良い程度に開催 ‒ MLにてお知らせ

• http://groups.google.co.jp/group/jsug • 発表者求む!

‒ ご連絡ください:[email protected]

68

Page 69: Jjug springセッション

8月頃発売予定 •  Spring入門 3.1対応版(技術評論社)

69

Now Printing

Page 70: Jjug springセッション

BON VOYAGE!

70