SlideShare a Scribd company logo
Spring Framework
ふりかえりと4.3新機能
木村 俊介 @kimullaa
1
自己紹介
名前: 木村 俊介(きむら しゅんすけ)
仕事: SI企業の技術部隊@2013
フレームワーク整備と展開、PJ支援
2年前までは Struts + EJB + iBatis ベースの自社FW
現在は Spring + MyBatis を社内に推進、展開
Spring歴: 2年くらい
2
今日のテーマ
基礎をふりかえりながら、
Spring Framework 4.3 の新機能をご紹介
『Modern Java Component Design with Spring Framework 4.3』
- モダンなSpringの使い方と新機能の説明
- スライド
- 動画
『Spring MVC 4 Web Apps』
- WEB機能(Spring MVC)に絞った新機能の説明
- スライド
- 動画まだ上がってません
Juergen Hoeller
Rossen Stoyanchev
3
既に話しつくされたネタ感
@Shimizuさんの日本語解説ブログ
http://qiita.com/kazuki43zoo/items/172d132ff8f4ba098888#core-
container-improvements
JSUG勉強会 2016年その4 Spring I/O報告会 池谷さんの発表
http://ikeyat.github.io/slides-
publish/slides/201606XX_SpringIO2016Summary/#1
JJUG CCC 2016 Spring @makingさんの発表
http://sssslide.com/www.slideshare.net/makingx/jjugccc-cccgh5-whats-
new-in-spring-framework-43-boot-14-pivotals-cloud-native-approach
Spring Framework リファレンス
http://docs.spring.io/spring/docs/current/spring-framework-
reference/html/new-in-4.3.html
4
でもやります
5
知ってる人は知っている
6
知らない人は覚えてね
7
Spring Framework
ふりかえり
8
DIコンテナ
Dependency Injection
Beanの登録
- Java Config
- アノテーションベース
- XMLベース
Bean BeanBean
Bean Bean
lookup
 依存性の解決
 メリット: テスタビリティ向上、ライフサイクル管理
9
Aspect Oriented Programming
AOP
AOP
クラスA クラスB
 横断的関心事の分離
 メリット:コード量削減、見通しのよいコード
