Java面试-Spring-基础


  • Spring七大模块
    • Spring Context:继承BeanFactory,提供上下文信息,扩展出JNDI、EJB、电子邮件、国际化等功能
    • Spring DAO:提供了JDBC的抽象层,还提供了声明性事务管理方法
    • Spring ORM:提供了JPA、JDO、Hibernate、MyBatis 等ORM映射层
    • Spring AOP:集成了所有AOP功能
    • Spring Web:提供了基础的 Web 开发上下文信息,与现有的Web框架提供了集成
    • Spring Web MVC:提供了 Web 应用的 Model-View-Controller 模式
  • Spring支持的几种bean的作用域
    • singleton(单例) : bean在每个Spring ioc 容器中只有一个实例。多线程下不安全
    • prototype(原型):原型模型,每次使用时创建。一个bean的定义可以有多个实例
    • request:每次http请求都会创建一个bean。该作用域仅在基于web的Spring ApplicationContext情形下有效
    • session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效
    • global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效
  • Spring框架中的单例bean是线程不安全的
  • Spring依赖注入的方式:构造器注入;setter方法注入;属性注入
    • @Autowired按类型装配,@Resource默认按名称装配
  • ApplicationContext是BeanFactory的子接口
    • BeanFactory:是Spring里面最底层的接口,包含了各种Bean的定义,管理 bean 的加载、实例化,控制 bean 的生命周期,维护 bean 之间的依赖关系
      • 采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean 时(调用getBean()),才对该Bean进行加载实例化
      • 手动注册
    • ApplicationContext:提供在监听器中注册bean的事件;统一的资源文件访问方式;国际化;同时加载多个配置文件;载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的 web 层
      • 在容器启动时,一次性创建了所有的Bean
      • 自动注册
  • 三级缓存解决Bean的循环依赖(通俗的讲就是N个Bean互相引用对方,最终形成闭环)
    • 三级缓存
      • 一级缓存为单例池(singletonObjects)
      • 二级缓存为早期曝光对象earlySingletonObjects, 此时仅仅经过了实例化,并没有设置属性
      • 三级缓存为早期曝光对象工厂(singletonFactories)
    • 流程
      • 当A、B两个类发生循环引用时,在A完成实例化后,就使用实例化后的对象去创建一个对象工厂,添加到三级缓存中,如果A被AOP代理,那么通过这个工厂获取到的就是A代理后的对象,如果A没有被AOP代理,那么这个工厂获取到的就是A实例化的对象
      • 当A进行属性注入时,会去创建B,同时B又依赖了A,所以创建B的同时又会去调用getBean(a)来获取需要的依赖,此时的getBean(a)会从缓存中获取
    • 如果要使用二级缓存解决循环依赖,意味着所有Bean在实例化后就要完成AOP代理,这样违背了Spring设计的原则,Spring在设计之初就是通过AnnotationAwareAspectJAutoProxyCreator这个后置处理器来在Bean生命周期的最后一步来完成AOP代理,而不是在实例化后就立马进行AOP代理
    • 不能解决的情况:构造器注入;属性注入
    • 能解决的情况:setter方法注入
  • Spring 面向切面编程 AOP
    • 通知类型:@Before;@After;@AfterReturning;@AfterThrowing;@Around -> ProceedingJoinPoint
  • 拦截器:HandlerInterceptor;WebMvcConfigurer
  • 过滤器:Filter(Servlet)
  • SpringBoot:@SpringBootApplication(@ComponentScan;@EnableAutoConfiguration -> @Import)
  • SpringCloud:服务注册中心(比如 Eureka Server 和 Eureka Client)

文章作者: 钱不寒
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 钱不寒 !
  目录