Spring中使用了哪些设计模式

  1. 代理模式:AOP中使用
  2. 单例模式:Spring容器中的单例Bean
  3. 模板方法:RestTemplate、JmsTemplate
  4. 工厂模式:BeanFactory
  5. 依赖倒置原则(依赖注入):这个是设计原则,并不是设计模式。控制反转是OOP的原则,依赖注入是控制反的实现

    Spring的核心组件

    image.png

  6. 大模块

    1. 核心容器(Core Container)
    2. AOP
    3. 数据访问(Data Access/Integration):数据库、消息
    4. Web
    5. Test
  7. 核心包

    1. spring core:提供了框架的基本组成部分,依赖注入
    2. spring beans:提供BeanFactory
    3. spring context:对spring core的一层封装,提供面向用户的对象
    4. spring jdbc:提供了JDBC抽象层
    5. spring aop:面向切面编程
    6. spring web:Web开发功能
    7. spring test:测试功能

      Spring的IoC和DI概念

      控制反转即IoC (Inversion of Control):它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理
      依赖注入(DI):依赖注入是控制反转后的一个具体的过程,在组装Bean过程中,需要DI来为Bean注入依赖

      Spring高层视图

      image.png
  8. Bean的配置信息可以通过XML或Java配置类的方式配置

  9. Spring将读取这些配置,并转换为Bean定义注册表
  10. Spring容器根据Bean注册表信息依次实例化和初始化Bean对象
  11. 最后将组装好的Bean放入Spring容器中的Bean缓存池中

    Spring中BeanFactory构造

    image.png

  12. BeanDefinitionRegistry:Spring 配置文件中每一个节点元素在 Spring 容器里都通过一个 BeanDefinition 对象表示,它描述了 Bean 的配置信息。而 BeanDefinitionRegistry 接口提供了向容器手工注册BeanDefinition 对象的方法

  13. BeanFactory:顶层接口,主要方法是getBean()
  14. ListableBeanFactory:在BeanFactory的基础上增加了功能,新增定义了查看Bean个数等方法
  15. HierarchicalBeanFactory:在BeanFactory的基础上增加了可以访问父级容器的功能
  16. AutowireCapableBeanFactory:在BeanFactory的基础上提供了自动装配
  17. ConfigurableBeanFactory:增强了 IoC 容器的可定制性,它定义了设置类装载器、属性编辑器、容器初始化后置处理器等方法(继承了HierarchicalBeanFactory)
  18. ConfigurableListableBeanFactory:继承了ListableBeanFactory+HierarchicalBeanFactory
  19. SingletonBeanRegistry:定义了允许在运行期间向容器注册单实例 Bean 的方法
  20. DefaultSingletonBeanRegistry:是SingletonBeanRegistry的实现,提供了HashMap缓存Bean实例
  21. AbstractAutowireCapableBeanFactory :AutowireCapableBeanFactory+DefaultSingletonBeanRegistry
  22. DefaultListableBeanFactory:集大成者AutowireCapableBeanFactory +ConfigurationListableBeanFactory

Spring面试63问 - 图4

Spring中Context构造

image.png

  1. ApplicationEventPublisher:容器拥有发布订阅的功能
  2. MessageSource:为应用提供i18n国际化功能
  3. ResourcePatternResolver :资源定位功能
  4. ConfigurableApplicationContext:引入了LifeCycle接口,它新增加了两个主要的方法:refresh()和 close()。让 ApplicationContext 具有启动、刷新和关闭应用上下文的能力。在应用上下文关闭的情况下调用 refresh()即可启动应用上下文,在已经启动的状态下,调用 refresh()则清除缓存并重新装载配置信息,而调用 close()则可关闭应用上下文。
  5. LifeCycle:该接口是 Spring 2.0 加入的,该接口提供了 start()和 stop()两个方法,主要用于控制异步处理过程。在具体使用时,该接口同时被 ApplicationContext 实现及具体Bean 实现, ApplicationContext 会将 start/stop 的信息传递给容器中所有实现了该接口的 Bean,以达到管理和控制 JMX、任务调度等目的。

    ApplicationContext和BeanFactory

  6. ApplicationContext是BeanFactory的子接口

  7. ApplicationContext提供了除BeanFactory之外的其他功能,如:国际化、发布订阅、资源定位等功能

    Spring的依赖注入

    所谓依赖注入(Dependency Injection),即组件之间的依赖关系由容器在应用系统运行期来决定,也就是由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中。组件(Java对象)不做定位查询,只提供普通的Java方法让容器去决定依赖关系。

    原则

    应用组件不应该负责查找资源或者其他依赖的协作对象。配置对象的工作应该由IoC容器负责,“查找资源”的逻辑应该从应用组件的代码中抽取出来,交给IoC容器负责。容器全权负责组件的装配,它会把符合依赖关系的对象通过属性(JavaBean中的setter)或者是构造器传递给需要的对象。

    依赖注入实现方式

  • 接口注入(Spring4时已废弃)
  • setter注入
  • 构造器注入

    WebApplication的体系结构

    image.png

    Spring的作用域

  1. singleton:单例模式
  2. prototype:原型模式
  3. Request:一个Request一个实例
  4. session:同一次会话中有效
  5. global Session:仅在使用 portlet context 时有效

    5 种不同方式的自动装配

  6. no:不自动装配

  7. byName:依据名字
  8. byType:依据类型
  9. constructor:对构造方法中的参数按照byType自动装配
  10. autodetect:首先尝试construct,若无法工作,则使用byType

    使用@Autowired自动装配过程

  11. 开启

  12. 容器装载AutowiredAnnotationBeanPostProcessor,这个类会检测对象中的@Autowired注解

