1、解耦。(下降各个组件还有各层之间的耦合度)html
2、可使容器提供众多的服务。(如:事务管理、日志管理)前端
3、单例模式的支持。(容器提供单例模式的支持,开发人员不须要本身去编码实现)java
4、AOP技术。(利用AOP能够实现权限拦截等功能)web
5、容器提供众多的辅助类。(这些辅助类能够加快项目的应用开发)面试
6、轻松与其它框架整合、集成。spring
IOC(控制反转):应用的自己不须要去建立和维护对象,而是交给它的外部容器去负责,这样控制权就交给了外部容器,从而耦合在一块儿。数据库
(如:咱们知道,在java中,实例化对象有三种方法:类构造器、静态工厂方法、实例工厂方法。在传统的java开发模式中,咱们须要用new来建立或者getInstance等直接或间接调用构造方法来建立一个对象;而在spring开发模式中,spring使用工厂模式为咱们建立了所须要的对象,咱们使用时,不须要本身去建立,而是直接去调用spring为咱们所提供的对象便可,这就是控制反转的思想。)编程
DI(依赖注入):运行期间,对象由外部容器动态的注入到组件中,让Bean与Bean之间以配置文件组织在一块儿,而不是以硬编码的方式。(Spring使用JavaBean对象的Set方法或者带参数的构造方法为咱们建立所需对象时将其属性自动设置成咱们须要的值的过程就是依赖注入的思想。)api
AOP(面向切面):开发人员只须要关心点或横切典型的职责分界线的行为(如:日志和事务管理),进行模块化。AOP原理是:Spring采用JDK的动态代理来实现。(在面向对象的思想中,咱们将事务纵向抽象成一个个的对象,而在spring的面向切面编程中,咱们将某些相似的方面横向抽象成一个切面,对这些切面进行一些如:权限验证、事务管理、日志管理等公用操做过程就是面向切面编程的思想。)浏览器
(1)代理模式——Spring中AOP原理是:Spring采用JDK的动态代理来实现。
(2)单例模式——Spring的配置文件中定义Bean默认为单例模式。
(3)前端控制器模式——Spring提供Dispatcherservlet来对请求进行分发。
(4)工厂模式——在工厂模式中,咱们建立对象是不会对客户端暴露咱们建立的逻辑,而是提供一个共同的接口来指向新建立的对象。Spring中使用BeanFactory来建立对象的实例。
Spring支持两种事务:一种是编程式事务,一种是声明式事务。
编程式事务:这意味你经过编程的方式来管理事务,能够给你带来极大的灵活性,可是比较难以维护。
声明式事务:这意味你能够将业务代码和事务管理分离,你只需用注解和xml配置来管理事务,具备良好的适应性。
它和数据库事务同样,必须服从ACID原则:原子性、一致性、隔离性、持久性。
通俗理解,事务是一组原子操做单元,从数据库的角度来讲,事务是一组SQL指令,要么所有执行,要么所有撤销不执行。
(1)原子性:事务中最基本的操做单元,要么所有成功,要么所有失败,而后回滚。
(2)一致性:保证事务在执行以前和执行以后数据库都保持一致的状态。
(3)隔离性:指的是并发环境下,当不一样的事务同时操做相同的数据时,每一个事务都有各自完整数据空间。
(4)持久性:表示事务执行完毕后,数据库的数据是永久保存在数据库中的。
并发事务问题
(1)第一类丢失更新:撤销一个事务时,把其余事务已提交更新的数据覆盖。
(2)脏读:一个事务读取到另外一个事务未提交的更新数据。
(3)幻读和虚读:一个事务执行两次查询,第二次结果集包含第一次中没有或某些已经删除的数据,形成两次数据结果不一致;这是其中一个事务在这两次查询还在进行之中,插入或删除形成的。
(4)不可重复读:两个事务同时读取到同一条数据,此时恰好其中一个更新了数据,两个结果相异,不可被信任。
(5)第二类丢失更新:在不可重复读的状况下。若是两个事务都读取同一行,而后两个都进行了读写操做并提交,第一个事务所作的改变就会丢失。
package com.springboot.demo.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class MyController { @RequestMapping("/hello") public String Hello() { return "Hello 欢迎来到SpringBoot世界!"; } }
开发RESTful API 时,通常都会在Controller上加上@Controller注解,可是有时候加上@RestController,看了资料,说说他们的区别:
@RestController注解等价于@ResponseBody + @Controller。@RestController和@Controller的共同点是都用来表示Spring某个类是否能够接收HTTP请求,两者区别: @RestController没法返回指定页面,而@Controller能够;前者能够直接返回数据,后者须要@ResponseBody辅助。
① 是否能够返回页面
答:@RestController没法返回指定页面,而@Controller能够。
解析:对于Controller, 若是只是使用@RestController注解,则其方法没法返回指定页面,此时配置的视图解析器 InternalResourceViewResolver不起做用,返回的内容就是 return 里的内容。 若是须要返回到指定页面,则须要用 @Controller配合视图解析器InternalResourceViewResolver才行。
② 返回内容
若是须要返回JSON,XML或自定义mediaType内容到页面,@RestController本身就能够搞定,这个注解对于返回数据比较方便,由于它会自动将对象实体转换为JSON格式。而@Controller须要在对应的方法加上@ResponseBody注解。
@RequestMapping:是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的全部响应请求的方法都是以该地址做为父路径。
@SpringBootApplication:主程序注解,用来开启springboot的各项能力。
-----------------------------------------------------------END----------------------------------------------------------------
qq:2931445528
微信:Y2931445528