Spring Boot 1.3 News
earlier than anywhere else
Shibuya-Java 2015-08-01
@making (Toshiaki Maki)
About me
• @making
• Spring enthusiast/contributor
Spring Boot
http://blog.pivotal.io/pivotal-cloud-foundry/features/mapping-the-cloud-native-journey
Spring Boot
http://blog.pivotal.io/pivotal-cloud-foundry/features/mapping-the-cloud-native-journey
1.4 M Downloads
a month!!!
Spring Boot 1.3!
will be released @ 2015-09
Current version is 1.3.0.RC2
Quick Start with
Spring Initializer w/ STS
Quick Start with
Spring Initializer w/ STS
Quick Start with
Spring Initializer w/ IDEA
Quick Start with
Spring Initializer w/ IDEA
• Spring 4.2 Support
• New AutoConfigures
• Non-functionalities
• DevOps
Highlights of Spring Boot 1.3
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.3-Release-Notes
Today s Demo Sources
https://github.com/making/
demo-spring-boot-1.3
• Spring 4.2 Support
• New AutoConfigures
• Non-functionalities
• DevOps
Highlights of Spring Boot 1.3
Spring 4.2 Support
• Server Sent Event (SSE)
• Cross Origin Resource Sharing (CORS)
• ScriptEngineView
• CompletableFuture
• and so on…
Released
Yesterday!
https://spring.io/blog/2015/07/31/spring-framework-4-2-goes-ga
• Spring 4.2 Support
• New AutoConfigures
• Non-functionalities
• DevOps
Highlights of Spring Boot 1.3
New AutoConfigures
• Cache
• OAuth2
• Spring Session
• jOOQ
• EmbeddedMongoDB
Cache
AutoConfigure for Spring Cache Abstraction
<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-cache</artifactId>

</dependency>
Cache@EnableCaching

@SpringBootApplication

@RestController

public class Demo {

@Autowired WeatherService service;

@RequestMapping

String hello() {

long start = System.currentTimeMillis();

String result = service.getWeather("Tokyo");

long elapsed = System.currentTimeMillis() - start;

return result + " took " + elapsed + " [ms]";

}

public static void main(String[] args) {

SpringApplication.run(Demo.class, args);

}

}
Cache
@CacheConfig(cacheNames = "weather")

@Service

class WeatherService {



@Cacheable

public String getWeather(String where) {

// Access OpenWeatherMap API;

}

}
Cache
@CacheDefaults(cacheName = "weather")

@Service

class WeatherService {



@CacheResult

public String getWeather(String where) {

// Access OpenWeatherMap API;

}

} Standard JCache API
is also available
Cache
Cache Managers
•ConcurrentHashMap
•EhCache
•Hazelcast
•Infinispan
•JCache (JSR 107)
•Redis
•Guava
See Samples
https://github.com/making/demo-spring-boot-1.3
https://blog.ik.am/#/entries/339
OAuth2
AutoConfigure for Spring Security OAuth2
<dependency>

<groupId>org.springframework.security.oauth</groupId>

<artifactId>spring-security-oauth2</artifactId>

</dependency>
OAuth2
@SpringBootApplication
@RestController
public class Demo {
@RequestMapping("/")
String hello() {
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(Demo.class, args);
}
}
OAuth2
@SpringBootApplication
@EnableAuthorizationServer
@EnableResourceServer
@RestController
public class Demo {
@RequestMapping("/")
String hello() {
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(Demo.class, args);
}
}
security.user.name=user
security.user.password=password
security.oauth2.client.client-id=foo
security.oauth2.client.client-secret=bar
OAuth2
$ curl localhost:8080
{
"error": "unauthorized",
"error_description": "Full authentication is
required to access this resource"
}
OAuth2
$ curl foo:bar@localhost:8080/oauth/token -d
grant_type=password -d username=user -d password=password
-d scope=read
{
"access_token": "43a001d3-862f-4f02-a60f-b04d0988c24c",
"token_type": "bearer",
"refresh_token": "e4af4aac-eb8e-423b-b3a9-a73ba0f81fd1",
"expires_in": 43199,
"scope": "read"
}
Client ID/Secret Resource Owner s
username/password
OAuth2
$ curl -H "Authorization: Bearer
43a001d3-862f-4f02-a60f-b04d0988c24c" localhost:
8080
Hello World!
OAuth2 SSO
@SpringBootApplication
@EnableOAuthSso
@RestController
public class Demo {
@RequestMapping("/")
String hello(OAuth2Authentication auth) {
return "Hello " + auth.getName();
}
public static void main(String[] args) {
SpringApplication.run(Demo.class, args);
}
}
OAuth2 SSO
security.oauth2.client.client-id=5f6623be1882438a166a

security.oauth2.client.client-secret=fb38ecb19304645292ace4e3cfc8ba3102c44dc8

security.oauth2.client.access-token-uri=https://github.com/login/oauth/access_token

security.oauth2.client.user-authorization-uri=https://github.com/login/oauth/authorize

security.oauth2.client.client-authentication-scheme=form

security.oauth2.resource.user-info-uri=https://api.github.com/user

security.oauth2.resource.prefer-token-info=false
OAuth2 SSO
OAuth2 SSO
security.oauth2.client.client-id=746653690954-hheiimv40v167fp6f26g

security.oauth2.client.client-secret=jo7Ee9oHJY2i9DeOWHXuMcD-

