一、spring
1.什么是spring
spring是一个轻量级 ,非侵入式 ,IOC 和AOP 的一站式 开发框架
轻量级:
非侵入式:
IOC:
由spring IOC容器管理对象,面向接口式编程,耦合度降低 AOP:
一站式框架 目的:
2.spring有哪些模块
1 test测试模块 2 核心模块Core Container 3 AOP(切面编程) 4 DAO 5 WEB
3.核心模块Core Container:
管理Beans,Spring核心,配置文件,SPEL表达 IOC
控制反转:将程序中生成对象 的控制权 反转给了spring框架 (容器) 单例Bean:在spring启动时创建,只有**一个,**程序关闭时销毁 原型的:每次使用时创建,不在使用时,垃圾回收 DI
依赖注入 创建对象时,向对象属性注入值
构造方法注入 set方法注入 xml函数注入< bean > 注解方式实现 : byName ,byType
@Resource(name = “userDao”) jdk自带的 根据bean的名称查找 @Autowired(required = true) spring的 根据属性类型查找 UserDao userdao 只需要声明,运行时spring会帮我们的
4.AOP(切面编程)
AOP框架Aspects AOP使用代理的思路 就是让别人代理我们去做某些事情,
在添加新的功能 时,不需要修改源代码 新功能 ,都是一个公共的 ,与业务关系不大 ,让代理对象去调用 连接点(joiinpoint): 类中可以被增强的方法,此方法被称为连接点
切入点: 实际被增强的方法 通知: 连接点要做的事情
五种类型: 前置通知,后置通知,环绕通知,异常通知,最终通知 切面: 把通知加入的过程 目标: 原增强的类(实际的执行者) 代理: 配置装有通知的类 面向切面的好处就是减少重复,专注业务
5.DAO
jdbc管理,事务管理,ORM JDBC
数据库连接管理事务
编程式事务(手动进行事务的提交) 声明式事务(使用)只需要添加事务标签声明(出现异常自动回滚,没有异常提交事务 ) 事务的特征,事务的隔离级别
事务的传播行为 (spring自动代理功能 ) 7种传播行为(A调用B)
required必须
supports支持
requirenew独立
传播行为失效
调用本类中的方法 方法必须是public 传播行为的使用不当 try catch后也会失效 数据库引擎不支持事务
6.WEB
mvc运行流程 1 浏览器发起请求
被前端请求分发器(DispacherServlet)拦截 2 DispacherServlet调用HandlerMapping(映射处理器)找到处理器(控制台)
将解析的结果返回给DispacherServlet 若配置了拦截器,还会调用拦截器 3 DispacherServlet调用对应的控制器
在到达控制器之前,会先进入HandlerAdopter(处理适配器)进行参数的封装和数据类型的转换 4 最终到我们自己写的控制器中,接受,处理数据
返回ModelAndView(包含视图名,数据) 返回DispacherServlet 5 DispacherServlet将结果交给视图解析器找到对应的jsp文件 6 把Model(数据)交给你view(jsp) 7 在由jsp做出最后的响应
7. BeanFactory和ApplicationContext
都是Spring的接口 BeanFactory是框架中最基础的接口,
定义了获取bean判断等功能 spring要生成并管理对象,底层使用的是工厂模式 ApplicationContext也继承了BeanFactory接口 区别:
BeanFactory是最顶层的接口,里面只是基础的功能定义 ApplicationContext继承了BeanFactory,并扩展了功能 使用ApplicationContext实现在spring启动时,创建了单例Bean 使用BeanFactory实现在spring启动时,不会创建单例Bean
8.spring Bean的生命周期
spring框架创建出来的对象与我们自己new的对象是不同的 在触发创建Bean的整个过程
1 实例化Insnstantiation就是new,创建一个原始对象 2 属性赋值populate,给属性注入值 3 初始化Initalization,初始化Bean,根据我们的配置为Bean添加额外的功能
如果 Bean 实现 BeanNameAware 执行 setBeanName 如果 Bean 实现 BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext 对象. 初始化 如果存在类实现 BeanPostProcessor(AOP) ,执行postProcessBeforeInitialization 如果 Bean 实现 InitializingBean 执行 afterPropertiesSet如果配置了自己的初始化方法 如果存在类实现 BeanPostProcessor(AOP) ,执行 postProcessAfterInitialization 4 将Bean对象放入容器中使用 5 销毁Destruction
9.spring Bean是线程安全嘛
单例的 不是安全的 原型的 是线程安全 创建多个对象,每个对象中都包含一份成员变量
LoginController {
int count= 1 ;
LoginService loginService;
public void test ( ) {
int num = 0 ;
count++ ;
num++ ;
System . out. print ( count)
}
}
如上述java所示
当多个线程访问test()方法时, A线程访问test()方法时,count++, count变成了2,num++,num变成了1 B线程访问,count++, count变成了3,num++,num变成了1 可得count是不安全的,但每次进入test()时num都固定为0,即num是安全的 综上得
单例bean是线程不安全的, 又分为有状态的 存储数据如: count=1; 无状态的 如: num=0; LoginService loginService ; 只是调用方法,不存在数据共享.是安全的 总结:
单例bean有状态 的线程不安全 单例bean无状态 的线程安全 原型 的是线程安全
10.Spring Bean 循环依赖
class A {
B b= null ;
}
class B {
A a = null ;
}
A a = new A ( ) ;
B b = new B ( ) ;
a. b= b;
b. a = a;
如上述代码
在java中,访问A类创建A对象,此时A中的b为空, 在访问B类创建B对象,此时B中的a为空, 在将b赋给a类的b, 在将a赋给b类的a.形成依赖关系 eg:
人使用手机,人类,手机类,每个人对应一个手机,每个手机对应一个人 手机与人形成依赖 简单说,就是A对象依赖了B对象,B对象依赖了A对象. 如果不考虑Spring,循环依赖并不是问题,因为对象之间相互依赖是很正常的事情 但是在Spring中自动注入时会发生循环依赖的问题,
在Spring Bean的生命周期的过程中,创建原始对象,属性注入值(注入时默认值不能为空) 解决:
提供了3个级别缓存,来存储不同阶段对象 一级缓存:实例化,注入,初始化完成的Bean 二级缓存:实例化的半成品Bean 三级缓存:添加有代理(AOP)功能的Bean
A创建原始对象—缓存起来 依赖B—创建B原始对象缓存起来 注入A,从缓存中查找半成品A B初始化, 把B从缓存中拿到赋给A和B.
二、Spring Boot
在SSM基础上
Spring缺点:
大量模板配置文件 项目依赖 一旦选错依赖的版本,随之而来的不兼容问题,就会严重阻碍项目的开发进度 SpringBoot
基于约定优于配置的思想 目的:简化应用的初始搭配以及开发过程 核心:起步依赖,自动配置
三、前后端分离
1.核心思想
前端html页面通过ajax调用后端的restful(controller)api接口并使用json数据进行交互
2.前后端分离的优势
前后端的解耦,前端进行页面跳转 发现bug可快速查到准确位置,页面问题一定是前端的 减轻后端服务器的压力 即使后端服务暂时超时或者宕机,前端页面也会正常访问,只不过获得不到数据 若也有app相关服务,只需通过代码重构,共用接口,提升效率(多端应用) 异步加载,边走边加载 不重启服务器 增强代码的维护性,易读性 提升开发效率,前后端并行开发,不像以前的强依赖,分工更明确 更安全,加密了,更部署数字证书 组件代码可以复用
3.MVC后端架构
MVC
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。
Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。 View(视图) - 视图代表模型包含的数据的可视化。 Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开 MVVM
MVVM 模式代表 Model-View-View-Model(模型-视图-视图-模型) 模式
我们以前都是将数据渲染到dom, 而现在我们可以实现数据到dom,dom到数据的双向绑定 前后端数据全部通过AJAX和JSON访问