Spring Boot、Spring MVC 和 Spring 有什么区别
spring是一个IOC容器,用来管理Bean,使用依赖注入实现控制反转,可以很方便的整合各种框架,提
供AOP机制弥补OOP的代码重复问题、更方便将不同类不同方法中的共同处理抽取成切面、自动注入给
方法执行,比如日志、异常等
springmvc是spring对web框架的一个解决方案,提供了一个总的前端控制器Servlet,用来接收请求,
然后定义了一套路由策略(url到handle的映射)及适配执行handle,将handle结果使用视图解析技术
生成视图展现给前端
springboot是spring提供的一个快速开发工具包,让程序员能更方便、更快速的开发spring+springmvc
应用,简化了配置(约定了默认配置),整合了一系列的解决方案(starter机制)、redis、mongodb、es,可以开箱即用
1 Sping
1.1 xml 实例化bean
- 使用无参构造方法实例化
它会根据默认无参构造方法来创建类对象,如果bean中没有默认无参构造函数,将会创建失败<bean id="userDao" class="com.cn.dao.impl.UserDaoImpl"/>
- 工厂静态方法实例化
工厂的静态方法返回Bean实例<bean id="userDao" class="com.cn.factory.StaticFactoryBean" factory-method="createUserDao" />
- 工厂实例方法实例化
工厂的非静态方法返回Bean实例public class DynamicFactoryBean { public UserDao createUserDao(){ return new UserDaoImpl(); } }
<bean id="factoryBean" class="com.cn.factory.DynamicFactoryBean"/> <bean id="userDao" factory-bean="factoryBean" factory-method="createUserDao"/>
1.2 BeanFactory和Application
1.3 Spring Bean的生命周期
- 通过包扫描路径,解析类得到BeanDefintion(定义)
- 确定构造方法,实例化得到对象
- 依赖注入,属性填充
- 回调Aware接口,比如BeanNameAware,BeanFactoryAware
- 调用初始化方法
- 调用BeanPostProcessor的初始化后的方法,这里会进行AOP(哪些类需要动态代理的创建)
- 当前bean是单例就会放到单例池
- 使用bean
- 容器关闭时调用
destory( )
方法销毁bean
1.4 Bean 的作用域
- singleton :默认,(相对于容器来说)每个容器只有一个bean的实例
- prototype:每一个getBean都会创建一个新的对象,每次注入都会创建一个新的对象
- session:每个session中有一个bean实例
- application:bean被定义为在ServletContext的生命周期中复用一个单例对象
- global-session:全局作用域
1.5 bean自动装配
- xml 配置文件中定义
autowrite
属性 - @Autowired自动装配bean,可以在字段、setter方法、构造函数上使用。
1.6 Spring框架中的单例bean是线程安全的吗?
不是线程安全,框架没有对bean封装处理
把作用域改为多例 protopyte
不要在bean中生明有任何状态的实例变量
1.7 Spring框架中用到的设计模式
- 简单工厂:由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。
Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是
在传入参数后创建还是传入参数前创建这个要根据具体情况来定。 - 工厂方法:
- 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点
- 动态代理:
切面在应用运行的时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象创建动态的创建一个代理
对象。SpringAOP就是以这种方式织入切面的。
织入:把切面应用到目标对象并创建新的代理对象的过程。
1.8 Spring事务的实现方式,隔离级别
@Transactional
注解声明
隔离级别
read uncommitted(未提交读)
read committed(提交读、不可重复读)
repeatable read(可重复读)
serializable(可串行化)
数据库的配置隔离级别是Read Commited,而Spring配置的隔离级别是Repeatable Read,请问这时隔离
级别是以哪一个为准?
以Spring配置的为准,如果spring设置的隔离级别数据库不支持,效果取决于数据库
2 SpringMVC
SpringMVC 工作流程
- 用户发送请求到前端控制器
- 根据请求调用处理映射器查找对应处理方法
- contriller执行业务代码后返回ModeleAndView到前端控制器
- 前端控制器通过视图解析器进行视图渲染
- 然后响应到用户
SpringMvc里面拦截器是怎么写的
一种是实现HandlerInterceptor接口,
另外一种是继承适配器类,接着在接口方法当中,实现处理逻辑;然后在SpringMvc的配置文件中配置拦截器即可
如何自定义注解?
-
创建一个自定义注解:与创建接口类似,但自定义注解需要使用 @interface
-
添加元注解信息,比如 @Target、@Retention、@Document、@Inherited 等
-
创建注解方法,但注解方法不能带有参数
-
注解方法返回值为基本类型、String、Enums、Annotation 或其数组
-
注解可以有默认值;
@Target(FIELD)
@Retention(RUNTIME)
@Documented
public @interface CarName {
String value() default "";
}
SpringMvc怎么和AJAX相互调用的?
通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象。具体步骤如下 :
(1)加入Jackson.jar
(2)在配置文件中配置json的映射
(3)在接受Ajax方法里面可以直接返回Object、List等,但方法前面要加上@ResponseBody注解。
3 Mybatis
底层运行原理
1、MyBatis应用程序根据XML配置文件创建SqlSessionFactory;
2、SqlSessionFactory在根据配置,配置来源于两个地方,一处是配置文件,一处是Java代码的注解,获取一个SqlSession;
3、SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运行映射的sql语句,完成对数据的增删改查和事务提交等;
4、用完之后关闭SqlSession
缓存
sqlSession
#{ } 和 ${ }的区别?
- #{}是预编译处理、是占位符,
${}
是字符串替换、是拼接符。
Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的set方法来赋值;
Mybatis 在处理${}
时, 就是把${}
替换成变量的值,调用 Statement 来赋值; - 使用#{}可以有效的防止 SQL 注入, 提高系统安全性。
mapper 传递多参
@param
动态sql
resultType,resultMap
Mybatis-Plus
mybatis 基础上的增强,简化开发
使用:
- 导入依赖,如果有注释掉之前mybatis的依赖
- 如果MyBatis plus有自定义mapper文件,地址配置的由mybatis-mapper-locations改为mybatis-plus.mapper-locations
- 给实体类加注解
@TableName(“user”) 加载类上 将该类和数据库中对应的表建立联系 注解值为表名
@TableId(value = “对应表列名”,type = IdType.AUTO) 建立主键属性和主键字段之间的联系。 value 字段名, type 定义主键自增类型 IdType.AUTO MySQL自动递增
常规属性@TableField(“name”) 将常规属性和常规字段名建立联系
连表查询 封装数据的属性 没有对应的字段 需要定义忽略
@TableField(exist = false) exist = false代表当前属性在表中没有字段名
mybatis-plus 分页实现
在后端代码中的controller层中,实现一个IPage对象的实例引用,然后设置总记录数及每页显示条数