Spring&SpringBoot

1.Spring框架

        Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性。我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发,比如说 Spring 支持 IoC(Inversion of Control:控制反转) 和 AOP(Aspect-Oriented Programming:面向切面编程)、可以很方便地对数据库进行访问、可以很方便地集成第三方组件(电子邮件,任务,调度,缓存等等)、对单元测试支持比较好、支持 RESTful Java 应用程序的开发。

2.Spring,SpringBoot,SpringMVC之间的关系

        Spring是基础,提供了全面的企业级应用开发支持。

        SpringMVC是基于Spring的Web开发框架,专注于Web应用的开发。

        SpringBoot则是在Spring的基础上,通过自动配置等特性,进一步简化了Spring应用的开发过程

3.SpringIoC

3.1 概念

        IoC(Inversion of Control:控制反转) 是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。

3.2 什么是Spring Bean

        Bean代指那些被IoC容器管理的对象

3.3 Bean的作用域有哪些

        singleton : IoC 容器中只有唯一的 bean 实例。Spring 中的 bean 默认都是单例的,是对单例设计模式的应用。

        prototype : 每次获取都会创建一个新的 bean 实例。也就是说,连续 getBean() 两次,得到的是不同的 Bean 实例。

        request (仅 Web 应用可用): 每一次 HTTP 请求都会产生一个新的 bean(请求 bean),该 bean 仅在当前 HTTP request 内有效。

        session (仅 Web 应用可用) : 每一次来自新 session 的 HTTP 请求都会产生一个新的 bean(会话 bean),该 bean 仅在当前 HTTP session 内有效。

        application/global-session (仅 Web 应用可用):每个 Web 应用在启动时创建一个 Bean(应用 Bean),该 bean 仅在当前应用启动时间内有效。

        websocket (仅 Web 应用可用):每一次 WebSocket 会话产生一个新的 bean。

3.4Bean的生命周期

创建 Bean 的实例:Bean 容器首先会找到配置文件中的 Bean 定义,然后使用 Java 反射 API 来创建 Bean 的实例。

Bean 属性赋值/填充:为 Bean 设置相关属性和依赖,例如@Autowired 等注解注入的对象、@Value 注入的值、setter方法或构造函数注入依赖和值、@Resource注入的各种资源。

Bean 初始化  

        如果 Bean 实现了 BeanNameAware 接口,调用 setBeanName()方法,传入 Bean 的名字。

        如果 Bean 实现了 BeanClassLoaderAware 接口,调用 setBeanClassLoader()方法,传入 ClassLoader对象的实例。

        如果 Bean 实现了 BeanFactoryAware 接口,调用 setBeanFactory()方法,传入 BeanFactory对象的实例。与上面的类似,

        如果实现了其他 *.Aware接口,就调用相应的方法。

        如果有和加载这个 Bean 的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessBeforeInitialization() 方法

        如果 Bean 实现了InitializingBean接口,执行afterPropertiesSet()方法。

        如果 Bean 在配置文件中的定义包含 init-method 属性,执行指定的方法。

        如果有和加载这个 Bean 的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessAfterInitialization() 方法。

销毁 Bean

        销毁并不是说要立马把 Bean 给销毁掉,而是把 Bean 的销毁方法先记录下来,将来需要销毁 Bean 或者销毁容器的时候,就调用这些方法去释放 Bean 所持有的资源。

        如果 Bean 实现了 DisposableBean 接口,执行 destroy() 方法。

        如果 Bean 在配置文件中的定义包含 destroy-method 属性,执行指定的 Bean 销毁方法。或者,也可以直接通过@PreDestroy 注解标记 Bean 销毁之前执行的方法。

4.Spring AOP

4.1 概念

        AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

        Spring AOP 就是基于动态代理的,如果要代理的对象,实现了某个接口,那么 Spring AOP 会使用 JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候 Spring AOP 会使用 Cglib 生成一个被代理对象的子类来作为代理

4.2 Spring AOP 和 AspectJ AOP有什么区别

        Spring AOP属于运行时增强,而AspectJ是编译时增强

4.3 AspectJ定义的通知类型有哪些

        Before(前置通知):目标对象的方法调用之前触发

        After(后置通知):目标对象的方法调用之后触发

        AfterReturning(返回通知):目标对象方法调用返回完成,在返回结果值之后触发

        AfterThrowing(异常通知):目标对象方法运行中抛出异常后触发

        Aroud()环绕通知:在任意的目标对象的方法调用前后触发,甚至不调用目标对象的方法

5. Spring MVC

5.1 概念

        MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码。

5.2 核心组件

   DispatcherServlet核心的中央处理器,负责接收请求、分发,并给予客户端响应。                       

         ​​​​​​​HandlerMapping处理器映射器,根据 URL 去匹配查找能处理的 Handler ,并会将请求涉及到的拦截器和 Handler 一起封装。

  HandlerAdapter处理器适配器,根据 HandlerMapping 找到的 Handler ,适配执行对应的 Handler

   Handler请求处理器,处理实际请求的处理器。

   ViewResolver视图解析器,根据 Handler 返回的逻辑视图 / 视图,解析并渲染真正的视图,并传递给 DispatcherServlet 响应客户端

6.Spring 设计模式

        工厂设计模式 : Spring 使用工厂模式通过 BeanFactoryApplicationContext 创建 bean 对象。

        代理设计模式 : Spring AOP 功能的实现。

        单例设计模式 : Spring 中的 Bean 默认都是单例的。

        模板方法模式 : Spring 中 jdbcTemplatehibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。

        包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。

        观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。

        适配器模式 : Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller

7.Spring 事务

  • 编程式事务:在代码中硬编码(在分布式系统中推荐使用) : 通过 TransactionTemplate或者 TransactionManager 手动管理事务,事务范围过大会出现事务未提交导致超时,因此事务要比锁的粒度更小。
  • 声明式事务:在 XML 配置文件中配置或者直接基于注解(单体应用或者简单业务系统推荐使用) : 实际是通过 AOP 实现(基于@Transactional 的全注解方式使用最多

你可能感兴趣的:(spring,spring,boot,java)