反射机制,Spring AOP 底层实现原理,springmvc的工作原理,Spring七大模块

简述Java的反射机制和使用场景

反射是Java的一种机制,可以让我们在运行时获取类的信息
通过反射我们可以获取到类的所有信息,比如它的属性、构造器、方法、注解等
适用于需要动态创建对象的场景。

  1. Java反射机制有什么作用?

    答:反射可以让程序在运行时具有检测自己和获取当前运行环境的能力。

    理解反射机制要了解静态编译和动态编译,静态编译时在程序运行之前编译时期就以及确定的,动态编译则可以才程序运行期间,使程序自己改变自己的行为模式或逻辑,具有高度的灵活性。典型的编程设计模式动态代理就是在运行时期完成的编译

  2. Java反射机制有什么优缺点?

    答:

    优点:增强程序灵活性和可拓展性,可帮助程序进行解耦合,提高自身的适应能力

    缺点:

    1、 性能问题。
    Java反射机制中包含了一些动态类型,所以Java虚拟机不能够对这些动态代码进行优化。因此,反射操作的效率要比正常操作效率低很多。我们应该避免在对性能要求很高的程序或经常被执行的代码中使用反射。而且,如何使用反射决定了性能的高低。如果它作为程序中较少运行的部分,性能将不会成为一个问题。
    2、安全限制。
    使用反射通常需要程序的运行没有安全方面的限制。如果一个程序对安全性提出要求,则最好不要使用反射。
    3、程序健壮性。
    反射允许代码执行一些通常不被允许的操作,所以使用反射有可能会导致意想不到的后果。反射代码破坏了Java程序结构的抽象性,所以当程序运行的平台发生变化的时候,由于抽象的逻辑结构不能被识别,代码产生的效果与之前会产生差异。

Spring AOP 底层实现原理说一下?

简单说说 AOP 的设计:

  1. 每个 Bean 都会被 JDK 或者 Cglib 代理。取决于是否有接口。
  2. 每个 Bean 会有多个“方法拦截器”。注意:拦截器分为两层,外层由 Spring 内核控制流程,内层拦截器是用户设置,也就是 AOP。
  3. 当代理方法被调用时,先经过外层拦截器,外层拦截器根据方法的各种信息判断该方法应该执行哪些“内层拦截器”。内层拦截器的设计就是职责连的设计。

是不是贼简单。事实上,楼主之前已经写过一个简单的例子,地址:使用 Cglib 实现多重代理

看完之后更简单。

可以将 AOP 分成 2 个部分来扯,哦,不,来分析。。。 第一:代理的创建; 第二:代理的调用。

注意:我们尽量少贴代码,尽量用文字叙述,因为面试的时候,也是文字叙述,不可能让你把代码翻出来的。。。所以,这里需要保持一定的简洁,想知道细节,看 interface 21 源码,想知道的更细,看 Spring Framework 最新的 master 分支代码。

代码位置:com.interface21.aop 包下。

开始分析(扯):

  1. 代理的创建(按步骤):
  • 首先,需要创建代理工厂,代理工厂需要 3 个重要的信息:拦截器数组,目标对象接口数组,目标对象。
  • 创建代理工厂时,默认会在拦截器数组尾部再增加一个默认拦截器 —— 用于最终的调用目标方法。
  • 当调用 getProxy 方法的时候,会根据接口数量大余 0 条件返回一个代理对象(JDK or Cglib)。
  • 注意:创建代理对象时,同时会创建一个外层拦截器,这个拦截器就是 Spring 内核的拦截器。用于控制整个 AOP 的流程。
  1. 代理的调用
  • 当对代理对象进行调用时,就会触发外层拦截器。
  • 外层拦截器根据代理配置信息,创建内层拦截器链。创建的过程中,会根据表达式判断当前拦截是否匹配这个拦截器。而这个拦截器链设计模式就是职责链模式。
  • 当整个链条执行到最后时,就会触发创建代理时那个尾部的默认拦截器,从而调用目标方法。最后返回。

springmvc的工作原理?

​ springmvc最新版本是基于servlet3.0开发的。

​ 入口是springmvc-web这个包下的META-INF/services目录下的javax.servlet.ServletContainerInitializer中配置的是SpringServletContainerInitializer这个类,这个类实现ServletContainerInitializer接口,加载WebApplicationInitializer这个类的所有子类实现,并初始化DispatcherServlet和springmvc的IOC容器(Servlet容器,spring的是Root容器),即是WebApplicationContext(WebApplicationContext继承了ApplicationContext)。

​ 流程:

​ 1,springmvc的核心控件是DispatchServlet,DispatchServlet是一个中央控制器,用户从客户端向服务器发送http请求,请求首先发送到DispatchServlet,再由DispatchServlet将请求分发给HandlerMapping(处理器映射器)。

​ 2,HandlerMapping(处理器映射器)根据请求url寻找到对应的处理器(controller),并且寻找是否存在在处理器执行之前的处理器拦截器(HandlerInterceptor),返回给DispatchServlet。

​ 3,HandelAdapter(处理器适配器)再根据请求,在处理器映射器返回的处理器中寻找具体的执行方法,去执行具体的处理器。

​ 4,执行具体的方法中之后会返回一个ModelAndView对象给DispatchServlet。

​ 5,DispatchServlet收到ModelAndView这个对象,但是这是一个逻辑试图,需要用试图解析器进行解析。

​ 6,ViewResolver(试图解析器)将ModelAndView进行解析,将解析后的结果返回给DispatchServlet。

​ 7,DispatchServlet将解析之后的视图再返回给客户端。

Spring七大模块,如下:

​ 1,Spring Core: Core封装包是框架的最基础部分,提供IOC和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。

​ 2,Spring Context: 构建于Core封装包基础上的 Context封装包,提供了一种框架式的对象访问方法,比如JNDI注册器。Context封装包的特性得自于Beans封装包,并添加了对国际化(I18N)的支持(例如资源绑定),事件传播,资源装载的方式和Context的透明创建,比如通过Servlet容器。

​ 3,Spring DAO: DAO (Data Access Object)提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码。 并且,JDBC封装包还提供了一种比编程性更好的声明性事务管理方法,不仅仅是实现了特定接口,而且对所有的POJOs(plain old Java objects)都适用。

​ 4,Spring ORM: ORM 封装包提供了常用的“对象/关系”映射APIs的集成层。 其中包括JPA、JDO、Hibernate 和 iBatis 。利用ORM封装包,可以混合使用所有Spring提供的特性进行“对象/关系”映射,如前边提到的简单声明性事务管理。

​ 5,Spring AOP: Spring的 AOP 封装包提供了符合AOP Alliance规范的面向方面的编程实现,让你可以定义,例如方法拦截器(method-interceptors)和切点(pointcuts),从逻辑上讲,从而减弱代码的功能耦合,清晰的被分离开。而且,利用source-level的元数据功能,还可以将各种行为信息合并到你的代码中。

​ 6,Spring Web:Spring中的 Web 包提供了基础的针对Web开发的集成特性,例如多方文件上传,利用Servlet listeners进行IOC容器初始化和针对Web的ApplicationContext。当与WebWork或Struts一起使用Spring时,这个包使Spring可与其他框架结合。

​ 7,Spring Web MVC: Spring中的MVC封装包提供了Web应用的Model-View-Controller(MVC)实现。Spring的MVC框架并不是仅仅提供一种传统的实现,它提供了一种清晰的分离模型,在领域模型代码和Web Form之间。并且,还可以借助Spring框架的其他特性。

猜你喜欢

转载自blog.csdn.net/tzydzj/article/details/113742970