1.SpringBoot和Spring的区别是什么?
典型回答
Spring是一个非常强大的企业级Java开发框架,提供了一系列模块来支持不同的应用程序,如依赖注入、面向切面编程、事务管理、Web应用程序开发等。而SpringBoot的出现简化了Spring应用程序的开发和部署,特别是构建微服务和快速开发的应用程序
相比于Spring,SpringBoot主要在几个方面提升使用Spring的效率,降低开发成本。
- 自动配置
SpringBoot通过Auto-Configuration来减少开发人员的配置工作。我们可以通过依赖一个starter就把一坨东西全部都依赖进来,是开发人员可以更专注于业务逻辑而不是配置 - 内嵌Web服务器
Spring Boot内置了常见的Web服务器,这意味着可以轻松创建可运行的独立应用程序,而无需外部Web服务器 - 约定大于配置
SpringBoot中有很多约定大于配置的思想的体现,通过一种约定的方式,来降低开发人员的配置工作。如他默认读取spring.factories来加载Starter、读取application.properties或application.yml文件来进行属性配置等。
2.Spring中常用的的设计模式
1.工厂模式
工厂模式是java中最常用的设计模式之一。这种类型的设计模式属于创建型设计模式,他提供了一种创建对象的最佳方式,在工厂模式中,我们创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新的创建对象。
简单地说,就是有个类=的工厂,工厂中有专门生产类的方法,有了这个工厂,就可以直接去工厂获取类,不需要自己去创建。Spring中BeanFactory就是工厂模式的体现,通过getBean方法来获取Bean对象。
2.策略模式
在策略模式中,一个类的行为或者算法可以在运行时修改
。这种类型的模式属于行为型模式。在策略模式中, 我们创建表示各种策略对象和一个行为随着策略对象改变而改变的context对象,策略对象改变context对象的执行算法 。
Spring中提供了InstantiationStrategy实例化策略接口,其中有两个实现,分别是SimpleInstantiationStrategy以及 CglibSubclassingInstantiationStrategy。
Spring中提供了 InstantiationStrategy接口,该就扣提供了更强的资源访问能力,Spring框架本身大量使用了Resource接口来访问底层资源。
3.观察者模式
当对象间存在一对多关系时,则使用观察者模式。比如,当一个对象被修改时,则会自动通知依赖它的对象,观察者模式属于行为型模式。
Spring事件驱动模型中的三个角色:
Spring中默认的几种事件,都是对 ApplicationContextEvent 的实现:
ContextStartedEvent:ApplicationContext 启动后触发的事件;
ContextStoppedEvent:ApplicationContext 停止后触发的事件;
ContextRefreshedEvent:ApplicationContext 初始化或刷新完成后触发的事件;
ContextClosedEvent:ApplicationContext 关闭后触发的事件。
事件监听者角色:ApplicationListener 充当了事件监听者角色,它是一个接口,里面只定义了一个 onApplicationEvent()方法来处理ApplicationEvent,在 Spring中我们只要实现 ApplicationListener 接口实现 onApplicationEvent() 方法即可完成监听事件
事件发布者角色:ApplicationEventPublisher 接口的publishEvent()这个方法在AbstractApplicationContext类中被实现,阅读这个方法的实现,你会发现实际上事件真正是通过ApplicationEventMulticaster来广播出去的
Spring 的事件流程总结为
定义一个事件:实现一个继承自 ApplicationEvent,并且写相应的构造函数;
定义一个事件监听者:实现 ApplicationListener接口,重写 onApplicationEvent()方法
使用事件发布者发布消息:可以通过ApplicationEventPublisher 的 publishEvent() 方法发布消息。
4.模板模式
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。一般情况下,我们都是使用继承的方式来实现模板模式,但是 Spring 并没有使用这种方式,而是使用Callback 模式与模板方法模式配合,既达到了代码复用的效果,同时增加了灵活性。
5、适配器模式
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。
实现方式:SpringMVC中的适配器HandlerAdatper。
实现原理:HandlerAdatper根据Handler规则执行不同的Handler。
实现过程:DispatcherServlet根据HandlerMapping返回的handler,向HandlerAdatper发起请求,处理Handler。HandlerAdapter根据规则找到对应的Handler并让其执行,执行完毕后Handler会向HandlerAdapter返回一个ModelAndView,最后由HandlerAdapter向DispatchServelet返回一个ModelAndView。
实现意义:HandlerAdatper使得Handler的扩展变得容易,只需要增加一个新的Handler和一个对应的HandlerAdapter即可。
因此Spring定义了一个适配接口,使得每一种Controller有一种对应的适配器实现类,让适配器代替controller执行相应的方法。这样在扩展Controller时,只需要增加一个适配器类就完成了SpringMVC的扩展了。