觉得哪里好玩写到哪里
首先 Rod Johnson 感谢您!
一、 介绍
1、 Spring好处
- 老生常谈的IoC和AOP:解耦简化开发,将对象的依赖关系给Spring控制;面向切面编程,像黑客一样控制某个类或者某个方法的执行。
- 声明式事务:该事务是建立在AOP之上的,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或加入一个事务,在执行完目标方法之后根据执行情况提交或回滚事务。spring注解:@EnableTransactionManagement。
- 方便测试:非容器依赖
- 与其他框架集成方便
- 源码是Java实现的代码典范:nb
2、Spring的结构
- IoC
1、BeanFactory管理bean;
2、context的核心接口ApplicationContext,扩展了BeanFactory的能力、添加了bean声明周期的管理、国际化、事件等;
3、语言表达式#{}。
ApplicationContext:
- AOP
它是一个黑客,可以改变类或者方法的执行方式与结果。
- 数据访问和集成
与数据形式和访问方式无关的dao层,借助AOP实现了声明式事物的功能。
- Web及远程操作
基于Application Context,提供了Web使用的工具,如通过listener或servlet初始化spring容器,将spring容器注入到Web容器中。
如定制listener实现SpringApplicationRunListener,重写它的方法。
- Web及远程访问
SpringMVC
- WebSocket
浏览器和客户端只需要进行一次握手连接,就可以建立持久连接,进行双向数据传输,避免了http的轮询请求带来的资源浪费。
一次上传通知,前端发起上传请求,后端完成上传并修改数据状态,前端或是轮询去查询数据状态,或是建立WS连接,待后端上传成功后发WS通知给前端。当然是后者更nice。
3、新特性
- 全面支持JDK1.8
- 支持lambda表达式
- 支持重复注解的
@PropertySource,用来引入不同位置的配置文件 - optional终结NPE
从前:
现在:
- 核心容器增强
- 支持泛型依赖注入
- Map依赖注入
key是bean名字,value是所有实现了WithdrawService的bean
可以用这种方式,调用的时候根据名字去获取对应的实现类,但是名字得起的规范,还是不想这样用。withdrawServiceMap.get(channelId + WithdrawService.SERVICE_STR); - @Lazy延迟依赖注入
注解使用在需要被依赖注入的类上,比如service,调用时才加载该bean - List注入
注入所有实现了WithdrawService的bean,但是顺序不规则,可以结合@Order使用,指定加载顺序
- Web增强
增加@RestController注解,不需要在方法上写@ResponseBody了 - 支持WS
IoC
控制反转