Spring Boot的优势和Spring的区别
Spring Boot优势:
- 快速开发,提高了生产力,适合构建微服务系统
- 避免编写大量的样板代码、注释和xml配置
- springBoot集成了很多成熟的组件,如mybatis、redis和mongdb等
Spring Boot劣势:
- 集成度太高,使用过程不容易了解底层,一旦出现bug很难发现问题根源。
- 已存在的spring项目难以转化为springboot项目。
Spring Boot JPA和MyBatis的区别
SpringBoot JPA和MyBatis是什么
JPA和MyBatis都是ORM(object relational mapping)的一种实现框架,都对JDBC的一种封装。
springboot jpa默认采用hibernate作为ORM实现,它对JDBC进行了轻量级的对象封装,它将POJO(java普通对象)与数据库建立映射关系,可以自动生成sql语句。
MyBatis是一款优秀的持久化框架,支持定制化SQL、存储过程以及高级映射。使用简单的xml或注解来配置和映射原生信息,将POJO映射成数据库中的记录。
SpringBoot JPA和MyBatis区别
hibernate自动化更强,省去了大部分sql语句的编写,采用面向对象的方式操作关系型数据库,属于更高级的框架。但是处理复杂业务时,灵活度差。
mybatis在sql语句编写方面更加灵活自由(方便之后进行sql优化),采用面向关系的方式操作数据库。
因此从理念上讲,如果说hibernate属于ORM Mapping, 那么mybatis相当于SQL Mapping。这句话总结的很到位,hibernate中操作对象相当于操作表,Mybatis中操作对象相当于操作sql。
AOP原理
使用AOP的目的
将那些与业务无关,却被多个业务模块所共同调用的逻辑代码封装起来,减少系统的重复代码,提高代码的可维护性。
AOP使用场景
权限控制、日志记录、异常处理、数据校验、事务管理等
AOP实现原理
AOP思想的实现一般是基于代理模式,主要的实现技术有Spring AOP和AspectJ
- AspectJ
AspectJ采用的是静态代理,在业务代码编译时将AOP代码织入,相比Spring AOP动态代理技术,性能更好。 - Spring AOP
Spring AOP采用的是动态代理,在运行期间对业务代码进行增强。
对于动态代理技术,Spring AOP提供了对JDK动态代理的支持和CGLIB的支持。
JDK动态代理只能为接口创建动态代理实例,不能对类创建动态代理。首先生成一个实现了代理接口的动态代理类,然后通过反射机制获得动态代理类的构造函数并生成一个动态代理类的实例对象,在调用具体方法前调用invokeHandler方法来处理。
如果目标对象的实现类没有实现接口,Spring AOP将会采用CGLIB来生成AOP代理类。
Spring IOC原理
IOC原理:
在没有引入IOC容器之前,对象A如果依赖于对象B,对象A要使用对象B的时候,就必须自己去创建对象B或者使用已经创建的对象B。无论创建还是使用对象B,控制权都在自己手上。
引入IOC容器后,对象A与对象B之间失去了直接联系,当对象A运行到需要使用对象B的时候,由IOC容器创建一个对象B注入到对象A中。
所以什么是控制反转,总结起来就是一句话,获得依赖对象的控制权由自身转移到了第三方容器上(IOC容器)。
依赖注入是IOC原理实现的一种方式。
依赖注入:在IOC容器运行期间,将依赖关系动态注入到对象之中。
依赖注入(DI)的三种方式
- 构造方法注入
- setter方法注入
- 基于注解的注入
Spring常用注解
- @Component
所有受Spring管理组件的通用形式,可以放在类的头上,但是不推荐使用 - @Controller(value=**)
标识表现层的Bean,value可以指定Bean的名字 - @Service(value=**)
标识业务层的Bean,value同样可以指定Bean的名字 - @Repository
标识数据访问层的Bean,value同样可以指定Bean的名字 - @Scope(”singleton“)
标识Bean对象的作用域,主要有以下几种作用域:
- singleton 单例模式——全局仅有一个实例
- prototype 原型模式——每次获取Bean的时候会有一个新实例
- request ——每一次HTTP请求会生成一个新实例,仅在当前HTTP request内有效
- session——每一次HTTP请求会生成一个新实例,仅在当前HTTP session内有效
- @Autowired
用来注入依赖,即装配Bean,默认按照类型装配(byType自动注入策略) - @Qualifier
一般作为@Autowired()的修饰用,@Autowired是根据类型进行自动装配的。如果当Spring上下文中相同类型的bean不止存在一个时,就会抛出BeanCreationException异常,因此需要@Qualifier唯一标识出所要装配的Bean对象。 - @Resource
同样用来注入依赖,可以按照Bean对象的名称(byName注入)或者类型(byType注入)进行装配。如果没有指定name和type,那么先对name进行匹配,匹配失败再对type进行匹配。