经验整理-15--源码篇-spring-mvc-springboot-100-@-待续

----------Spring----------

?为什么使用Spring? :
1:降低组件之间的耦合度,实现各层之间的解耦 
2:可以使用容器提供的众多服务。如: --事务管理服务 --JMS --Spring core核心服务 --持久化服务 
3:默认单例模式,节省内存(单例模式是饿汉模式,线程安全--因为类加载的时候创建实例,不会多线程重复创建)
4:提供了AOP技术。实现如:事物、日志、权限拦截,运行监控等功能
5:提供了众多的辅助类。如JDBC Template,HIbernate Template
6:对主流的应用框架提供了集成支持。集成Struts,JPA,Hibernate。
7:缺点:目前不支持集群

----------Spring IOC----------

    IOC(控制反转控,也叫做DI(Dependency Injection),中文意思叫容器依赖注入。)-------以Bean的方式来组织和管理Java应用中的各种组件,提供配置层次的解耦。所有的Bean都由Spring BeanFactory根据配置文件生成管理。ApplicationContext是BeanFactory的加强版继承类IOC管理生成Bean过程用的是工厂方法

?依赖注入 IOC?

IOC底层原理:
    1.xml配置文件
    2.dom4j解析xml
    3.工厂设计模式
    4.反射
   注意:scope="prototype"  作用范围 将单一bean的定义限制而在任意数量的对象实例

?IOC基于注解的主动装配?
(2)@Controller:web层
(3)@Service:service层
(4)@Repository:Dao层
@Autowired 标注成员变量时,不需要有set方法 
@Resource 默认按名称类匹配注入的,它是JDK提供的
注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在Spring配置文件中配置 <context:annotation-config/>元素。

Spring bean的生命周期 
bean的实例化: 
1:当作用域范围为singleton时,在初始化Spring容易的时候实例化bean实例。 
---1:如果lazy-init的值为true,则为延迟bean的实例化,即在Spring容器启动时不实例化bean的对象 
2:当作用域范围为prototype时,在调用Spring的getBean的方法时实例化bean对象
注入依赖对象可以采用手工装配或者自动装配,在实际应用中建议采用手工装配。因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。

bean的属性
id                       命名bean,id属性值,不能包含特殊符号
class                  创建对象所在类的全路径
name                功能与id一样,但是name可以包含特殊符号
scope                指定bean的作用域
        1.singleton:默认单例模式
        2.prototype:多例
        3.request:创建对象放入request作用域
        4.session:同上
        5. global session :同上


----------Spring AOP----------

    AOP:   Spring AOP也是Spring的核心技术,AOP擅长横切解决重复代码(OOP多态继承是纵向解决重复代码),事务管理,安全检查,缓存等。Spring并没有提供完整的AOP实现,Spring侧重于AOP实现与Spring IOC容器之间的整合,因此Spring AOP通常和Spring IOC一起使用。AOP使用了两种代理方式,JDK动态代理和CGLIB代理


?AOP?
什么是aop?
AOP(Aspect Oriented Programming) 面向切面编程
通过预编译方式和运行动态代理实现程序功能的统一维护
作用:能够无入侵性完成代码
切面:指在执行某些方法时,进入断点(切面)模式,在之前,之后或出现异常等做一些处理,
为什么会出现aop?
Aop和ioc都是解决代码的耦合性,可以增强代码的扩展性和可维护性
AOP实现可分为两类:
预编译方式 :在编译的时候已经做好了aop处理
运行期方式 :在运行时做aop处理

 ?那么什么是Aspectj ?
Aspectj 是一个面向切面的框架,Aspectj定义了AOP语法,Spring AOP底层也是使用了Aspectj的框架来实现操作的。
Spring AOP 和Aspectj的关系?
二者都是AOP技术
二者处理方式不一样:
Aspectj:在编译java代码时,(依赖ajc编译器)编译时增强,编译时增强。(属于静态织入);
Spring AOP:在运行时动态修改类(动态代理),生成新类,称为运行时增强(动态织入)
使用静态织入的方式性能要比动态高,但是动态织入更加方便
Spring AOP原理: 采用动态代理模式。
  Spring AOP采用动态代理的过程:
