Weitere ähnliche Inhalte
Ähnlich wie Spring Framework ふりかえりと4.3新機能 (20)
Kürzlich hochgeladen (12)
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
- 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
- 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
- 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
- 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