ログ出力、Tx管理
10
で、こうなる
11
Java Config +
アノテーションベース
@Configuration // Java Configの宣言
@Profile(“standalone”) // standaloneプロファイル時に有効になる
@EnableTransactionManagement // SpringによるTx管理を有効化
@ComponentScan(“com.example”) // スキャン&Bean登録
public class AppConfig {
@Bean // Bean定義
public FooService fooService() {
// CGLibでUtilityのインスタンスは1度しか生成されない
return new FooServiceImpl(utility());
}
@Bean // Bean定義
public Utility utility() {return new Utility();}
}
~4.2
12
@Configuration
public class AppConfig implements FooAppConfig {
…
// デフォルトメソッドのBean定義が有効になる
}
public interface FooAppConfig {
@Bean
default FooService fooService() {
return new FooServiceImpl();
}
}
~4.2
13
Java Config & Java8
@Component class
@Service // ComponentScan時にBean登録される
@Lazy // Lazy-load(利用時にインスタンス化)
public class FooServiceImpl implements FooService {
private final FooRepository fooRepository;
@Autowired // コンストラクタインジェクション
public FooServiceImpl(FooRepository fooRepository) {
this. fooRepository = fooRepository;
}
@Transactional // AOPでトランザクション管理
public void update() {
…
}
~4.2
14
Lazy Injection Points
@Bean @Lazy
public FooRepository fooRepository () {
return new FooRepositoryImpl();
}
@Service
public class FooServiceImpl implements FooService {
private final FooRepository fooRepository ;
@Autowired // 依存先のBeanに関係なく@Lazyを有効化できる
public FooServiceImpl(@Lazy FooRepository fooRepository ) {
this. fooRepository = fooRepository ;
}
}
~4.2
15
合成アノテーション
@Service
@Scope(“session”)
@Primary
@Transactional(rollbackFor = Exception.class, timeout = 30)
public @interface MyCustomService {}
@MyCustomService
public class FooServiceImpl implements FooService {
…
}
 アノテーションを組み合わせられる
~4.2
16
合成アノテーション 属性の上書き
@Service
@Scope(“session”)
@Primary
@Transactional(rollbackFor = Exception.class, timeout = 30)
public @interface MyCustomService {
@AliasFor(annotation = Transactional.class, attribute = “readOnly”)
boolean readOnly() default false;
}
@MyCustomService(readOnly=false)
public class FooServiceImpl implements FooService { … }
 上書きしたい属性だけ公開できる
~4.2
17
Spring Framework 4.3
18
Spring Framework 4.3
 4系のラストリリース(リリース済み)
 2019年までサポート
 SpringBoot 1.4 のデフォルト
『SpringOne Platform 2016 keynote』より引用
19
Spring Framework 4.3 改善点
 Core Container Improvements
 Web Improvements
 Data Access Improvements
 Caching Improvements
 JMS Improvements
 WebSocket Messaging Improvements
 Testing Improvements
今日話すことは
この中の一部
20
Core Container
Improvements
21
1. 暗黙的なコンストラクタ
インジェクション
@RestController
public class Foo {
private final HogeService hogeService;
private final FugaService fugaService;
// @Autowired
public Foo(HogeService hogeService, FugaService fugaService) {
this.hogeService = hogeService;
this.fugaService = fugaService;
}
4.3
コンストラクタが1つなら
省略可能
22
2. Java Config クラスで
コンストラクタインジェクション
@Configuration
public class AppConfig {
private final Utility utility;
// @Autowired が書けるようになった(けど省略可能)
public AppConfig(Utility utility) {
this.utility = utility;
}
@Bean
public FooService fooService() {
return new FooServiceImpl(this.utility);
}
}
4.3
23
3. InjectionPoint like CDI
『http://sssslide.com/www.slideshare.net/makingx/jjugccc-cccgh5-whats-new-in-spring-
framework-43-boot-14-pivotals-cloud-native-approach』より引用
4.3
4.3
24
活用例. Loggerの生成
public class HelloController {
@Autowired
private Logger logger; //= LoggerFactory.getLogger(HelloController.class)
public void log(){
// … com.example.controllers.HelloController : hello と表示される
logger.info(“hello”);
}
}
@Configuration
public class AppConfig {
@Bean @Scope(value="prototype“, proxyMode = ScopedProxyMode.NO)
Logger getLogger(InjectionPoint ip ) {
return LoggerFactory.getLogger(
ip.getMember().getDeclaringClass().getName()); }
}
4.3
proxyModeがNOなので、
自身のスコープよりも広いBeanにインジェクト
されると、依存先のスコープになる
(CDIの@Dependentみたいなスコープ)
25
@RestController
@Slf4j
public class HelloController {
// Logger log = LoggerFactory.getLogger(HelloController.class);
public void log(){
// … com.example.controllers.HelloController : hello と表示される
log.info(“hello”);
}
}
4.3
コンパイル時に暗黙的に生成される
ただ、lombokはもっとすごい
詳細は TERASOLUNA Server Framework を参照
http://terasolunaorg.github.io/guideline/5.2.0.RELEASE/ja/Appendix/Lombok
.html#lombokhowtouselogger
26
4. Generics-based Injection
@Service
public class HogeServiceImpl implements HogeService {
@Resource(name = “listFoo”) private List<Foo> listFoo;
@Resource(name = “listBar”) private List<Bar> listBar;
}
@Configuration
public class AppConfig {
@Bean(name = “listFoo”)
public List<Foo> fooList(){…}
@Bean(name = “listBar”)
public List<Bar> fooList(){…}
}
型ではなく名前で解決
@Autowired ではなく @Resource
http://docs.spring.io/spring/docs/4.2.7.RELEASE/spring-framework-reference/htmlsingle/#beans-
autowired-annotation-qualifiers
~4.2
27
4. Generics-based Injection
@Service
public class HogeServiceImpl implements HogeService {
@Autowired List<Foo> listFoo;
@Autowired List<Bar> listBar;
}
@Configuration
public class AppConfig {
@Bean
public List<Foo> fooList(){…}
@Bean
public List<Bar> barList(){…}
}
4.3
型で解決
28
Web Improvements
29
 @GetMapping
 @PostMapping
 @PutMapping
 @DeleteMapping
 @PatchMapping
 @OptionsMapping
 @HeadMapping
1. @RequestMapping
の合成アノテーション
理由はあとで
30
@GetMappingの例
@RequestMapping(value = “hello” , method = RequestMethod.GET)
public String hello(){ … }
@GetMapping(value = “hello”)
public String hello(){ … }
4.3
可読性があがった
タイプ数が減った
~4.2
31
2. HEAD, OPTIONS の自動サポート
$ curl -i -X OPTIONS http://localhost:8080/hello
HTTP/1.1 200
X-Application-Context: application
Allow: GET,HEAD
Content-Length: 0
Date: Sun, 28 Aug 2016 07:32:23 GMT
$ curl -i --head http://localhost:8080/hello
HTTP/1.1 200
X-Application-Context: application
Content-Type: text/plain;charset=UTF-8
Content-Length: 4
Date: Sun, 28 Aug 2016 07:40:25 GMT
Allowヘッダに対応可能なHTTPメソッド
が列挙される。
Controllerのメソッドは実行されない。
GETメソッドと同じ。
ただしレスポンスボディは空
Controllerのメソッドが実行される。
GET付与でHEADとOPTIONSが自動サポート
定義方法は@RequestMappingでも@GetMappingでもok
32
3. Webスコープに関する
@Scopeの合成アノテーション
 @RequestScope
 @SessionScope
 @ApplicationScope
スコープ 内容
prototype Bean参照ごとに毎回生成
request HTTPのリクエストごとに生成
session ユーザセッションごとに生成
singleton ApplicationContextごとに生成
application ServletContextごとに生成
広い
狭い
33
@RequestScope の例
@Component
@Scope(scopeName = “request”, proxyMode = TARGET_CLASS)
public class Foo { … }
@Component
@RequestScope
public class Foo { … }
4.3
可読性があがった
タイプ数が減った
~4.2
34
他のスコープを作ってみる
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Scope("prototype")
public @interface PrototypeScope {
@AliasFor(annotation = Scope.class)
ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS;
}
@Component
@PrototypeScope
public class Foo { … }
重要なのはここだけ
合成アノテーションは簡単
35
4. @RestControllerAdvice
@ControllerAdvice
public class GlobalHandler {
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public Foo handle(){…}
@RestControllerAdvice
public class GlobalHandler {
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
// @ResponseBodyが不要
public Foo handle(){…}
4.3
@ControllerAdvice + @ResponseBody
~4.2
36
5. @RequestAttribute
@RequestMapping(value = “foo”, method = RequestMethod.GET)
public String foo(HttpServletRequest request) {
String param1 = (String) request.getAttribute(“param1”);
… }
@RequestMapping(value = “foo”, method = RequestMethod.GET)
public String foo(@RequestAttribute(“param1”) String param1){…}
4.3
Servlet API に依存せずに取得できる
~4.2
37
6. @SessionAttribute
@RequestMapping(value = “foo”, method = RequestMethod.GET)
public String foo(HttpSession httpSession) {
String param1 = (String) httpSession.getAttribute(“param1”);
… }
@RequestMapping(value = “foo”, method = RequestMethod.GET)
public String foo(@SessionAttribute(“param1”) String param1){…}
4.3
Servlet API に依存せずに取得できる
~4.2
38
7. @ModelAttribute(binding = false)
@ModelAttribute
public Book setUpBook() {
// おすすめの本の取得
return new Book(“spring”);
}
@PostMapping(“purchase”)
public void purchase (BookForm form,
@ModelAttribute(binding = false) Book book) {
…
}
4.3
 リクエストパラメータのバインドを抑制する
リクエストパラメータが
バインドされる(titleはjavaee)
リクエストパラメータをバインドせずに
Modelの値を取得する(titleはspring)
curl –X POST localhost:8080/purchase?title=javaee
Bookクラス、BookFormクラスは
titleフィールドを持つとする
39
おわりに
40
詳細はここ
@Shimizuさんの日本語解説ブログ
http://qiita.com/kazuki43zoo/items/172d132ff8f4ba098888#core-
container-improvements
JSUG勉強会 2016年その4 Spring I/O報告会 池谷さんの発表
http://ikeyat.github.io/slides-
publish/slides/201606XX_SpringIO2016Summary/#1
JJUG CCC 2016 Spring @makingさんの発表
http://sssslide.com/www.slideshare.net/makingx/jjugccc-cccgh5-whats-
new-in-spring-framework-43-boot-14-pivotals-cloud-native-approach
Spring Framework リファレンス
http://docs.spring.io/spring/docs/current/spring-framework-
reference/html/new-in-4.3.html
41
42
Javaは、Oracle Corporation及びその子会社、
関連会社の米国及びその他の国における登録商標です。
TERASOLUNAはエヌ・ティ・ティ・データにおける登録商標です。
その他、記載されている会社名、商品名等は
各社の商標または登録商標である場合があります。
Ad

More Related Content

What's hot (20)

Spring fest2020 spring-security
Spring fest2020 spring-securitySpring fest2020 spring-security
Spring fest2020 spring-security
土岐 孝平
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
NTT DATA Technology & Innovation
 
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き
土岐 孝平
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
onozaty
 
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介がっつりMongoDB事例紹介
がっつりMongoDB事例紹介
Tetsutaro Watanabe
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
土岐 孝平
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
Yahoo!デベロッパーネットワーク
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
yoku0825
 
Javaエンジニアに知ってほしい、Springの教科書「TERASOLUNA」
Javaエンジニアに知ってほしい、Springの教科書「TERASOLUNA」Javaエンジニアに知ってほしい、Springの教科書「TERASOLUNA」
Javaエンジニアに知ってほしい、Springの教科書「TERASOLUNA」
apkiban
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
増田 亨
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
 
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTT DATA Technology & Innovation
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
Tetsutaro Watanabe
 
AWS Black Belt Tech シリーズ 2015 - Amazon Kinesis
AWS Black Belt Tech シリーズ 2015 - Amazon KinesisAWS Black Belt Tech シリーズ 2015 - Amazon Kinesis
AWS Black Belt Tech シリーズ 2015 - Amazon Kinesis
Amazon Web Services Japan
 
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリームC# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム
信之 岩永
 
バッチは地味だが役に立つ
バッチは地味だが役に立つバッチは地味だが役に立つ
バッチは地味だが役に立つ
apkiban
 
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
ssuser070fa9
 
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
Google Cloud Platform - Japan
 
Spring超入門-Springと出会ってから1年半-
Spring超入門-Springと出会ってから1年半-Spring超入門-Springと出会ってから1年半-
Spring超入門-Springと出会ってから1年半-
Ryosuke Uchitate
 
これから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーションこれから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーション
土岐 孝平
 
Spring fest2020 spring-security
Spring fest2020 spring-securitySpring fest2020 spring-security
Spring fest2020 spring-security
土岐 孝平
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
NTT DATA Technology & Innovation
 
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き
土岐 孝平
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
onozaty
 
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介がっつりMongoDB事例紹介
がっつりMongoDB事例紹介
Tetsutaro Watanabe
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
土岐 孝平
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
Yahoo!デベロッパーネットワーク
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
yoku0825
 
Javaエンジニアに知ってほしい、Springの教科書「TERASOLUNA」
Javaエンジニアに知ってほしい、Springの教科書「TERASOLUNA」Javaエンジニアに知ってほしい、Springの教科書「TERASOLUNA」
Javaエンジニアに知ってほしい、Springの教科書「TERASOLUNA」
apkiban
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
増田 亨
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
 
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTT DATA Technology & Innovation
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
Tetsutaro Watanabe
 
AWS Black Belt Tech シリーズ 2015 - Amazon Kinesis
AWS Black Belt Tech シリーズ 2015 - Amazon KinesisAWS Black Belt Tech シリーズ 2015 - Amazon Kinesis
AWS Black Belt Tech シリーズ 2015 - Amazon Kinesis
Amazon Web Services Japan
 
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリームC# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム
信之 岩永
 
バッチは地味だが役に立つ
バッチは地味だが役に立つバッチは地味だが役に立つ
バッチは地味だが役に立つ
apkiban
 
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
ssuser070fa9
 
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
Google Cloud Platform - Japan
 
Spring超入門-Springと出会ってから1年半-
Spring超入門-Springと出会ってから1年半-Spring超入門-Springと出会ってから1年半-
Spring超入門-Springと出会ってから1年半-
Ryosuke Uchitate
 
これから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーションこれから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーション
土岐 孝平
 

Viewers also liked (11)

Spring Security 4.1 の新機能
Spring Security 4.1 の新機能Spring Security 4.1 の新機能
Spring Security 4.1 の新機能
正和 井岡
 
20140212 develove テスト自動化のアプローチ拡張トレンド 〜Excel項目定義手動テストから自動テストへ〜
20140212 develove テスト自動化のアプローチ拡張トレンド 〜Excel項目定義手動テストから自動テストへ〜20140212 develove テスト自動化のアプローチ拡張トレンド 〜Excel項目定義手動テストから自動テストへ〜
20140212 develove テスト自動化のアプローチ拡張トレンド 〜Excel項目定義手動テストから自動テストへ〜
Fukui Osamu
 
Spring Framework 4.3から5.0へ
Spring Framework 4.3から5.0へSpring Framework 4.3から5.0へ
Spring Framework 4.3から5.0へ
movmov
 
Spring Day 2016 springの現在過去未来
Spring Day 2016 springの現在過去未来Spring Day 2016 springの現在過去未来
Spring Day 2016 springの現在過去未来
Yuichi Hasegawa
 
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
Yuichi Hasegawa
 
Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解
都元ダイスケ Miyamoto
 
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...
Data Microservices with Spring Cloud Stream, Task,  and Data Flow #jsug #spri...Data Microservices with Spring Cloud Stream, Task,  and Data Flow #jsug #spri...
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...
Toshiaki Maki
 
Spring bootで学ぶ初めてのwebアプリ開発
Spring bootで学ぶ初めてのwebアプリ開発Spring bootで学ぶ初めてのwebアプリ開発
Spring bootで学ぶ初めてのwebアプリ開発
terahide
 
Java8移行から始めた技術的負債との戦い(jjug ccc 2015 fall)
Java8移行から始めた技術的負債との戦い(jjug ccc 2015 fall)Java8移行から始めた技術的負債との戦い(jjug ccc 2015 fall)
Java8移行から始めた技術的負債との戦い(jjug ccc 2015 fall)
sogdice
 
Lineにおけるspring frameworkの活用
Lineにおけるspring frameworkの活用Lineにおけるspring frameworkの活用
Lineにおけるspring frameworkの活用
Tokuhiro Matsuno
 
Spring 5に備えるリアクティブプログラミング入門
Spring 5に備えるリアクティブプログラミング入門Spring 5に備えるリアクティブプログラミング入門
Spring 5に備えるリアクティブプログラミング入門
Takuya Iwatsuka
 
Spring Security 4.1 の新機能
Spring Security 4.1 の新機能Spring Security 4.1 の新機能
Spring Security 4.1 の新機能
正和 井岡
 
20140212 develove テスト自動化のアプローチ拡張トレンド 〜Excel項目定義手動テストから自動テストへ〜
20140212 develove テスト自動化のアプローチ拡張トレンド 〜Excel項目定義手動テストから自動テストへ〜20140212 develove テスト自動化のアプローチ拡張トレンド 〜Excel項目定義手動テストから自動テストへ〜
20140212 develove テスト自動化のアプローチ拡張トレンド 〜Excel項目定義手動テストから自動テストへ〜
Fukui Osamu
 
Spring Framework 4.3から5.0へ
Spring Framework 4.3から5.0へSpring Framework 4.3から5.0へ
Spring Framework 4.3から5.0へ
movmov
 
Spring Day 2016 springの現在過去未来
Spring Day 2016 springの現在過去未来Spring Day 2016 springの現在過去未来
Spring Day 2016 springの現在過去未来
Yuichi Hasegawa
 
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
Yuichi Hasegawa
 
Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解
都元ダイスケ Miyamoto
 
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...
Data Microservices with Spring Cloud Stream, Task,  and Data Flow #jsug #spri...Data Microservices with Spring Cloud Stream, Task,  and Data Flow #jsug #spri...
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...
Toshiaki Maki
 
Spring bootで学ぶ初めてのwebアプリ開発
Spring bootで学ぶ初めてのwebアプリ開発Spring bootで学ぶ初めてのwebアプリ開発
Spring bootで学ぶ初めてのwebアプリ開発
terahide
 
Java8移行から始めた技術的負債との戦い(jjug ccc 2015 fall)
Java8移行から始めた技術的負債との戦い(jjug ccc 2015 fall)Java8移行から始めた技術的負債との戦い(jjug ccc 2015 fall)
Java8移行から始めた技術的負債との戦い(jjug ccc 2015 fall)
sogdice
 
Lineにおけるspring frameworkの活用
Lineにおけるspring frameworkの活用Lineにおけるspring frameworkの活用
Lineにおけるspring frameworkの活用
Tokuhiro Matsuno
 
Spring 5に備えるリアクティブプログラミング入門
Spring 5に備えるリアクティブプログラミング入門Spring 5に備えるリアクティブプログラミング入門
Spring 5に備えるリアクティブプログラミング入門
Takuya Iwatsuka
 
Ad

Similar to Spring Framework ふりかえりと4.3新機能 (20)

FuelPHP Osu Nagoya vol.1
FuelPHP Osu Nagoya vol.1FuelPHP Osu Nagoya vol.1
FuelPHP Osu Nagoya vol.1
Fumito Mizuno
 
Struts2を始めよう!
Struts2を始めよう!Struts2を始めよう!
Struts2を始めよう!
Shinpei Ohtani
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
ThinReports
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
kenjis
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
Akio Katayama
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
Akio Katayama
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
Y Watanabe
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
kenjis
 
Spring Integration 超入門
Spring Integration 超入門Spring Integration 超入門
Spring Integration 超入門
Yasutaka Sugamura
 
Cakephp勉強会@tokyo #4
Cakephp勉強会@tokyo #4Cakephp勉強会@tokyo #4
Cakephp勉強会@tokyo #4
ichikaway
 
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」
Junichiro Kazama
 
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
Nobuhiro Sue
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
Ayumu Kawaguchi
 
Spring integration概要
Spring integration概要Spring integration概要
Spring integration概要
kuroiwa
 
MTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティング
MTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティングMTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティング
MTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティング
純生 野田
 
SharePoint Framework をはじめよう #spfx
SharePoint Framework をはじめよう #spfxSharePoint Framework をはじめよう #spfx
SharePoint Framework をはじめよう #spfx
Hirofumi Ota
 
Laravel5を使って開発してみた
Laravel5を使って開発してみたLaravel5を使って開発してみた
Laravel5を使って開発してみた
Takeo Noda
 
Webシステム脆弱性LT資料
Webシステム脆弱性LT資料Webシステム脆弱性LT資料
Webシステム脆弱性LT資料
Tomohito Adachi
 
Azure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターンAzure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターン
Kazuyuki Miyake
 
FuelPHP Osu Nagoya vol.1
FuelPHP Osu Nagoya vol.1FuelPHP Osu Nagoya vol.1
FuelPHP Osu Nagoya vol.1
Fumito Mizuno
 
Struts2を始めよう!
Struts2を始めよう!Struts2を始めよう!
Struts2を始めよう!
Shinpei Ohtani
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
ThinReports
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
kenjis
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
Akio Katayama
 
FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -FxUG in Toyama - ASphalt2 container -
FxUG in Toyama - ASphalt2 container -
Akio Katayama
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
Y Watanabe
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
kenjis
 
Spring Integration 超入門
Spring Integration 超入門Spring Integration 超入門
Spring Integration 超入門
Yasutaka Sugamura
 
Cakephp勉強会@tokyo #4
Cakephp勉強会@tokyo #4Cakephp勉強会@tokyo #4
Cakephp勉強会@tokyo #4
ichikaway
 
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」
Junichiro Kazama
 
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
Nobuhiro Sue
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
Ayumu Kawaguchi
 
Spring integration概要
Spring integration概要Spring integration概要
Spring integration概要
kuroiwa
 
MTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティング
MTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティングMTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティング
MTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティング
純生 野田
 
SharePoint Framework をはじめよう #spfx
SharePoint Framework をはじめよう #spfxSharePoint Framework をはじめよう #spfx
SharePoint Framework をはじめよう #spfx
Hirofumi Ota
 
Laravel5を使って開発してみた
Laravel5を使って開発してみたLaravel5を使って開発してみた
Laravel5を使って開発してみた
Takeo Noda
 
Webシステム脆弱性LT資料
Webシステム脆弱性LT資料Webシステム脆弱性LT資料
Webシステム脆弱性LT資料
Tomohito Adachi
 
Azure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターンAzure Cosmos DB を使った高速分散アプリケーションの設計パターン
Azure Cosmos DB を使った高速分散アプリケーションの設計パターン
Kazuyuki Miyake
 
Ad

Spring Framework ふりかえりと4.3新機能

