spring frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

118
R1-7 [BOF] Spring Framework の今 (2013 年版 ) JJUG CCC Fall 2013 2013/11/0 9 俊明 (@making)

Upload: toshiaki-maki

Post on 10-May-2015

11.387 views

Category:

Technology


14 download

TRANSCRIPT

Page 1: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

R1-7 [BOF] Spring Frameworkの今

(2013年版)JJUG CCC Fall 2013

2013/11/09 槙 俊明 (@making)

Page 2: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

自己紹介• @making

• 大手SIerでR&D

• JJUG幹事

• 金魚本(http://amzn.to/JavaEE6)を一部翻訳

• http://blog.ik.am

• 公私ともにSpringユーザー

Page 3: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

[宣伝] はじめてのBootstrap• なぜか畑違いのBootstrap3入門の本書きました

• 11月末 工学社より出版(1900円)

Page 4: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Java EEも好きです!

http://www.slideshare.net/makingx

Page 5: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

今日のコンテンツ• Spring Frameworkとは

• 最近のSpring Ecosystemを紹介

• Spring 4の紹介

• Spring FrameworkによるWebアプリのアーキテクチャ

• Spring Framework or Java EE ?

Page 6: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

今日のコンテンツ前半:最新動向の話

後半:エンタープライズ寄りな話?

• Spring Frameworkとは

• 最近のSpring Ecosystemを紹介

• Spring 4の紹介

• Spring FrameworkによるWebアプリのアーキテクチャ

• Spring Framework or Java EE ?

Page 7: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Spring Frameworkとは

Page 8: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Spring Frameworkとは• Javaでエンタープライズ開発するためのオープンソースのフルスタックフレームワーク

• 2013年 開発元VMWare → Pivotalにスピンアウト

• 2013年 Springの象徴であるRob Jonsonが退社→TypeSafeへ

• 安定バージョンは現在3.2.5

Page 9: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Spring Frameworkとは• DI x AOPで注目され、重厚なJ2EEのアンチテーゼとして2004年に登場

!

!

• Web(MVC), DataAccess, Security, Batch, Integration, Mobile, …

• サブプロジェクトが増え、Java EEより肥大化?

Page 10: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Spring Frameworkとは

• (基本的な)後方互換性

• 一貫性、対称性のある設計ポリシーこれ重要!

Page 11: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

そしてVersion 4へ

•現在Spring4開発中

• 4.0.0.RC1公開

• Java8, Java EE 7サポート(WebSocket等)

Page 12: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Springは今も進化中

Page 13: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Pivotalとは

• 割愛

Page 14: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

http://spring.io

公式サイトが リニューアル!

Page 15: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

http://spring.io/guides

サンプルアプリ 学習コンテンツ 多数 (40件)!

Page 16: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

STSから簡単にサンプルを試せる

Page 17: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

基本的な内容は書籍で

http://bit.ly/Spring3Book

Page 18: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Spring Ecosystemの紹介

Page 19: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Spring Ecosystem

Web

Core

DataAccess Batch Enterprise Integration

Security

IDE

RAD Starter

Social

Spring MVC

Spring WebFlow

Spring Mobile

Spring Roo

Spring Data JPA

Spring DataMongoDB

Spring Boot

Spring Tool Suite (STS)

Spring SocialTwitter

Spring SocialFacebook

Spring SocialGithub

Big Data

Spring Data Rest

Spring Batch Spring Integration

Spring DI Spring AOP

Spring Security

Spring SecurityOAuth

Spring XD

Spring TX

Spring Hadoop

Page 20: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Spring Ecosystem

Web

Core

DataAccess Batch Enterprise Integration

Security

IDE

RAD Starter

Social

Spring MVC

Spring WebFlow

Spring Mobile

Spring Roo

Spring Data JPA

Spring DataMongoDB

Spring Boot

Spring Tool Suite (STS)

Spring SocialTwitter

Spring SocialFacebook

Spring SocialGithub

Big Data

Spring Data Rest

Spring Batch Spring Integration

Spring DI Spring AOP

Spring Security

Spring Security OAuth

Spring TX

今日のスコープ

Spring XD Spring Hadoop

Page 21: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

[参考] 公式のスタック図

Page 22: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

http://spring.io/docs

Page 23: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Spring DI x AOP

• 成熟度:★★★ version: 3.2.5.RELEASE

• Spring Ecosystemのコア

• JavaConfigサポート(@Configuration, @Bean)

• No XML hell!

• JSR-330サポート(@Inject, @Named)

Page 24: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

JSR-330によるDI コード例

package sample;import javax.inject.Inject;!public class MyApplication { @Inject GreetingService service; public void run(String message) { System.out.println(service.hello(message)); }}

package sample;import javax.inject.Named;!@Namedpublic class GreetingService { public String hello(String message) { return "Hello " + message + "!"; }}

Page 25: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

JSR-330によるDI コード例

デフォルトでscope=singleton になるので注意

public class EntryPoint { public static void main(String[] args) { try (GenericApplicationContext context = new AnnotationConfigApplicationContext( AppConfig.class);) { MyApplication app = context.getBean(MyApplication.class); app.run("World!"); } }}

@Configuration@ComponentScan(basePackages = "sample")public class AppConfig { @Bean MyApplication myApplication() { return new MyApplication(); }} Google Guiceよりも簡単!

Page 26: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Spring MVC•成熟度:★★★ version: 3.2.4.RELEASE

•アクションベースな簡易なMVC Webフレームワーク

•Strutsからの移行も容易

•アノテーションで簡単リクエストマッピング(JAX-RSとほとんど同じ)

•ControllerとViewが奇麗に分離されるので、色々な出力形式に対応

•RESTもサポート(@RequestBody, @ResponseBody)

•JavaConfigサポート(web.xmlもなくせる)

Page 27: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

@Service @Transactionalpublic class UserServiceImpl implements UserService { @Inject UserRepository userRepository;! @Override public List<User> findAll() { return userRepository.findAll(); }! @Override public void save(User user) { userRepository.save(user); }}

@Controller@RequestMapping("users")public class UserController { @Inject UserService userService;! @RequestMapping(value = "list", method = RequestMethod.GET) public String list(Model model) { List<User> users = userService.findAll(); model.addAttribute("users", users); return "users/list"; }}

コード例

Spring MVCの Controller

Page 28: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

コード例<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /></bean>

<table> <tr> <th>Name</th><th>Email</th> </tr> <c:forEach items="${users}" var="user"> <tr> <td><c:out value="${user.name}"></c:out></td> <td><c:out value="${user.email}"></c:out></td> </tr> </c:forEach></table>

XMLの例を出したが、 JavaConfigでも書ける

Page 29: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

コード例(REST版)@Controller @RequestMapping("users")public class UserRestController { @Inject UserService userService;! @RequestMapping(method = RequestMethod.GET) @ResponseBody public List<User> getUsers() { return userService.findAll(); }! @RequestMapping(method = RequestMethod.POST) @ResponseBody public ResponseEntity<User> postUsers(@RequestBody User user) { userService.save(user); return new ResponseEntity<User>(user, HttpStatus.CREATED); }! @RequestMapping(value = "/{id}", method = RequestMethod.GET) @ResponseBody public User getUser(@PathVariable("id") Integer id) { return userService.findOne(id); }}

Page 30: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

実行結果

Page 31: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

いろいろなViewに対応• Tiles, FreeMarker, Velocityなどの老舗テンプレートエンジンから最近人気のものまで各種取り揃えております。

• ThymeLeaf (ThymeLeafViewResolver)

• Mustache (MustacheViewResolver)

• Handlebars (HandlebarsViewResolver)

• Scalate (ScalateViewResolver)

Page 32: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

ThymeLeaf

<table> <tr> <th>Name</th> <th>Email</th> </tr> <tr th:each="user : ${users}"> <td th:text="${user.name}">John</td> <td th:text="${user.email}">[email protected]</td> </tr></table>

<bean class="org.thymeleaf.spring3.view.ThymeleafViewResolver"> <property name="templateEngine" ref="templateEngine" /></bean>!<bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine"> <property name="templateResolver" ref="templateResolver" /></bean>!<bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver"> <property name="prefix" value="/WEB-INF/templates/" /> <property name="suffix" value=".html" /> <property name="templateMode" value="HTML5" /></bean>

http://www.thymeleaf.org/

Page 33: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Mustache

<table> <tr> <th>Name</th> <th>Email</th> </tr> {{#users}} <tr> <td>{{name}}</td> <td>{{email}}</td> </tr> {{/users}}</table>

<bean class="org.springframework.web.servlet.view.mustache.MustacheViewResolver"> <property name="prefix" value="/WEB-INF/templates/" /> <property name="suffix" value=".html" /> <property name="templateLoader"> <bean class="org.springframework.web.servlet.view.mustache.MustacheTemplateLoader" /> </property></bean>

http://mustache.github.io/

Page 34: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Handlebars

<bean class="com.github.jknack.handlebars.springmvc.HandlebarsViewResolver"> <property name="prefix" value="/WEB-INF/templates/" /> <property name="suffix" value=".hbs" /></bean>

http://handlebarsjs.com/

<table> <tr> <th>Name</th> <th>Email</th> </tr> {{#users}} <tr> <td>{{name}}</td> <td>{{email}}</td> </tr> {{/users}}</table>

Page 35: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Spring Security•成熟度:★★★ version: 3.1.4.RELEASE

•設定ファイルベースの認証・認可フレームワーク

•カスタマイズ性も高い

•Form認証、Basic認証、JAAS認証、OpenID認証、LDAP認証、CAS認証・・・

•ユーザー情報は、DB、メモリ、設定ファイル・・・から

•URL認可、アノテーションでメソッド認可、JSPタグ認可

•パスワードエンコード

•SHA-2+ソルト+ストレッチのような汎用アルゴリズムだけでなくBCryptのようなパスワード用アルゴリズムもサポート(BCrypt推奨)

•3.2からJavaConfigサポート

Page 36: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

コード例

•割愛・・

Page 37: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Spring Security OAuth•成熟度:★☆☆ version: 1.0.5.RELEASE

•Spring SecurityにOAuth1, 2による認証・認可機能を追加

•OAuth Provider •grant_type=authorization_code,implicit,refresh_token,client_credentials, passwordの認証サーバーを設定ファイルのみで実現

•OAuth Client •REST Clientの拡張

Page 38: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

コード例

• 時間がないので略・・

ドキュメント http://projects.spring.io/spring-security-oauth/docs/oauth2.htmlサンプルアプリhttps://github.com/spring-projects/spring-security-oauth/tree/

master/samples/oauth2

Page 39: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Spring Data•成熟度:★★☆

•データアクセスの抽象化ライブラリ

•オブジェクトマッピング、Repository、Templateを提供

•いろいろなデータストアをサポートするサブプロジェクトからなる

•Spring Data Commons •Spring Data JPA •Spring Data MongoDB, Redis, Neo4j, REST, Hadoop, HBase, Solr, ...

•各データストアにRepositoryやTemplateを提供してBoilerplateをなくす

Page 40: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

従来のJPAプログラミング

毎回同じようなコード・・・→

@Entitypublic class Customer { @Id @GeneratedValue private Long id; private String firstname; private String lastname; // omitted…}

@Repositorypublic class CustomerRepository { @PersistenceContext EntityManager em; public Customer findOne(Long id) { return em.find(Customer.class, id); } public List<Customer> findAll(int page, int size) { TypedQuery<Customer> query = em .createQuery("SELECT x FROM Customer x", Customer.class) .setFirstResult(page * size).setMaxResults(size); return query.getResultList(); } @Transactional public Customer save(Customer customer) { if (customer.getId() == null) { em.persist(customer); return customer; } else { return em.merge(customer); } } public List<Customer> findByLastname(String lastname) { TypedQuery<Customer> query = em.createQuery( "SELECT x FROM Customer x WHERE x.lastname = :lastname", Customer.class).setParameter("lastname", lastname); return query.getResultList(); }}

Page 41: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Spring Data JPAを使うと・・

• たったこれだけ!

• CRUD系のメソッド、ページング・ソート処理は自動で実装される

• JPAプログラミングの簡素化!

import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.Query;import org.springframework.data.repository.query.Param;!public interface CustomerRepository extends JpaRepository<Customer, Long> { @Query("SELECT x FROM Customer x WHERE x.lastname = :lastname") public List<Customer> findByLastname(@Param("lastname") String lastname);}

Page 42: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Spring Data REST• 成熟度:★☆☆ version: 1.1.0.M1

• Spring DataのRepositoryをREST APIにエクスポート(@RestResource)

• 現在はSpringMVCのみサポートしていrが、将来的にはServlet非依存を目指している

• HypermediaLinkの作成

Page 43: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

コード例Repositoryにアノテーションをつけるだけで

REST APIとしてExportされる

Page 44: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

実行結果

Entityの情報だけでなく HypermediaLinkも出力される

Page 45: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Spring Boot•成熟度:☆☆☆ version: 0.5.0-M5

•Springアプリケーションを高速に開発して起動するためのプロジェクト?

•スタンドアローンでアプリケーションを起動できる(java -jar)

•サーバー組み込み。Traditionalなwar作成も可能

•Groovyも対応

•オススメ設定のautoconfigure群

•色々なpreconfiguredなJavaConfigが用意されており、特定の条件を満たすと読み込まれる

Page 46: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

コード例import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;!@Controller@EnableAutoConfigurationpublic class Application {! @RequestMapping("/") @ResponseBody String home() { return "HelloWorld!"; }! public static void main(String[] args) { SpringApplication.run(Application.class, args); }}

Page 47: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

速習 Spring Boot$ brew tap pivotal/tap $ brew install springboot $ which spring /usr/local/bin/spring $ spring run app.groovy

// app.groovy@Controllerclass Application { @RequestMapping("/") @ResponseBody def String hoge() { "HelloWorld!" }}

初回のみ for Macユーザー

ソースコード全文。import文不要

Page 48: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Spring 4

25分経過?

Page 49: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

4.0.0.RC1の新機能• Java 8サポート

• WebSocketサポート

• さらなるRESTサポート

Page 50: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Java 8サポート• Lamada式サポート

• JSR-310サポート(@DateTimeFormat)

Page 51: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Lambdaサポート@InjectJdbcTemplate jdbcTemplate;!public void foo() { User user = jdbcTemplate.queryForObject( "SELECT userId, userName from User", new RowMapper<User>() { public User mapRow(java.sql.ResultSet rs, int rowNum) throws java.sql.SQLException { return new User(rs.getLong(1), rs.getString(2)); } } ); }

Before

Page 52: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Lambdaサポート@InjectJdbcTemplate jdbcTemplate;!public void foo() { User user = jdbcTemplate.queryForObject( "SELECT userId, userName from User", new RowMapper<User>() { public User mapRow(java.sql.ResultSet rs, int rowNum) throws java.sql.SQLException { return new User(rs.getLong(1), rs.getString(2)); } } ); }

Before

After

Page 53: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Lambdaサポート@InjectJdbcTemplate jdbcTemplate;!public void foo() { User user = jdbcTemplate.queryForObject( "SELECT userId, userName from User", new RowMapper<User>() { public User mapRow(java.sql.ResultSet rs, int rowNum) throws java.sql.SQLException { return new User(rs.getLong(1), rs.getString(2)); } } ); }

Before

After

Page 54: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Lambdaサポート@InjectJdbcTemplate jdbcTemplate;!public void foo() { User user = jdbcTemplate.queryForObject( "SELECT userId, userName from User", new RowMapper<User>() { public User mapRow(java.sql.ResultSet rs, int rowNum) throws java.sql.SQLException { return new User(rs.getLong(1), rs.getString(2)); } } ); }

Before

After

SpringにはTemplateパターン+コールバックな機能が多いのでラムダ式の恩恵が大きい!

Page 55: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

JSR-310サポート

Page 56: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

WebSocketサポート• JSR-356

• Java EE 7に取り込まれる!

•先日Tomcat7も対応しました(7.0.47)

•今日ハンズオンもありましたね

Page 57: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

JSR-356

import javax.websocket.OnMessage;import javax.websocket.server.ServerEndpoint;!@ServerEndpoint("/echo")public class EchoEndpoint {! @OnMessage public String echoText(String name) { return name; }}

Page 58: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

JSR-356

import javax.websocket.OnMessage;import javax.websocket.server.ServerEndpoint;!@ServerEndpoint("/echo")public class EchoEndpoint {! @OnMessage public String echoText(String name) { return name; }} 一見簡単そう

Page 59: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

だがしかし• Rossen Stoyanchev氏(Spring MVCのメイン開発者)曰く

• http://rstoyanchev.github.io/s2gx2013-intro-websocket-spring-framework-4/

• http://rstoyanchev.github.io/s2gx2013-websocket-browser-apps-with-spring

Page 60: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

http://rstoyanchev.github.io/s2gx2013-intro-websocket-spring-framework-4/#29

Page 61: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

http://rstoyanchev.github.io/s2gx2013-intro-websocket-spring-framework-4/#30

Page 62: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

SpringによるWebSocket対応

• JSR-356だけじゃなく、Tomcat、Jetty独自実装にも対応

• WebSocketだけでなくレガシーブラウザでもfallbackできるようにSockJSに対応

• ハイレベルなメッセージング仕様のSTOMPに対応Simple Text Oriented Message Protocol

http://stomp.github.io/

Page 63: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Simpleな例(JSR-356版)

import javax.inject.Inject;import javax.websocket.OnMessage;import javax.websocket.server.ServerEndpoint;!import org.springframework.web.socket.server.endpoint.SpringConfigurator;!@ServerEndpoint(value = "/echo", configurator = SpringConfigurator.class)public class EchoEndpoint { @Inject EchoService echoService;! @OnMessage public String echoText(String name) { return echoService.getMessage(name); }}

Page 64: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Simpleな例(JSR-356版)

import javax.inject.Inject;import javax.websocket.OnMessage;import javax.websocket.server.ServerEndpoint;!import org.springframework.web.socket.server.endpoint.SpringConfigurator;!@ServerEndpoint(value = "/echo", configurator = SpringConfigurator.class)public class EchoEndpoint { @Inject EchoService echoService;! @OnMessage public String echoText(String name) { return echoService.getMessage(name); }}

JSR-356の拡張ポイント (Tomcatでも動く!)

Page 65: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Simpleな例(JSR-356非依存版)

import org.springframework.web.socket.TextMessage;import org.springframework.web.socket.WebSocketSession;import org.springframework.web.socket.adapter.TextWebSocketHandlerAdapter;!public class EchoWebSocketHandler extends TextWebSocketHandlerAdapter {! @Inject private EchoService echoService;! @Override public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { String echoMessage = echoService.getMessage(message.getPayload()); session.sendMessage(new TextMessage(echoMessage)); }}

Page 66: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Simpleな例(JSR-356非依存版)の設定ファイル

@Configuration@EnableWebMvc@EnableWebSocketpublic class WebConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(echoWebSocketHandler(), "/echo"); // ... } @Bean public WebSocketHandler echoWebSocketHandler() { return new EchoWebSocketHandler(); } // ...}

Page 67: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Simpleな例(JSR-356非依存版)の設定ファイル

@Configuration@EnableWebMvc@EnableWebSocketpublic class WebConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(echoWebSocketHandler(), "/echo"); // ... } @Bean public WebSocketHandler echoWebSocketHandler() { return new PerConnectionWebSocketHandler(EchoWebSocketHandler.class); } // ...} Decorationパターンを使える

Page 68: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

SockJSサポート

@Configuration@EnableWebMvc@EnableWebSocketpublic class WebConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(echoWebSocketHandler(), "/echo").withSockJS(); // ... } @Bean public WebSocketHandler echoWebSocketHandler() { return new EchoWebSocketHandler(); } // ...}

ちょい足し

Page 69: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

SockJSクライアントvar ws = new SockJS("ws://localhost:8080/echo");!ws.onopen = function (event) { // ...};!ws.onmessage = function (event) { // ...};!ws.onclose = function (event) { // ...};

Page 70: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

STOMP• WebSocket上のメッセージングプロトコル

Destination

Body

Command

Page 71: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

STOMP対応

import org.springframework.messaging.handler.annotation.MessageMapping;import org.springframework.messaging.handler.annotation.SendTo;import org.springframework.stereotype.Controller;!@Controllerpublic class GreetingController {! @MessageMapping("/greeting") @SendTo("/topic/greetings") public String greet(String greeting) { return "[" + new Date().getTime() + "]: " + greeting; }}

Page 72: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

普通のHTTPからのpushできるimport javax.inject.Inject;!import org.springframework.messaging.simp.SimpMessagingTemplate;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;!@Controllerpublic class GreetingController { @Inject SimpMessagingTemplate template;! @RequestMapping(value = "/greeting", method = RequestMethod.POST) public void greet(String greeting) { String text = "[" + new Date().getTime() + "]: " + greeting; template.convertAndSend("/topic/greeting", text); }}

Page 73: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

HTTP用処理とSTOMP用処理の共存

import org.springframework.messaging.handler.annotation.MessageMapping;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;!@Controllerpublic class GreetingController {! @RequestMapping(value = "/greeting", method = RequestMethod.POST) public void httpGreet(String text) { // HTTP用の処理 }! @MessageMapping(value = "/greeting") public void stompGreet(String text) { // STOMP用の処理 }}

Page 74: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

HTTP用処理とSTOMP用処理の共存

import org.springframework.messaging.handler.annotation.MessageMapping;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;!@Controllerpublic class GreetingController {! @RequestMapping(value = "/greeting", method = RequestMethod.POST) public void httpGreet(String text) { // HTTP用の処理 }! @MessageMapping(value = "/greeting") public void stompGreet(String text) { // STOMP用の処理 }}

WebSocketにもSpring MVCが使える

@RequestMappingから想起しやすい

Page 75: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Springの良いところ

• WebSocketにもSpring MVCが使える

• → 一貫性のある設計

• @RequestMappingから想起しやすい

• → 対称性のある設計

Page 76: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

続きはWebで!

http://rstoyanchev.github.io/s2gx2013-websocket-browser-apps-with-spring

Page 77: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

サンプル• https://github.com/rstoyanchev/spring-websocket-

portfolio

http://assets.spring.io/wp/WebSocketBlogPost.html

Page 78: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

さらなるRESTサポート

• @RestController

• AsyncRestTemplate

• Hypermedia Link

Page 79: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

今後は• JMS 2.0

• JTA 1.2

• JPA 2.1

• Bean Validation 1.1

• JSR-236 Concurrency Utilities

• JSR-107 JCache

• をサポートする予定!

Page 80: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Spring Frameworkによる Webアプリのアーキテクチャ

35分経過?

Page 81: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Springによる伝統的なWebアプリ

Spring MVC

Spring Security

Browser/Client

UI & Presentation Layer

Service Layer Persistence Layer

DB

Spring (Tx) Spring Data JPA

JPA

Spring DI x AOP

Bean Validation

Page 82: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

最近のWebアプリ

Spring MVC Spring Spring Data JPA

Spring DI x AOP

JPABean Validation

Page 83: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

最近のWebアプリ

Spring MVC

JavaScript Framework (Backbone.js, Angular.js, Knockout.js, …)

Spring Spring Data JPAJPA

Router

View

Template

Model/Collection

REST API

Spring DI x AOP

Bean Validation

Page 84: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

最近のWebアプリ

Spring MVC

JavaScript Framework (Backbone.js, Angular.js, Knockout.js, …)

Spring Spring Data JPAJPA

Router

View

Template

Model/Collection

REST API

Spring DI x AOP

Rich化するクライアントサイド

Bean Validation

Thin化するサーバーサイド

Page 85: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Webアプリの雛形を使ってQuick Start

• http://bit.ly/SpringTemplate

• STSのproject template機能でアプリの雛形生成

• Spring MVC + Spring Data JPA + Spring Security + Bootstrap3を使用したCRUDアプリが1分でできます(※ダウンロード時間除く)

Page 86: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
Page 87: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
Page 88: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
Page 89: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

STS 3.3.0まででしか動かなかった・・

• 最新のSTS 3.4.0ではTemplateを作れません

• うちに帰ってMaven Archetype作ります・・・

Page 90: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Spring Framework or Java EE

40分経過?

Page 91: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Springによる伝統的なWebアプリ

Spring MVC

Spring Security

Browser/Client

UI & Presentation Layer

Service Layer Persistence Layer

DB

Spring (Tx) Spring Data JPA

JPA

Spring DI x AOP

Bean Validation

Page 92: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Java EEによる伝統的なWebアプリ

JSF

Apache Shiro?

Browser/Client

UI & Presentation Layer

Service Layer Persistence Layer

DB

EJB JPA

CDI and DI (JSR 299, 330)

JAX-RS

Bean Validation

Page 93: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Springによる最近のWebアプリ

Spring MVC

JavaScript Framework (Backbone.js, Angular.js, Knockout.js, …)

Spring Spring Data JPAJPA

Router

View

Template

Model/Collection

REST API

Spring DI x AOP

Bean Validation

Page 94: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

ちなみに・・・• http://blog.ik.am ぼくのブログもこのアーキテクチャ

Browser

BackBone.js

http://blog.ik.am/#/entries/193 参照

Spring MVC

REST API GET /entries/xxx

{“entry_id”:”xxx”,”content”:”Hello”}

Page 95: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Java EEによる最近のWebアプリ

JAX-RS

JavaScript Framework (Backbone.js, Angular.js, Knockout.js, …)

EJB JPA

Router

View

Template

Model/Collection

REST API

CDI and DI (JSR 299, 330)

Bean Validation

Page 96: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Java EEによる最近のWebアプリ

JAX-RS

JavaScript Framework (Backbone.js, Angular.js, Knockout.js, …)

EJB JPA

Router

View

Template

Model/Collection

REST API

CDI and DI (JSR 299, 330)

Bean Validation

Java EEでもできるんです

Page 97: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

アーキテクチャの違い

• Spring FrameworkでもJava EEでもアーキテクチャに大きな違いはない

• アーキテクチャ的にはどちらを選んでもよい

Page 98: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

アーキテクチャの違い

• Spring FrameworkでもJava EEでもアーキテクチャに大きな違いはない

• アーキテクチャ的にはどちらを選んでもよい → Java標準に従った方が良い?

Page 99: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

既存Springユーザーはどうするか?

•いつJava EEに移行するの?

Page 100: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

いつやるの?

Page 101: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

いつやるの?

•今でじゃない

Page 102: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

新規Javaユーザーは?

• 正直、Java EE 7で開発すれば良いかな、と思う。

Page 103: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

新規Javaユーザーは?

• 正直、Java EE 7で開発すれば良いかな、と思う。

OracleによるGlassFish4の商用サポートは なくなったのでご注意ください!

Page 104: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

だれがこれからSpringを使う?• すでにSpring(古いバージョン)を利用しているユーザー

• Springに関するノウハウがあれば、技術の連続性を考えて、まだSpringを使い続けると良いと思う。

ただし、Springは新しいバージョン(3.2.x)で 正しい使い方をしましょう 単なるjarのupdateだけならNG

Page 105: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Springの不安• Pivotalが将来Springに対する投資を縮小したとしたら、Springを支えるエンジニアが離れ、開発が停滞するかもしれない。

こういう心配のあるかたはJava EEをオススメします!

Page 106: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Spring FrameworkからJava EEへ

• 今後のWebアプリケーションはThin Server化し、サーバーサイドはREST APIベースになっていく?

• Spring MVCでREST APIを開発するスタイルからJAX-RSで開発するスタイルへ移行していけばよい?

Page 107: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Spring FrameworkからJava EEへ

• もしくはJAX-RSの拡張仕様としてアクションベースのフレームワークがSpring MVCベースで策定されれば統一されるだろう・・(Springも徐々にJSR対応している)

• Bean Validation (JSR 303)

• DI (JSR 330)

• JBatch (JSR 352)

• WebSocket (JSR 356) など・・・

Page 108: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Java EEの課題• 1つ1つの仕様(JSF, JAX-RS, EJB, JPA, …)が独立・完結しているため、組み合わせる際に重複する機能が多い

• 新機能が発表されてから商用利用できるまでに時間がかかる

• 組み合わせのベストプラクティスがわかりにくい→ Spring Frameworkはベストプラクティス化が進んでいる(書籍や意味のあるサンプルなど)

Page 109: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Spring Framework or Java EE個人的まとめ

Javaを使っている

今Springを使って

いるSpring

の将来に不安なし

新しい機能を使いたい

Java EE Spring

Spring以外のJavaフレームワークにもあてはまるフロー

だと思う

YES

NO

Page 110: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

アーキテクチャ選定のアンチパターン• 中途半端なフレームワーク組み合わせ (Spring + JAX-RS(Jersey)など)

• コア(DI)にSpring Frameworkを採用するなら、Springで統一

• Java EEを選択するなら標準仕様で組み合わせるべき

• Bridge(連携ライブラリ)が存在すると、いくつかの問題が起こる

• 機能が制限される

• バージョンアップしづらくなる

• 学習コストが高い

Page 111: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
Page 112: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework
Page 113: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

まさかのSpring特需?

• 本発表で興味をもっていただけば幸いです

Page 114: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

Springを触ってみたいけど・・

• どこから始めれば良いかわからない・・・

• 日本語情報が少ない・・・

• 業務でつかえるの・・・?

Page 115: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

そんなあなたに耳寄りな情報!

Page 116: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

宣伝

•近日中(あと2人月くらい・・)にSpring Frameworkのベストプラクティスガイドライン(日本語、英語)をGithubで公開予定

Page 117: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

宣伝•業務でSpring Frameworkを使うためのノウハウを公開しちゃいます

•アプリケーションのレイヤー化と各レイヤーの実装方法

• DBアクセス

•入力チェック

•例外ハンドリング

•ロギング

•メッセージ管理

•ファイルアップロード

•・・・・ 多分公開する

Page 118: Spring Frameworkの今 (2013年版) #jjug_ccc #ccc_r17 #springframework

まとめ

• Springはまだまだ進化中

• Bootstrap3本がでたら買ってください!