• 揭秘Spring面试:吃透八股文,轻松拿下Offer!


    Spring的优点

    • 通过控制反转和依赖注入实现松耦合。
    • 支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
    • 通过切面和模板减少样板式代码。
    • 声明式事务的支持。可以从单调繁冗的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
    • 方便集成各种优秀框架。内部提供了对各种优秀框架的直接支持(如:Hessian、Quartz、MyBatis等)。
    • 方便程序的测试。Spring支持Junit4,添加注解便可以测试Spring程序。

    Spring 用到了哪些设计模式?

    1、简单工厂模式:BeanFactory就是简单工厂模式的体现,根据传入一个唯一标识来获得 Bean 对象。

    @Override
    public Object getBean(String name) throws BeansException {
        assertBeanFactoryActive();
        return getBeanFactory().getBean(name);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、工厂方法模式:FactoryBean就是典型的工厂方法模式。spring在使用getBean()调用获得该bean时,会自动调用该bean的getObject()方法。每个 Bean 都会对应一个 FactoryBean,如 SqlSessionFactory 对应 SqlSessionFactoryBean。
    3、单例模式:一个类仅有一个实例,提供一个访问它的全局访问点。Spring 创建 Bean 实例默认是单例的。
    4、适配器模式:SpringMVC中的适配器HandlerAdatper。由于应用会有多个Controller实现,如果需要直接调用Controller方法,那么需要先判断是由哪一个Controller处理请求,然后调用相应的方法。当增加新的 Controller,需要修改原来的逻辑,违反了开闭原则(对修改关闭,对扩展开放)。
    为此,Spring提供了一个适配器接口,每一种 Controller 对应一种 HandlerAdapter 实现类,当请求过来,SpringMVC会调用getHandler()获取相应的Controller,然后获取该Controller对应的 HandlerAdapter,最后调用HandlerAdapter的handle()方法处理请求,实际上调用的是Controller的handleRequest()。每次添加新的 Controller 时,只需要增加一个适配器类就可以,无需修改原有的逻辑。
    常用的处理器适配器:
    SimpleControllerHandlerAdapter,HttpRequestHandlerAdapter,
    AnnotationMethodHandlerAdapter。

    // Determine handler for the current request.
    mappedHandler = getHandler(processedRequest);
    
    HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
    
    // Actually invoke the handler.
    mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
    
    public class HttpRequestHandlerAdapter implements HandlerAdapter {
    
        @Override
        public boolean supports(Object handler) {//handler是被适配的对象,这里使用的是对象的适配器模式
            return (handler instanceof HttpRequestHandler);
        }
    
        @Override
        @Nullable
        public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
    
            ((HttpRequestHandler) handler).handleRequest(request, response);
            return null;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    5、代理模式:spring 的 aop 使用了动态代理,有两种方式JdkDynamicAopProxy和Cglib2AopProxy。
    6、观察者模式:spring 中 observer 模式常用的地方是 listener 的实现,如ApplicationListener。
    7、模板模式: Spring 中 jdbcTemplate、hibernateTemplate 等,就使用到了模板模式。

    什么是AOP?

    面向切面编程,作为面向对象的一种补充,将公共逻辑(事务管理、日志、缓存等)封装成切面,跟业务代码进行分离,可以减少系统的重复代码和降低模块之间的耦合度。切面就是那些与业务无关,但所有业务模块都会调用的公共逻辑。

    AOP有哪些实现方式?

    AOP有两种实现方式:静态代理和动态代理。
    静态代理:代理类在编译阶段生成,在编译阶段将通知织入Java字节码中,也称编译时增强。AspectJ使用的是静态代理。

    缺点:代理对象需要与目标对象实现一样的接口,并且实现接口的方法,会有冗余代码。同时,一旦接口增加方法,目标对象与代理对象都要维护。

    动态代理:代理类在程序运行时创建,AOP框架不会去修改字节码,而是在内存中临时生成一个代理对象,在运行期间对业务方法进行增强,不会生成新类。

    未完待续…

    彩蛋

    点击下方链接,免费获取更多Java开发相关材料,欢迎大大们催更。
    https://docs.qq.com/doc/DU0JJZE1nckF1V0Nt

  • 相关阅读:
    关于3D-AIGC的调研与探讨
    兼容cc1101/cmt2300-DP4301 SUB-1G 无线收发芯片
    vue 虚拟dom和diff算法详解
    Python视频剪辑-Moviepy音频效果afx方法
    万宾科技智能井盖的效果怎么样?
    详细解说iptables 高阶用法,用来完成哪些高效率网络路由策略场景,iptables 实现域名过滤,Linux如何利用iptables屏蔽某些域名?
    IGP高级特性简要介绍(OSPF-上篇)
    Win11如何添加默认打印机?
    pandas合并操作
    攻防世界-unseping
  • 原文地址:https://blog.csdn.net/yangbaggio/article/details/133745359