660 likes | 820 Views
Spring 未来展望. Mark Pollack 博士. 议题. 部署到云或内部部署. 统一组件模型 全新 Web 应用程序架构 NoSQL 与大数据. NoSQL 、大数据. 核心 模型. Web 、 集成、 批处理. 是否记得此书 … ?. 对此框架是否还有印象?. 某些方面已经改变 …. 版本 0.9 (25.6.2003) 中的变化 ---------------------------------- 与 《 Expert One-on-One J2EE Design and Development》 同时问世的版本之后的首次公开发布
E N D
Spring 未来展望 Mark Pollack 博士
议题 部署到云或内部部署 • 统一组件模型 • 全新 Web 应用程序架构 • NoSQL 与大数据 NoSQL、大数据 核心模型 Web、集成、批处理
某些方面已经改变… • 版本 0.9 (25.6.2003) 中的变化 • ---------------------------------- • 与《Expert One-on-One J2EE Design and Development》同时问世的版本之后的首次公开发布 • 后续各种非官方 0.8 CVS 快照
某些方面仍保持原样 • 版本 0.9 (25.6.2003) 中的变化 • ---------------------------------- • 与《Expert One-on-One J2EE Design and Development》同时问世的版本之后的首次公开发布 • 后续各种非官方 0.8 CVS 快照 • 通过 Commons Logging 提供日志 • 改进的 web 框架 • 常规的加强和修正 • 全新示例应用程序 "Petclinic"
某些方面仍保持原样 • “我认为 Spring 是独一无二的,原因如下: • 它解决了其他许多流行框架所没有解决的重要问题 • Spring 既是综合性的,也是模块化的 • Spring 设计为从零开始帮助您编写易于测试的代码 • Spring 是一项日显其重要性的集成技术” • - Rod Johnson, TheServerSide.com, 2005
还记得此模型吗? 简单 对象 Simple Object 依存关系注入 (DI) 面向方面编程 (AOP) 可移植服务抽象
注释透视 注释组件 Simple Object 注入注释 可组合构造型 面向服务的注释
一个典型注释组件 @Service publicclassMyBookAdminService implementsBookAdminService { @Autowired publicMyBookAdminService(AccountRepository ar) { … } @Transactional publicBookUpdate updateBook(Addendum addendum) { … } }
1. 可组合构造型模型 用于自定义构造型的强大选项 @Service @Scope("request") @Transactional(rollbackFor=Exception.class) @Retention(RetentionPolicy.RUNTIME) public@interfaceMyService {} @MyService public classBookAdminService { … }
2. 注入注释 Spring 的 @Autowired 和 @Value 与 JSR-330 的 @Inject 的对照 @Autowired publicMyBookAdminService(@Qualifier("myRepo")AccountRepository ar, @Value("#{systemProperties.databaseName}") String dbName) { … } @Inject publicMyBookAdminService(@Named("myRepo")AccountRepository ar) { … }
3. 面向服务的注释 例如,声明性事务和声明性计划 @Transactional publicBookUpdate updateBook(Addendum addendum) { … } @Scheduled(cron = "0 0 12 * * ?") public voidperformTempFileCleanup() { … }
示例:声明性缓存 基于全功能缓存抽象 @Cacheable publicOwner loadOwner(int id); @Cacheable(condition="name.length < 10") publicOwner loadOwner(String name); @CacheEvict publicvoiddeleteOwner(int id);
@RequestMapping(value = "/books/{id}", method = GET) publicBook findBook(@PathVariable("id")long id) { returnthis.bookAdminService.findBook(id); } 示例:Spring MVC - @PathVariable http://mybookstore.com/books/12345
示例:声明性模型验证 • publicclassBook { • @NotNull • @Past • privateDate releaseDate; • } • @RequestMapping("/books/new") • public void newBook(@Valid Book book) { … } • JSR-303“Bean验证”作为共用基础
示例:声明性格式设定 注释推动的数字和日期格式设定 publicclass 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. */ publicclassMyWebAppInitializer implementsWebApplicationInitializer { publicvoidonStartup(ServletContext sc) throwsServletException { // Create the 'root' Spring application context AnnotationConfigWebApplicationContext root =newAnnotationConfigWebApplicationContext(); root.scan("com.mycompany.myapp"); root.register(FurtherConfig.class); // Manages the lifecycle of the root application context sc.addListener(newContextLoaderListener(root)); ... } }
配置类 @Configuration publicclassMyBookAdminConfig { @Bean publicBookAdminService myBookAdminService() { MyBookAdminService service = newMyBookAdminService(); service.setDataSource(bookAdminDataSource()); returnservice; } @Bean publicDataSource bookAdminDataSource() { … } }
不依赖 XML 的 JPA 设置 @Configuration publicclassMyBookAdminConfig { @Bean publicFactoryBean myEntityManagerFactoryBean() { LocalContainerEntityManagerFactoryBean emfb =newLocalContainerEntityManagerFactoryBean(); emfb.setPackagesToScan(“com.mycompany.myapp”); emfb.setDataSource(bookAdminDataSource()); returnemfb; } @Bean publicDataSource bookAdminDataSource() { … } }
总结 Spring 与众不同的注释组件模型 可组合构造型模型 注入注释 面向服务的注释 灵活的逐步构建选项 如果需要:完全不依赖 XML 的部署
应用程序架构 • 我们为何需要全新应用程序架构? • 这种架构应是什么样子的? • 我如何利用 Spring 构建这类应用程序?
变革的动力 用户 期望 • 数据 • 全新客户 • 端设备 • QoS • Internet 范围??? • 艰难熬过 AWS 故障 • 企业 • 期望 • 混合这一必然趋势
客户端 基于浏览器的 HTML 呈现 (逐步增强) 浏览器 HTML HTTP 视图 生成 控制器 应用程序 服务器 服务层 通道 存储库 RDBMS 服务器 CRUD
客户端 HTML5 和 JS 引擎 浏览器应用程序或本机嵌入 客户端模型 web 暂存 JSON HTTP 和 websocket 事件 和通知 服务层 DOM 控制器 通道 存储库 RDBMS 服务器 CRUD
客户端 HTML5 和 JS 引擎 浏览器应用程序或本机嵌入 客户端模型 web 暂存 业务/ 域服务 JSON HTTP 和 websocket 事件 和通知 服务层 DOM 控制器 云/ PaaS 服务 服务 服务 通道 存储库 RDBMS CRUD
客户端 HTML5 和 JS 引擎 浏览器应用程序或本机嵌入 客户端模型 web 暂存 业务/ 域服务 JSON HTTP 和 websocket 事件 和通知 DOM 控制器 服务 服务 服务 PaaS CRUD 通道 存储库 RDBMS
客户端 HTML5 和 JS 引擎 浏览器应用程序或本机嵌入 客户端模型 web 暂存 业务/ 域服务 JSON HTTP 和 websocket 事件 和通知 DOM 控制器 服务 服务 服务 服务 服务 服务 平台服务、Web API SQL NoSQL PaaS 其他
HTML5 & JS Engine 应用程序 HTML5 (及本机) JSON HTTP 和 Websocket 事件 和 通知 PaaS 服务
蒙提霍尔游戏 毛茸茸、憨态可掬的灰色小倭狐猴! http://www.factzoo.com/mammals/gray-mouse-lemur-small-furry-gray.html
蒙提霍尔游戏 坚持还是改变主意?
客户端代码走查和演示 • Cujo • curl • wire • when • aop • 单击 $> 演示
应用程序、REST 和 WebSocket 本机 应用程序 应用程序商店 (Web 应用 程序)及服务 REST ws: SPA 下载 交互 基于浏览器的应用程序
采用 Spring 进行基于 REST 的 API 设计 • 以 Spring MVC 为基础 • Spring Data REST • 通过 CRUD 进行基本实体管理 • 构建于… • Spring HATEOAS • 链接生成器 • 资源组装器
蒙提霍尔游戏资源 POST /games 201 Created Location : /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”}]}
蒙提霍尔门资源 GET /games/{id}/doors 200 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”} ] }
蒙提霍尔门资源 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 $> 演示
数据访问 • 我们为何需要全新数据访问解决方案? • 它们应是什么样子的? • 我如何利用 Spring 构建这类应用程序?