AOP原理

OOP(Object-Oriented Programming)面向对象编程,允许开发者定义纵向的关系,但并不适用于定义横向的关系,导致了大量代码的重复,而不利于各个模块的重用。
AOP(Aspect-Oriented Programming),一般称为面向切面编程,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。

应用场景

  1. 权限
  2. 缓存
  3. 事务
  4. 日志

    AOP核心概念

  5. 切面:切入点+通知。关注点的代码抽象

  6. 连接点:被拦截到的点
  7. 切入点:对连接点的拦截定义
  8. 通知:拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
  9. 目标对象:被代理的对象
  10. 织入:将切面应用到目标对象并导致代理对象创建的过程
    1. 编译器:AspectJ
    2. 类加载器:AspectJ5的加载时织入就支持以这种方式织入切面
    3. 运行期:SpringAOP就是以这种方式织入切面

      SpringAOP代理对象生成方式

  • JDK动态代理
  • Cglib

    通知执行顺序

  1. 无异常
    1. around before
    2. before
    3. 目标方法执行
    4. around after
    5. after
    6. after returning
  2. 有异常

    1. around before
    2. before
    3. 目标方法执行
    4. around after
    5. after
    6. after throwing

      SpringMVC原理

      image.png
  3. 浏览器发送HTTP请求到DispatcherServlet

  4. DispatcherServlet通过HandlerMapping寻找到HandlerExcutionChain(拦截器+Controller方法)
  5. 执行拦截器前置方法,调用Controller方法
  6. 接收Controller返回结果
  7. 执行拦截器的后置方法
  8. 寻找视图解析器获取相应的视图
  9. 视图将Model进行渲染后返回
  10. 调用拦截器的afterCompletion()方法

    Spring的常见注解

  11. 声明bean

    1. @Component
    2. @Controller、@Service、@Repository、@RestController
  12. 注入
    1. @Autowired:默认是根据类型(byType )进行自动装配的。如果有多个类型一样的Bean候选者,需要指定按照名称(byName )进行装配,则需要配合@Qualifier
    2. @Inject:JSR330 (Dependency Injection for Java)中的规范,@Named配合使用
    3. @Resource:JSR250规范,先按名字,没有后按照类型
  13. 配置类注解
    1. @Configuration:配置类注解
    2. @ComponentScan:扫描
    3. @Bean:注册Bean
    4. @WishlyConfiguration:@Configuration和 @ComponentScan的组合注解
  14. 切面相关
    1. @Aspect
    2. @PointCut
    3. @Before、@After、@Around
  15. @Bean的属性支持
    1. @Singleton、@Prototype、@Session、@Request
    2. @PostConstruct、@PreDestory
  16. @Value注解
  17. 环境切换
    1. @Profile
    2. @Conditional
  18. 异步相关
    1. @EnableAsync
    2. @Async
  19. 定时任务相关
    1. @EnableScheduling
    2. @Scheduled
  20. @Enable 注解说明
    1. @EnableTransactionManagement
    2. @EnableJpaRepositories
    3. @EnableAspectJAutoProxy
    4. @EnableWebMvc
    5. @EnableCaching
    6. @EnableConfigurationProperties
  21. MVC
    1. @EnableWebMvc:若无此句,重写WebMvcConfigurerAdapter方法(用于对SpringMVC的配置)。