security.oauth2.client.access-token-uri=https://www.googleapis.com/oauth2/v3/token

security.oauth2.client.user-authorization-uri=https://accounts.google.com/o/oauth2/auth

security.oauth2.client.client-authentication-scheme=form

security.oauth2.client.scope=profile,email

security.oauth2.resource.user-info-uri=https://www.googleapis.com/plus/v1/people/me

security.oauth2.resource.prefer-token-info=false
Goole+ API is also available!!
OAuth2 SSO
jOOQ
AutoConfigure for jOOQ
<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-jooq</artifactId>

</dependency>
jOOQ
@Repository

public class CustomerRepository {

@Autowired

DSLContext dslContext;



public List<Customer> findAll() {

return dslContext.select()

.from(CUSTOMERS)

.orderBy(CUSTOMERS.FIRST_NAME.asc())

.fetchInto(Customer.class);

}

}
AutoConfigured
Exception Handler, TransactionManager…
are also configured
Spring Session
AutoConfigure for Spring Session
<dependency>

<groupId>org.springframework.session</groupId>

<artifactId>spring-session</artifactId>

</dependency>
<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-redis</artifactId>

</dependency>
Spring Session
@SpringBootApplication
@RestController
public class Demo {
@Value("${server.port:8080}") int port;
@RequestMapping("/")
String hello(HttpSession session) {
return "port=" + port + ", id="
+ session.getId();
}
public static void main(String[] args) {
SpringApplication.run(Demo.class, args);
}
}
Nothing special!
Spring Session
$ java -jar demo.jar --server.port=8080
$ java -jar demo.jar --server.port=8081
Spring Session
Spring Session
Spring Session
EmbeddedMongoDB
AutoConfigure for Embedded Mongo
<dependency>

<groupId>de.flapdoodle.embed</groupId>

<artifactId>de.flapdoodle.embed.mongo</artifactId>

</dependency>
Automatically used
• Spring 4.2 Support
• New AutoConfigures
• Non-functionalities
• DevOps
Highlights of Spring Boot 1.3
Non-functionalities
• OpenTSDB Metrics Writer
• StatsD Metrics Writer
• New Healthcheck
OpenTSDB Metrics Writer
@Bean
@ExportMetricWriter
@ConfigurationProperties("metrics.export")
MetricWriter metricWriter() {
return new OpenTsdbMetricWriter();
}
metrics.export.url=http://localhost:4242/api/put
Export metrics to
StatsD Metrics Writer
Export metrics to StatsD
@Bean

@ExportMetricWriter

MetricWriter metricWriter(
@Value("${statsd.prefix}") String prefix,

@Value("${statsd.host}") String host,

@Value("${statsd.port}") int port) {

return new StatsdMetricWriter(prefix, host, port);

}
statsd.prefix=demo
statsd.host=localhost
statsd.port=8125
StatsD Metrics Writer
StatsD + Graphite + Grafana
https://github.com/kamon-io/docker-grafana-graphite
New Health Check
• Elasticsearch
• Email
• JMS
Highlights of Spring Boot 1.3
• Spring 4.2 Support
• New AutoConfigures
• Non-functionalities
• DevOps
DevOps
• Ascii Color Banner
• Systemd Service
• DevTools
Ascii Color Banner
${AnsiColor.BRIGHT_GREEN}My Application
${AnsiColor.BRIGHT_YELLOW}Hello!!${AnsiColor.DEFAULT}
src/main/resources/banner.txt
Ascii Color Banner
Systemd Service
$ mvn package
$ cp target/*.jar /var/demo/demo
<plugin>
<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

<configuration>

<executable>true</executable>

</configuration>

</plugin>
Systemd Service
$ systemctl start demo
$ systemctl enable demo
[Unit]
Description=demo
After=syslog.target
[Service]
ExecStart=/var/demo/demo
[Install]
WantedBy=multi-user.target
/etc/systemd/system/demo.service
DevTools
• Disabling template cache
• Auto restart Class Loader
• Live reload browser
• Remote debug & restart
DevTools
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
Disabling template cache
spring.thymeleaf.cache=false
spring.freemarker.cache=false
spring.groovy.template.cache=false
spring.velocity.cache=false
spring.mustache.cache=false
spring.thymeleaf.cache=false
spring.freemarker.cache=false
spring.groovy.template.cache=false
spring.velocity.cache=false
spring.mustache.cache=false
No longer
needed!!
Disabling template cache
Auto restart Class Loader
Demo
https://blog.ik.am/#/entries/349
Live reload browser
Demo
Remote debug & restart
https://www.youtube.com/watch?v=A70NMxV13TI
Wrap Up
Spring 4.2
• Server-Sent Events
• CORS
• ScriptEngineView
• CompletableFuture
New AutoConfigures
• Cache
• OAuth2
• Spring Session
• jOOQ
Non-functionalities
• OpenTSDB Metrics
• StatsD Metrics
• New Healthcheck
DevOps
• Ascii Color Banner
• Systemd Service
• DevTools
Announce!!
• Spring in Summer
• 2015-08-28(Fri.)09:30 - 18:30
• GranTokyo South Tower
https://jsug.doorkeeper.jp/events/27682
Largest Spring
Event in Japan!!
Announce!!
• JJUG LT Festival!!
• 2015-08-10(Mon.)19:00 - 21:00
https://jjug.doorkeeper.jp/events/28181

Spring Boot 1.3 News #渋谷Java