19. Spring Ecosystem
IDE
Spring Tool Suite (STS)
RAD
Starter
Spring Roo
Web
Spring XD
Spring WebFlow
Spring
Security
OAuth
Spring MVC
Spring
Security
Social
Big Data
Security
Spring Data Rest
Spring Mobile
Spring Boot
DataAccess
Spring Hadoop
Batch
Spring Data
MongoDB
Spring Data
JPA
Spring Batch
Enterprise
Integration
Spring
Integration
Core
Spring DI
Spring AOP
Spring TX
Spring Social
Github
Spring Social
Facebook
Spring Social
Twitter
20. Spring Ecosystem
今日のスコープ
IDE
Spring Tool Suite (STS)
RAD
Starter
Spring Boot
Spring Roo
Web
Spring XD
Spring Data
Rest
Spring WebFlow
Spring
Security
OAuth
Spring MVC
Spring
Security
Spring Mobile
Social
Big Data
Security
DataAccess
Spring Hadoop
Batch
Spring Data
MongoDB
Spring Data
JPA
Spring Batch
Enterprise
Integration
Spring
Integration
Core
Spring DI
Spring AOP
Spring TX
Spring Social
Github
Spring Social
Facebook
Spring Social
Twitter
23. Spring DI x AOP
•
成熟度:★★★ version: 3.2.5.RELEASE
•
Spring Ecosystemのコア
•
JavaConfigサポート(@Configuration, @Bean)
•
•
No XML hell!
JSR-330サポート(@Inject, @Named)
24. JSR-330によるDI コード例
package sample;
import javax.inject.Named;
!
@Named
public class GreetingService {
public String hello(String message) {
return "Hello " + message + "!";
}
}
package sample;
import javax.inject.Inject;
!
public class MyApplication {
@Inject
GreetingService service;
public void run(String message) {
System.out.println(service.hello(message));
}
}
25. JSR-330によるDI コード例
@Configuration
@ComponentScan(basePackages = "sample")
public class AppConfig {
@Bean
MyApplication myApplication() {
return new MyApplication();
}
}
デフォルトでscope=singleton
になるので注意
Google Guiceよりも簡単!
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!");
}
}
}
39. Spring Data
• 成熟度:★★☆
• データアクセスの抽象化ライブラリ
• オブジェクトマッピング、Repository、Templateを提供
• いろいろなデータストアをサポートするサブプロジェクトからなる
• Spring
Data Commons
• Spring
Data JPA
• Spring
Data MongoDB, Redis, Neo4j, REST, Hadoop, HBase,
Solr, ...
• 各データストアにRepositoryやTemplateを提供してBoilerplateをな
くす
40. 従来のJPAプログラミング
@Entity
public class Customer {
@Id
@GeneratedValue
private Long id;
private String firstname;
private String lastname;
// omitted…
}
毎回同じような
コード・・・→
@Repository
public 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();
}
}
41. Spring Data 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);
}
•
たったこれだけ!
•
CRUD系のメソッド、ページング・ソート処理は自動で
実装される
•
JPAプログラミングの簡素化!
42. Spring Data REST
•
成熟度:★☆☆ version: 1.1.0.M1
•
Spring DataのRepositoryをREST APIにエクス
ポート(@RestResource)
•
現在はSpringMVCのみサポートしていrが、将
来的にはServlet非依存を目指している
•
HypermediaLinkの作成
47. 速習 Spring Boot
$ brew tap pivotal/tap
$ brew install springboot
$ which spring
/usr/local/bin/spring
$ spring run app.groovy
// app.groovy
@Controller
class Application {
@RequestMapping("/")
@ResponseBody
def String hoge() {
"HelloWorld!"
}
}
初回のみ
for Macユーザー
ソースコード全文。import文不要
51. Lambdaサポート
@Inject
JdbcTemplate jdbcTemplate;
!
Before
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));
}
}
);
}
52. Lambdaサポート
@Inject
JdbcTemplate jdbcTemplate;
!
Before
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));
}
}
);
}
After
53. Lambdaサポート
@Inject
JdbcTemplate jdbcTemplate;
!
Before
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));
}
}
);
}
After
54. Lambdaサポート
@Inject
JdbcTemplate jdbcTemplate;
!
Before
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));
}
}
);
}
SpringにはTemplateパターン+
コールバックな機能が多いので
ラムダ式の恩恵が大きい!
After
83. 最近のWebアプリ
Spring DI x AOP
Spring MVC
Bean Validation
Router
Spring
REST API
Model/
Collection
View
Template
JavaScript Framework
(Backbone.js, Angular.js, Knockout.js, …)
Spring Data JPA
JPA
84. 最近のWebアプリ
Spring DI x AOP
Spring MVC
Bean Validation
Spring
REST API
Spring Data JPA
JPA
Thin化するサーバーサイド
Router
Model/
Collection
View
Template
JavaScript Framework
(Backbone.js, Angular.js, Knockout.js, …)
Rich化するクライアントサイド
92. Java EEによる伝統的なWebアプリ
UI & Presentation
Layer
Service Layer
Persistence Layer
CDI and DI (JSR 299, 330)
JAX-RS
JSF
EJB
JPA
Bean Validation
Apache Shiro?
DB
Browser/Client
93. Springによる最近のWebアプリ
Spring DI x AOP
Spring MVC
Bean Validation
Router
Spring
REST API
Model/
Collection
View
Template
JavaScript Framework
(Backbone.js, Angular.js, Knockout.js, …)
Spring Data JPA
JPA
109. Spring Framework or Java EE個人的まとめ
Javaを
YES
Spring以外のJavaフレーム
ワークにもあてはまるフロー
使っている
だと思う
今
NO
Springを使って
いる
Spring
の将来に不安な
し
新しい機能
を使いたい
Java EE
Spring