  • 2. 自己紹介 名前: 木村 俊介(きむら しゅんすけ) 仕事: SI企業の技術部隊@2013 フレームワーク整備と展開、PJ支援 2年前までは Struts + EJB + iBatis ベースの自社FW 現在は Spring + MyBatis を社内に推進、展開 Spring歴: 2年くらい 2
  • 3. 今日のテーマ 基礎をふりかえりながら、 Spring Framework 4.3 の新機能をご紹介 『Modern Java Component Design with Spring Framework 4.3』 - モダンなSpringの使い方と新機能の説明 - スライド - 動画 『Spring MVC 4 Web Apps』 - WEB機能(Spring MVC)に絞った新機能の説明 - スライド - 動画まだ上がってません Juergen Hoeller Rossen Stoyanchev 3
  • 4. 既に話しつくされたネタ感 @Shimizuさんの日本語解説ブログ http://qiita.com/kazuki43zoo/items/172d132ff8f4ba098888#core- container-improvements JSUG勉強会 2016年その4 Spring I/O報告会 池谷さんの発表 http://ikeyat.github.io/slides- publish/slides/201606XX_SpringIO2016Summary/#1 JJUG CCC 2016 Spring @makingさんの発表 http://sssslide.com/www.slideshare.net/makingx/jjugccc-cccgh5-whats- new-in-spring-framework-43-boot-14-pivotals-cloud-native-approach Spring Framework リファレンス http://docs.spring.io/spring/docs/current/spring-framework- reference/html/new-in-4.3.html 4
  • 9. DIコンテナ Dependency Injection Beanの登録 - Java Config - アノテーションベース - XMLベース Bean BeanBean Bean Bean lookup  依存性の解決  メリット: テスタビリティ向上、ライフサイクル管理 9
  • 10. Aspect Oriented Programming AOP AOP クラスA クラスB  横断的関心事の分離  メリット:コード量削減、見通しのよいコード ログ出力、Tx管理 10
  • 12. Java Config + アノテーションベース @Configuration // Java Configの宣言 @Profile(“standalone”) // standaloneプロファイル時に有効になる @EnableTransactionManagement // SpringによるTx管理を有効化 @ComponentScan(“com.example”) // スキャン&Bean登録 public class AppConfig { @Bean // Bean定義 public FooService fooService() { // CGLibでUtilityのインスタンスは1度しか生成されない return new FooServiceImpl(utility()); } @Bean // Bean定義 public Utility utility() {return new Utility();} } ~4.2 12
  • 13. @Configuration public class AppConfig implements FooAppConfig { … // デフォルトメソッドのBean定義が有効になる } public interface FooAppConfig { @Bean default FooService fooService() { return new FooServiceImpl(); } } ~4.2 13 Java Config & Java8
  • 14. @Component class @Service // ComponentScan時にBean登録される @Lazy // Lazy-load(利用時にインスタンス化) public class FooServiceImpl implements FooService { private final FooRepository fooRepository; @Autowired // コンストラクタインジェクション public FooServiceImpl(FooRepository fooRepository) { this. fooRepository = fooRepository; } @Transactional // AOPでトランザクション管理 public void update() { … } ~4.2 14
  • 15. Lazy Injection Points @Bean @Lazy public FooRepository fooRepository () { return new FooRepositoryImpl(); } @Service public class FooServiceImpl implements FooService { private final FooRepository fooRepository ; @Autowired // 依存先のBeanに関係なく@Lazyを有効化できる public FooServiceImpl(@Lazy FooRepository fooRepository ) { this. fooRepository = fooRepository ; } } ~4.2 15
  • 16. 合成アノテーション @Service @Scope(“session”) @Primary @Transactional(rollbackFor = Exception.class, timeout = 30) public @interface MyCustomService {} @MyCustomService public class FooServiceImpl implements FooService { … }  アノテーションを組み合わせられる ~4.2 16
  • 17. 合成アノテーション 属性の上書き @Service @Scope(“session”) @Primary @Transactional(rollbackFor = Exception.class, timeout = 30) public @interface MyCustomService { @AliasFor(annotation = Transactional.class, attribute = “readOnly”) boolean readOnly() default false; } @MyCustomService(readOnly=false) public class FooServiceImpl implements FooService { … }  上書きしたい属性だけ公開できる ~4.2 17
  • 19. Spring Framework 4.3  4系のラストリリース(リリース済み)  2019年までサポート  SpringBoot 1.4 のデフォルト 『SpringOne Platform 2016 keynote』より引用 19
  • 20. Spring Framework 4.3 改善点  Core Container Improvements  Web Improvements  Data Access Improvements  Caching Improvements  JMS Improvements  WebSocket Messaging Improvements  Testing Improvements 今日話すことは この中の一部 20
  • 22. 1. 暗黙的なコンストラクタ インジェクション @RestController public class Foo { private final HogeService hogeService; private final FugaService fugaService; // @Autowired public Foo(HogeService hogeService, FugaService fugaService) { this.hogeService = hogeService; this.fugaService = fugaService; } 4.3 コンストラクタが1つなら 省略可能 22
  • 23. 2. Java Config クラスで コンストラクタインジェクション @Configuration public class AppConfig { private final Utility utility; // @Autowired が書けるようになった(けど省略可能) public AppConfig(Utility utility) { this.utility = utility; } @Bean public FooService fooService() { return new FooServiceImpl(this.utility); } } 4.3 23
  • 24. 3. InjectionPoint like CDI 『http://sssslide.com/www.slideshare.net/makingx/jjugccc-cccgh5-whats-new-in-spring- framework-43-boot-14-pivotals-cloud-native-approach』より引用 4.3 4.3 24
  • 25. 活用例. Loggerの生成 public class HelloController { @Autowired private Logger logger; //= LoggerFactory.getLogger(HelloController.class) public void log(){ // … com.example.controllers.HelloController : hello と表示される logger.info(“hello”); } } @Configuration public class AppConfig { @Bean @Scope(value="prototype“, proxyMode = ScopedProxyMode.NO) Logger getLogger(InjectionPoint ip ) { return LoggerFactory.getLogger( ip.getMember().getDeclaringClass().getName()); } } 4.3 proxyModeがNOなので、 自身のスコープよりも広いBeanにインジェクト されると、依存先のスコープになる (CDIの@Dependentみたいなスコープ) 25
  • 26. @RestController @Slf4j public class HelloController { // Logger log = LoggerFactory.getLogger(HelloController.class); public void log(){ // … com.example.controllers.HelloController : hello と表示される log.info(“hello”); } } 4.3 コンパイル時に暗黙的に生成される ただ、lombokはもっとすごい 詳細は TERASOLUNA Server Framework を参照 http://terasolunaorg.github.io/guideline/5.2.0.RELEASE/ja/Appendix/Lombok .html#lombokhowtouselogger 26
  • 27. 4. Generics-based Injection @Service public class HogeServiceImpl implements HogeService { @Resource(name = “listFoo”) private List<Foo> listFoo; @Resource(name = “listBar”) private List<Bar> listBar; } @Configuration public class AppConfig { @Bean(name = “listFoo”) public List<Foo> fooList(){…} @Bean(name = “listBar”) public List<Bar> fooList(){…} } 型ではなく名前で解決 @Autowired ではなく @Resource http://docs.spring.io/spring/docs/4.2.7.RELEASE/spring-framework-reference/htmlsingle/#beans- autowired-annotation-qualifiers ~4.2 27
  • 28. 4. Generics-based Injection @Service public class HogeServiceImpl implements HogeService { @Autowired List<Foo> listFoo; @Autowired List<Bar> listBar; } @Configuration public class AppConfig { @Bean public List<Foo> fooList(){…} @Bean public List<Bar> barList(){…} } 4.3 型で解決 28
  • 30.  @GetMapping  @PostMapping  @PutMapping  @DeleteMapping  @PatchMapping  @OptionsMapping  @HeadMapping 1. @RequestMapping の合成アノテーション 理由はあとで 30
  • 31. @GetMappingの例 @RequestMapping(value = “hello” , method = RequestMethod.GET) public String hello(){ … } @GetMapping(value = “hello”) public String hello(){ … } 4.3 可読性があがった タイプ数が減った ~4.2 31
  • 32. 2. HEAD, OPTIONS の自動サポート $ curl -i -X OPTIONS http://localhost:8080/hello HTTP/1.1 200 X-Application-Context: application Allow: GET,HEAD Content-Length: 0 Date: Sun, 28 Aug 2016 07:32:23 GMT $ curl -i --head http://localhost:8080/hello HTTP/1.1 200 X-Application-Context: application Content-Type: text/plain;charset=UTF-8 Content-Length: 4 Date: Sun, 28 Aug 2016 07:40:25 GMT Allowヘッダに対応可能なHTTPメソッド が列挙される。 Controllerのメソッドは実行されない。 GETメソッドと同じ。 ただしレスポンスボディは空 Controllerのメソッドが実行される。 GET付与でHEADとOPTIONSが自動サポート 定義方法は@RequestMappingでも@GetMappingでもok 32
  • 33. 3. Webスコープに関する @Scopeの合成アノテーション  @RequestScope  @SessionScope  @ApplicationScope スコープ 内容 prototype Bean参照ごとに毎回生成 request HTTPのリクエストごとに生成 session ユーザセッションごとに生成 singleton ApplicationContextごとに生成 application ServletContextごとに生成 広い 狭い 33
  • 34. @RequestScope の例 @Component @Scope(scopeName = “request”, proxyMode = TARGET_CLASS) public class Foo { … } @Component @RequestScope public class Foo { … } 4.3 可読性があがった タイプ数が減った ~4.2 34
  • 35. 他のスコープを作ってみる @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Scope("prototype") public @interface PrototypeScope { @AliasFor(annotation = Scope.class) ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS; } @Component @PrototypeScope public class Foo { … } 重要なのはここだけ 合成アノテーションは簡単 35
  • 36. 4. @RestControllerAdvice @ControllerAdvice public class GlobalHandler { @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ResponseBody public Foo handle(){…} @RestControllerAdvice public class GlobalHandler { @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) // @ResponseBodyが不要 public Foo handle(){…} 4.3 @ControllerAdvice + @ResponseBody ~4.2 36
  • 37. 5. @RequestAttribute @RequestMapping(value = “foo”, method = RequestMethod.GET) public String foo(HttpServletRequest request) { String param1 = (String) request.getAttribute(“param1”); … } @RequestMapping(value = “foo”, method = RequestMethod.GET) public String foo(@RequestAttribute(“param1”) String param1){…} 4.3 Servlet API に依存せずに取得できる ~4.2 37
  • 38. 6. @SessionAttribute @RequestMapping(value = “foo”, method = RequestMethod.GET) public String foo(HttpSession httpSession) { String param1 = (String) httpSession.getAttribute(“param1”); … } @RequestMapping(value = “foo”, method = RequestMethod.GET) public String foo(@SessionAttribute(“param1”) String param1){…} 4.3 Servlet API に依存せずに取得できる ~4.2 38
  • 39. 7. @ModelAttribute(binding = false) @ModelAttribute public Book setUpBook() { // おすすめの本の取得 return new Book(“spring”); } @PostMapping(“purchase”) public void purchase (BookForm form, @ModelAttribute(binding = false) Book book) { … } 4.3  リクエストパラメータのバインドを抑制する リクエストパラメータが バインドされる(titleはjavaee) リクエストパラメータをバインドせずに Modelの値を取得する(titleはspring) curl –X POST localhost:8080/purchase?title=javaee Bookクラス、BookFormクラスは titleフィールドを持つとする 39
  • 41. 詳細はここ @Shimizuさんの日本語解説ブログ http://qiita.com/kazuki43zoo/items/172d132ff8f4ba098888#core- container-improvements JSUG勉強会 2016年その4 Spring I/O報告会 池谷さんの発表 http://ikeyat.github.io/slides- publish/slides/201606XX_SpringIO2016Summary/#1 JJUG CCC 2016 Spring @makingさんの発表 http://sssslide.com/www.slideshare.net/makingx/jjugccc-cccgh5-whats- new-in-spring-framework-43-boot-14-pivotals-cloud-native-approach Spring Framework リファレンス http://docs.spring.io/spring/docs/current/spring-framework- reference/html/new-in-4.3.html 41