Spring
Spring是什么:
Spring是一个轻量级开源javaEE框架,主要特性IOC和AOP,可以和很多框架集成,比如Mybatis,Hibernate,strusts,还有它的简化版springBoot;Spring提供类对MVC Web框架的实现
##隔离级别
- REQUIRED 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务
- SUPPORTS 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。 MANDATORY 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
- REQUIRES_NEW 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
- NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务。
- NEVER 总是非事务地执行,如果存在一个活动事务,则抛出异常
- NESTED如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行
层级:
- DAO层:数据访问层,属于一种比较底层,对于某个表的增删改查,也就是说某个DAO一定是和数据库的某一张表一一对应的,其中封装了增删改查基本操作
- Service层:对一个或多个DAO进行的再次封装,封装成一个服务,所以这里也就不会是一个原子操作了,需要事物控制。 service的impl是把mapper和service进行整合的文件
- Controler层:Controller负责请求转发,接受页面过来的参数,传给Service处理,接到返回值,再传给页面。
- entity层。存放我们的实体类,与数据库中的属性值基本保持一致
- 总结: DAO面向表,Service面向业务。后端开发时先数据库设计出所有表,然后对每一张表设计出DAO层,然后根据具体的业务逻辑进一步封装DAO层成一个Service层,对外提供成一个服务。
IOC:控制反转
- spring是一个ioc容器,容器就是放数据的。ioc容器实际上就是个map(key-value),里面存的是各种对象(在xml里配置的bean节点||repository、service、controller、component),
- 在项目启动的时候会读取配置文件里面的bean节点,根据类名使用反射new对象放到map里;
- 扫描到打上的上面那些注解的类通过反射new对象放到map里 这个时候map里就有各种对象了,如果用到这些对象的话,再通过DI注入(autowired、resource等注解)
ioc容器初始化过程:
- 定位并加载配置文件
- 解析配置文件中的bean节点,一个bean节点对应一个BeanDefinition对象(这个对象会保存我们在Bean节点内配置的所有内容,比如id,全限定类名,依赖值等等)
- 根据上一步的BeanDefinition集合生成(BeanDefinition对象内包含生成这个对象所需要的所有参数)所有非懒加载的单例对象,其余的会在使用的时候再实例化对应的对象。
- 依赖注入
AOP
- 就不需要手动的创建动态代理,你加入注解或者配置以后,也能在方法执行前创建一个动态代理,
- 动态代理的目的就是在方法执行前后可以加入一些操作管理方法的结果 。
- 就是本来手动创建动态代理,变成了spring帮你创建。
- AOP一般是基于注解(aop通常由注解,切面类,注解的类完成),所以还需要配合注解扫描。
- 生命周期 www.zhihu.com/question/38…
静态代理:
(代码运行前就确定好,生成class文件,每个代理类为一个接口服务,手动创建的类) 步骤:设置一个接口类,再写一个委托类实现接口,再写一个代理类,实现接口并代理委托类
动态代理
- (为其他对象提供一个代理以控制对某个对象的访问;为其他对象提供一个代理以控制对某个对象的访问;在运行中,需要代理的地方,通过Proxy.getProxyClass()),复制了一个Class, 但是可以在class添加一些新的内容/功能,然后这个class可以创建实例,就是代理对象,一个代理类可以搞定所有的代理类)
- 主要使用InvocationHandler 负责统一管理所有的方法调用,------------- 设置一个接口-写一个接口的实现——通过Proxy类和InvocationHandler------------- 接口构造ProxyConstructor;------------- 在Invoke下增加委托类的逻辑代码------------- —通过 ProxyConstructor 实例化一个代理对象,------------- 将 InvocationHandler 接口实例传递给代理类-通过 Proxy.newProxyInstance 方法 获取代理对象------------- invoke(Object proxy, Method method, Object[] args) ,通过invoke里的proxy类实现newProxyInstance 原理:newProxyInstance通过getProxyClass0的方法实现,
- 例子: DUbbo里:ProxyFactory ,使用的是动态代理,我们在本地获取到了接口的代理类 在 invoke 方法中将参数传给对应的服务,服务端在接收到数据后,使用反射调用对应的实现类,完成处理后将结果返回给调用端。
JDK/CGlib
CGlib无需通过接口,使用的是继承的方式,通过重写业务方法进行代理; glib代理无需实现接口,通过生成类字节码实现代理,比反射稍快
反射:
- 在运行状态中,对于类能够知道这个类的属性,方法,构造方法;不用修改原有代码,开销比较大;
- 使用方法:class.forName - 创建object对象实例 -
- getConstructor获得构造器/getMethod获得方法名/get Field获得public变量
- 原理:Java 中,生成某个类的多少个对象,这些对象对应于同一个 Class 对象。 这个 Class 对象是由 JVM生成的,通过它能够获悉整个类的结构。所以,java.lang.Class 可以视为所有反射 API 的入口点
注解
-
@controller 控制器(注入服务)
-
@ResponseBody的作用其实是将java对象转为json格式的数据,将前端东西转给json供处理
-
@RestController 注解相当于 @Controller + @ResponseBody 合在一起的作用
-
@component 添加为组件(把普通pojo实例化到spring容器中,相当于配置文件中的)
-
@RequestParam:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)
-
@RequestMapping是一个用来处理请求地址映射的注解 场景启动器stater
-
@EnableAutoConfiguration:让SpringBoot开启自动配置功能
SpringMVC
##什么是SPringMVC SpringMVC框架是以请求为驱动,围绕Servlet设计,将请求发给控制器,然后通过模型对象,分派器来展示请求结果视图。其中核心类是DispatcherServlet,它是一个Servlet,
DispatchServlet怎样分发任务的
- 用户发请求-->DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制。
- DispatcherServlet-->HandlerMapping,HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器,多个HandlerInterceptor拦截器)。
- DispatcherServlet-->HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器。
- HandlerAdapter-->处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理,并返回一个ModelAndView对象(包含模型数据,逻辑视图名
- ModelAndView的逻辑视图名-->ViewResolver,ViewResoler将把逻辑视图名解析为具体的View。
- View-->渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构
- 返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户。