What's new with Spring!

Created by Michael T Minella / @michaelminella

Who is this guy?

  • Project lead for Spring Batch
  • Author of Pro Spring Batch
  • Member of the expert group for JSR-352
  • Twitter: @michaelminella

What is this about?

  • Spring I/O
  • Spring
  • Spring Boot
  • Spring XD

Spring I/O

Spring I/O

New Website

?

Spring

Spring 4

When was Spring released?

Spring is almost 10 years old

Only reved the major version two other times.

What's in Spring 4?

  • Updates to all major dependencies
  • Pruning of depricated features
  • Groovy based configuration
  • Java 8 support
  • WebSocket support
  • And much more!

Spring and the JVM

Java, Scala, Groovy, etc

Spring and Scala


class ServiceConfiguration extends FunctionalConfiguration {
	importClass(classOf[DataSourceConfiguration])

	val dataSource:DataSource = getBean("dataSource")

	val jdbcTemplate = bean() {
		new JdbcTemplate(dataSource)
	}

	val jdbcTransactionmanager = bean("txManager") {
		new JdbcTransactionManager(dataSource)
	}
}					
					

Spring and Groovy


import o.sf.jdbc.core.JdbcTemplate
import o.sf.jdbc.datasource.DataSourceTransactionManager

beans {
	jdbcTemplate(JdbcTemplate) {
		dataSource = dataSource
	}

	transactionManager(DataSourceTransactionmanager) {
		dataSource = dataSource
	}
}
					

Spring and Java


@Configuration
@ComponentScan
@Import(DataSourceConfiguration.class)
@EnableTransactionManagement
class ServiceConfiguration {

	@Bean
	public JdbcTemplate jdbcTemplate(DataSource dataSource) {
		return new JdbcTemplate(dataSource);
	}

	@Bean
	public PlatformTransactionManager jdbcTemplateManager(DataSource dataSource) {
		return new JdbcTransactionManager(dataSource);
	}
}
					

Spring and Java 8

Method references


private Customer map(ResultSet rs, int rowNum) throws SQLException {
    return new Customer(rs.getString("name"), rs.getInt("age"));
}

private void build(PreparedStatement ps) throws SQLException {
    ps.setString(1, "Mike%");
}

...
jdbcTemplate.query("SELECT name, age FROM customer WHERE name like ?", 
    this::build,
    this::map);
);
					

Lambdas


JdbcTemplate jt = new JdbcTemplate(dataSource);

jt.query("SELECT name, age FROM person WHERE name like ?", 
    ps -> { ps.setString(1, "Mike%"); },
    (rs, rowNum) -> new Person(rs.getString(1), rs.getInt(2));
);
					

java.time


public class Customer {
	
	@DateTimeFormat(iso=ISO.DATE)
	private LocalDate birthDate;

	@DateTimeFormat(pattern="M/d/yy h:mm")
	private LocalDateTime lastUpdate;
}					
					

WebSockets

  • Delegates to app server implementations (Tomcat, Jetty, etc)
  • Supports Sock.js, a superset of WS
  • STOMP support over WS
  • Message API moved from Spring Integration to Spring Core
  • JSR-356 (javax.websocket.*) support

WebSocket subscription


@Controller
public class PortfolioController {
    ...
	@MessageMapping("/app/trade")
	public void executeTrade(Trade trade, Principal principal) {
	    trade.setUsername(principal.getName());
	    this.tradeService.executeTrade(trade);
	}

	@SubscribeEvent("/app/positions")
	public List<PortfolioPosition> subscribeToPortfolios(Principal principal) {
	    String user = principal.getName();
	    Portfolio portfolio = this.portfolioService.findPortfolio(user);
	    return portfolio.getPositions();
	}
}
					

Spring in JEE

  • Full support for EE 7
    • Date/Time
    • JTA 1.2
    • JMS 2.0
    • JPA 2.1
    • Bean validation 1.1
    • Concurrency (JSR-236)
    • Servlet 3.1
    • WebSockets (JSR-356)
  • Participated in JSR-356 and JSR-352

?

Spring Boot

Spring Opinionated

Goals of Spring Boot

  • Radically faster getting started experience
  • Be opinionated out of the box...
  • ...but get out of the way as requirements diverge
  • Zero code generation or XML

Demo

Spring Boot

  • Maximizes productivity
  • Minimizes boilerplate code
  • Makes Spring fun!

Who uses this in production?

We do!

Spring.io

  • Nearly a million unique visitors a month
  • Aprox 5 million page views a month

?

Spring XD

Big Data Challenges...

  • Building Big Data applications is too complex
  • Low level coding experience that require lots of boilerplate code
  • Numerous domains to bridge
  • Inconsistent APIs

...Are Integration Challenges

Big Data Terminology Integration Terminology
Data flow model
Source, Channel, Sink
EIP Patterns
Adapter, Channel, Filter, Transformer, etc.
Workflow Orchestration
Workflow, Action
Batch Processing
Job, Step
Export
Jobs, Connectors
Batch Processing
Jobs, Readers/Writers

Architecture

  • Distributed Portable Runtime
  • Pluggable Module System
  • Domains Specific Language

Domain Specific Language

http | hdfs

Domain Specific Language

http --port 8181 | hdfs --directory /xd/1

Domain Specific Language

http --port 8181 | filter --expression='payload?.price > 3.0' | hdfs --directory /xd/1

Real-time Analytics via Taps

twittersearch --query=#spring | file

tap:tweets > field-value-counter --fieldName=entities.hashTags.text --counterName=tags

Spring XD

  • Unified platform across big data domains
  • Productivity
  • Proven foundation
  • Extensible
  • Distributed
  • Portable runtime
  • Hadoop agnostic

Demo

?

Keep in touch!