Upload
vivi
View
79
Download
3
Embed Size (px)
DESCRIPTION
Spring 未来展望. Mark Pollack 博士. 议题. 部署到云或内部部署. 统一组件模型 全新 Web 应用程序架构 NoSQL 与大数据. NoSQL 、大数据. 核心 模型. Web 、 集成、 批处理. 是否记得此书 … ?. 对此框架是否还有印象?. 某些方面已经改变 …. 版本 0.9 (25.6.2003) 中的变化 ---------------------------------- 与 《 Expert One-on-One J2EE Design and Development》 同时问世的版本之后的首次公开发布 - PowerPoint PPT Presentation
Citation preview
Spring 未来展望Mark Pollack 博士
议题
统一组件模型 全新 Web 应用程序架构 NoSQL 与大数据
部署到云或内部部署
NoSQL、大数据
Web、集成、批处理
…是否记得此书 ?
3
对此框架是否还有印象?
4
…某些方面已经改变
5
版本 0.9 (25.6.2003) 中的变化----------------------------------•与《 Expert One-on-One J2EE Design and Development》同时问世的版本之后的首次公开发布• 后续各种非官方 0.8 CVS 快照
某些方面仍保持原样
6
版本 0.9 (25.6.2003) 中的变化----------------------------------•与《 Expert One-on-One J2EE Design and Development》同时问世的版本之后的首次公开发布• 后续各种非官方 0.8 CVS 快照• 通过 Commons Logging 提供日志• 改进的 web 框架•常规的加强和修正• 全新示例应用程序 "Petclinic"
某些方面仍保持原样
7
“ 我认为 Spring 是独一无二的,原因如下:
• 它解决了其他许多流行框架所没有解决的重要问题
• Spring 既是综合性的,也是模块化的
• Spring 设计为从零开始帮助您编写易于测试的代码
• Spring ”是一项日显其重要性的集成技术
- Rod Johnson, TheServerSide.com, 2005
Spring 包含的内容
8
Spring – 统一组件模型
9
SimpleObject简单对象
依存关系注入
(DI)
面向方面编程
(AOP)
可移植服务抽象
还记得此模型吗?
SimpleObject注释组件
注入注释
可组合构造型
面向服务的注释
注释透视
一个典型注释组件
@Servicepublic class MyBookAdminService implements BookAdminService {
@Autowired public MyBookAdminService(AccountRepository ar) { … }
@Transactional public BookUpdate updateBook(Addendum addendum) { … }}
1. 可组合构造型模型
• 用于自定义构造型的强大选项
@Service@Scope("request")@Transactional(rollbackFor=Exception.class)@Retention(RetentionPolicy.RUNTIME)public @interface MyService {}
@MyServicepublic class BookAdminService { …}
2. 注入注释
• Spring 的 @Autowired 和 @Value 与 JSR-330 的@Inject 的对照
@Autowiredpublic MyBookAdminService(@Qualifier("myRepo") AccountRepository ar, @Value("#{systemProperties.databaseName}") String dbName) { …}
@Injectpublic MyBookAdminService(@Named("myRepo") AccountRepository ar) { …}
3. 面向服务的注释• 例如,声明性事务和声明性计划
@Transactionalpublic BookUpdate updateBook(Addendum addendum) { …}
@Scheduled(cron = "0 0 12 * * ?")public void performTempFileCleanup() { …}
示例:声明性缓存
• 基于全功能缓存抽象
@Cacheablepublic Owner loadOwner(int id);
@Cacheable(condition="name.length < 10")public Owner loadOwner(String name);
@CacheEvictpublic void deleteOwner(int id);
@RequestMapping(value = "/books/{id}", method = GET)
public Book findBook(@PathVariable("id") long id) {
return this.bookAdminService.findBook(id);
}
http://mybookstore.com/books/12345
示例: Spring MVC - @PathVariable
示例:声明性模型验证
public class Book { @NotNull @Past private Date releaseDate;}
@RequestMapping("/books/new")
public void newBook(@Valid Book book) { … }
• JSR-303“Bean ”验证 作为共用基础
示例:声明性格式设定
• 注释推动的数字和日期格式设定
public class Book { @NotNull @Past @DateTimeFormat(iso=ISO.DATE) private Date releaseDate;}
逐步构建您的注释组件
• 典型方法:一个简明的 XML bean 定义文件– <context:component-scan base-package=”com.myapp”/>– @Repository / @Service / @Controller / @Configuration stereotype– compare: JPA persistence.xml with @Entity classes
• 替代方法: AnnotationConfigApplicationContext– scan(basePackage)– register(componentClass)– register(configurationClass)
WebApplicationInitializer
/** * Servlet 3.0 based initializer, autodetected by Spring. */public class MyWebAppInitializer implements WebApplicationInitializer {
public void onStartup(ServletContext sc) throws ServletException {
// Create the 'root' Spring application context AnnotationConfigWebApplicationContext root =
new AnnotationConfigWebApplicationContext(); root.scan("com.mycompany.myapp"); root.register(FurtherConfig.class);
// Manages the lifecycle of the root application context sc.addListener(new ContextLoaderListener(root));
... }}
配置类@Configuration
public class MyBookAdminConfig {
@Bean
public BookAdminService myBookAdminService() {
MyBookAdminService service = new MyBookAdminService();
service.setDataSource(bookAdminDataSource());
return service;
}
@Bean
public DataSource bookAdminDataSource() {
…
}
}
不依赖 XML 的 JPA 设置@Configuration
public class MyBookAdminConfig {
@Bean
public FactoryBean myEntityManagerFactoryBean() {
LocalContainerEntityManagerFactoryBean emfb = new LocalContainerEntityManagerFactoryBean();
emfb.setPackagesToScan(“com.mycompany.myapp”);
emfb.setDataSource(bookAdminDataSource());
return emfb;
}
@Bean
public DataSource bookAdminDataSource() { … }
}
总结
• Spring 与众不同的注释组件模型– 可组合构造型模型– 注入注释– 面向服务的注释– 灵活的逐步构建选项– 如果需要:完全不依赖 XML 的部署
• 我们为何需要全新应用程序架构?• 这种架构应是什么样子的?• 我如何利用 Spring 构建这类应用程序?
应用程序架构
变革的动力
用户期望
变革的动力
全新客户端设备
企业期望
QoS• Internet 范围???• 艰难熬过 AWS 故障
混合这一必然趋势
数据
自:服务器端应用程序至:智能客户端和服务
客户端
服务器
视图生成视图生成 控制器控制器
服务层服务层
存储库存储库通道通道 RDBMSRDBMS
CRUD
应用程序服务器
浏览器
基于浏览器的
HTML 呈现
(逐步增强)
基于浏览器的
HTML 呈现
(逐步增强)
HTML HTTP
客户端
服务器
服务层服务层
存储库存储库通道通道 RDBMSRDBMS
CRUD
浏览器应用程序或本机嵌入
JSON HTTP 和 websocket
HTML5 和 JS 引擎
控制器控制器DOMDOM客户端模型客户端模型 web 暂
存web 暂存
事件和通知
客户端
云 /PaaS
服务层服务层
存储库存储库通道通道 RDBMSRDBMS
CRUD
浏览器应用程序或本机嵌入
JSON HTTP 和 websocket
HTML5 和 JS 引擎
控制器控制器DOMDOM客户端模型客户端模型 web 暂
存web 暂存
服务服务 服务服务 服务服务 业务 /域服务
事件和通知
客户端
PaaSCRUD
存储库存储库通道通道 RDBMSRDBMS
浏览器应用程序或本机嵌入
JSON HTTP 和 websocket
HTML5 和 JS 引擎
控制器控制器DOMDOM客户端模型客户端模型 web 暂
存web 暂存
服务服务 服务服务 服务服务 业务 / 域服务
事件和通知
客户端
PaaS
浏览器应用程序或本机嵌入
JSON HTTP 和 websocket
HTML5 和 JS 引擎控制器控制器DOMDOM
客户端模型客户端模型 web 暂存
web 暂存
服务服务 服务服务 服务服务 业务 / 域服务
服务服务 服务服务 服务服务平台服务、 Web API
SQLSQL NoSQLNoSQL 其他
事件和通知
HTML5(及本机)
PaaS
JSON HTTP 和 Websocket
HTML5 & JS Engine
应用程序
服务
事件和通知
智能客户端
蒙提霍尔游戏
蒙提霍尔游戏
毛茸茸、憨态可掬的灰色小倭狐猴!http://www.factzoo.com/mammals/gray-mouse-lemur-small-furry-gray.html
蒙提霍尔游戏
蒙提霍尔游戏
坚持还是改变主意?
• Cujo– curl
– wire
– when
– aop
• 单击
客户端代码走查和演示
$> 演示
服务端设计
前沿:SPA、 REST (及 WebSocket)
应用程序、 REST 和 WebSocket本机应用程序
基于浏览器的应用程序
应用程序商店
(Web 应用程序)及服务
REST
SPA
ws:
下载
交互
• 以 Spring MVC 为基础
• Spring Data REST – 通过 CRUD 进行基本实体管理– …构建于
• Spring HATEOAS– 链接生成器– 资源组装器
采用 Spring 进行基于 REST 的 API 设计
蒙提霍尔游戏资源
46
POST /games201 CreatedLocation : /games/{id}
GET /games/{id}200 OK{status : “awaiting_initial_selection” links : [ { rel : “self”, href : “http://…/games/{id}” }, { rel : “doors”, href : “http://…/games/{id}/doors”}, { rel : “history”, href : “http://…/games/{id}/history”}]}
蒙提霍尔门资源
47
GET /games/{id}/doors200 OK{ doors : [ {status : “closed”, content : “unknown”, links : [ {rel : “self”, href : “http://…/games{id}/doors/1”}]}, {status : “closed”, content : “unknown”, links : [ {rel : “self”, href : “http://…/games{id}/doors/2”}]}, {status : “closed”, content : “unknown”, links : [ {rel : “self”, href : “http://…/games{id}/doors/3”}]} ], links : [ { rel : “self”, href : “http://…/games{id}/doors”} ] }
蒙提霍尔门资源
48
PATCH (PUT) /games/{id}/doors/{id} {“status” : “SELECTED”}200 OK{status : “SELECTED”, content : “unknown”, links : [ {rel : “self”, href : “http://…/games{id}/doors/1”}
PATCH (PUT) /games/{id}/doors/{id} {“status” : “OPENED”}200 OK{status : “OPENED”, content : “juergen”, links : [ {rel : “self”, href : “http://…/games{id}/doors/1”}
设计模式
资源组装器 资源
域对象
表示控制器
• Spring MVC• Spring Hateoas
代码走查和演示
50
$> 演示
• 我们为何需要全新数据访问解决方案?• 它们应是什么样子的?• 我如何利用 Spring 构建这类应用程序?
数据访问
变革的动力
全新数据世界
53
数据革命
54
让数据发挥作用
55
Spring 的数据使命观
56
89% of all virtualized applications in the world run on VMware.
Gartner, December 2008“ 为大数据、 NoSQL 和关系存储提
供基于 Spring 的熟悉而一致的编程模型,同时保持存储所特有的特性和功能。
• 一致性• 准确性
– JPA != NoSQL
• 工作效率– 模板类– 对象映射– 存储库
• 横向整合– Spring Integration
– Spring Batch
– Gemfire 7.0
”从天南到海北,趣事无处不在!
57
编程模型
Gemfire
数据技术
JPA/JDBC
• 今年 60 次发布
• SpringOne 2GX 发布计划
• O’Reilly 图书
配置
58
@Configuration@ComponentScan@EnableTransactionManagement@EnableJpaRepositoriespublic class JpaConfig {
@Bean public DataSource dataSource() { ... }
@Bean public PlatformTransactionManager transactionManager() { ... }}
@Configuration@ComponentScan@EnableMongoRepositoriespublic class MongoConfig extends AbstractMongoConfig {
@Override public Mongo mongo() throws Exception { … } @Override protected String getDatabaseName() { … }
}
映射
59
@Entity@Table(name = "Orders")public class Order {
@ManyToOne(optional = false) private Customer customer;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "order_id") private Set<LineItem> lineItems = new HashSet<LineItem>();}
@Document(collection="Orders")public class Order {
@DBRef private Customer customer;
private Set<LineItem> lineItems = new HashSet<LineItem>();
...}
存储库
60
public interface ProductRepository extends CrudRepository<Product, Long>, QueryDslPredicateExecutor<Product> {
Page<Product> findByDescriptionContaining(String description, Pageable pageable);
@Query("select p from Product p where p.attributes[?1] = ?2") List<Product> findByAttributes(String attribute, String value);}
• 大数据问题也属于集成问题
横向集成
61
收集 转换 RT 分析 吸收 批量分析 分发 使用
Spring Integration & Data
Spring Hadoop + Batch
Spring MVCTwitter Search& GardenhoseTwitter Search& Gardenhose RedisRedis
• Spring Integration • Spring Data
代码走查和演示
$> 演示
接下来的内容 ?
Spring – 框架 下一版本主题• Java SE 8
– SE 8 语言功能与 Spring 编程模型自然契合• Java EE 7
– 支持 Jcache、 JMS 2.0、 JPA 2.1、 Bean Validation 1.1
• 应用程序内的注释驱动型消息侦听和注释驱动型事件• Websocket• 删除已弃用的类• 系统要求: Java SE 6+、 Java EE 5+
Spring Integration、 Batch、 Data
• 统一平台,可满足现有 + 新集成市场的需求
共享数据集成框架
• 通过单一模块化数据流 API 和 DSL ,将 Spring Integration、 Batch、 Data 结合起来•通用适配器、串行器、解串器•批量作业调度,数据处理管道整合
Spring Integration
•企业集成•企业消息传递•通道抽象•适配器
Spring Data
• 关系数据库与 NoSQL•对象映射•CRUD、存储库• 现在还有 Hadoop
Spring Batch
•批量作业调度•分析程序、映射程序•读写程序•局部处理等
• 简化 Java 开发• 帮助企业开发人员应对最艰巨的挑战
Spring …始终致力于
谢谢!