(1) 将切面使用动态代理的方式动态织入到目标对象(被代理类),形成一个代理对象;
(2) 目标对象如果没有实现代理接口,那么Spring会采用CGLib来生成代理对象,该代理对象是目标对象的子类;(3) 目标对象如果是final类,并且也没实现代理接口,就不能运用AOP。

AOP操作术语
Joinpoint(连接点): 类里面可以被增强的方法,这些方法称为连接点
Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义.
Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
Aspect(切面): 是切入点和通知(引介)的结合
Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.
Target(目标对象):代理的目标对象(要增强的类)
Weaving(织入):是把增强应用到目标的过程.
把advice 应用到 target的过程
Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类
Spring容器中的Bean
对于开发者来说,开发者使用Spring框架主要是做两件事:①开发Bean;②配置Bean。对于Spring框架来说,它要做的就是根据配置文件来创建Bean实例,并调用Bean实例的方法完成"依赖注入"——这就是所谓IoC的本质。

静态代理,jdk动态和cglib动态区别?
静态代理是代理实现类;动态代理是代理接口;
jdk动态是利用反射机制;jdk动态是利用字节码来实现类进行代码;

----------Spring 事物----------

事物拦截器的实现原理。
spring中的事务管理是通过AOP代理来实现的,对被代理对象的每个方法进行拦截,
在方法执行前启动事务,方法执行完后根据是否有异常和异常的种类进行提交或回滚。

事务的四大特性:ACID
    原子性(Atomicity)事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用 
    一致性(Consistency) 一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏
     隔离性(Isolation) 可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏 
    持久性(Durability) 一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中

?事物的两种实现方式?
手动控制事务,就叫做编程式事务控制
自动事物,Spring提供了对事务的管理, 这个就叫声明式事务管理,核心实现就是基于Aop

 

----------Spring MVC----------

SpringMVC工作原理?(结合DispatcherServlet源码而来)核心源码看过吗?

SpringMvc是spring的一个模块,基于MVC的一个框架,无需中间整合层来整合。https://blog.csdn.net/ywlmsm1224811/article/details/103250620
一、工作原理
1)客户端发送http请求给web服务器,web服务器对http请求url解析,如果url和web.xml中dispatcherServlet对应的请求url映射路径相匹配,则web服务器将请求转交给DispatcherServlet
2)DispatcherServlet接收到请求后根据请求的信息(包括请求URL、Http方法、请求报文头和请求参数Cookie等)和 HandlerMapping 中的映射配置找到处理请求的处理器 Handler
3)DispatcherServlet将处理权交给 Handler, 然后根据 Handler 和 handlerAdapters 找到对应的 HandlerAdapter
4)HandlerAdapter 对 Handler 进行具体的调用,处理http请求业务执行内容
5)Handler 对请求处理完成以后将返回一个 ModelAndView 对象给 DispatcherServlet,这个 ModelAndView 只是一个逻辑视图而不是一个真正意义上的视图
6)DispatcherServlet 通过 ViewResolver 将 ModelAndView 转化为真正的视图 view
7)DispatcherServlet 调用 View 的 render 方法(传参是 ModelAndView 中 Model)渲染 View 并返回给客户端

从SpringMVC工作原理可知,主要的工作就是在 DispatcherServlet 完成的,下面学习一下 DispatcherServlet 源码
二、核心源码
SpringMVC 的核心处理逻辑在 DispatcherServlet 中,重点看了一下DispatcherServlet 的源码,并且通过debug 调试了源码。
https://blog.csdn.net/ywlmsm1224811/article/details/103250620

发布了39 篇原创文章 · 获赞 0 · 访问量 781

猜你喜欢

转载自blog.csdn.net/qq_15458763/article/details/103988649