栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

八股文系列-Spring

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

八股文系列-Spring

Spring
  • SpringMVC
      • Spring MVC 的处理流程?
  • Spring
      • 什么是Spring?
      • Spring Bean的生命周期
      • 什么是Spring IOC?
      • IoC 容器初始化过程?
      • 依赖注入的实现方法有哪些?
      • 依赖注入的过程?
      • 什么是Spring AOP
      • Spring中用到了那些设计模式?
      • Spring怎么解决循环依赖的?
      • Spring事务失效问题
  • SpringBoot
      • SpringBoot自动配置的原理是什么?
      • Spring Boot Stater是怎么回事?
      • Spring Boot 中事务失效问题。
  • SpringCloud
      • 五大组件--注册中心nacos/eureka/zookeeper
      • 五大组件--Feign

SpringMVC Spring MVC 的处理流程?

所有的请求会转发给 DispatcherServlet 前端处理器处理,DispatcherServlet是SpringMVC中的枢纽,接收到请求后DispatcherServlet 会请求 HandlerMapping 找出容器中被 @Controler 注解修饰的 Bean 以及被 @RequestMapping 修饰的方法和类,生成 Handler 和 HandlerInterceptor 并返回一个处理器执行链。

之后 DispatcherServlet 使用 Handler 找到对应的 HandlerApapter,通过 HandlerApapter 调用 Handler 的方法,将请求参数绑定到方法的形参上,执行方法处理请求并得到 ModelAndView。

最后 DispatcherServlet 根据使用 ViewResolver 视图解析器对得到的 ModelAndView 逻辑视图进行解析得到 View 物理视图,然后对视图渲染,将数据填充到视图中并返回给客户端。

Spring 什么是Spring?

Spring是一个轻量级的java开发框架,目的是解决企业级应用开发的复杂性。Spring有两个核心特性,IOC和AOP。通过IOC容器管理Bean对象以及他们之间的依赖关系,以及IOC控制反转实现类之间的松耦合。通过AOP可以实现动态无侵入式的增强服务。

Spring Bean的生命周期

SpringBean的生命周期由IOC容器管理,通过实例化,属性注入,初始化

什么是Spring IOC?

IOC是一种设计思想,它将我们创建,配置对象和对象生命周期的控制权反转给了Spring的容器。通过IOC我们可以大大降低程序之间的耦合度,个人理解IOC容器就想工厂模式中的工厂,当实例化一个类的时候,通过依赖注入直接将他依赖的类注入给他,省去了很多代码,可以专注于对象的使用,开发也更简单。

IoC 容器初始化过程?

创建一个IOC容器时候,首先会调用父类的构造方法设置好Bean的资源加载器以及父类的setConfigLocations配置好Bean配置信息的路径。接下来,会调用父类AbstractApplicationContext 的refresh方法来启动容器对Bean信息的载入。容器创建后通过 loadBeanDefinitions 方法加载 Bean 配置资源,该方法做两件事:① 调用资源加载器的方法获取要加载的资源。② 真正执行加载功能,由子类 XmlBeanDefinitionReader 实现。Spring IoC 容器中注册解析的 Bean 信息存放在一个 HashMap 集合中,key 是字符串,值是 BeanDefinition

依赖注入的实现方法有哪些?

构造方法注入: IoC Service Provider 会检查被注入对象的构造方法,取得它所需要的依赖对象列表,进而为其注入相应的对象。这种方法的优点是在对象构造完成后就处于就绪状态,可以马上使用。缺点是当依赖对象较多时,构造方法的参数列表会比较长,构造方法无法被继承,无法设置默认值。对于非必需的依赖处理可能需要引入多个构造方法,参数数量的变动可能会造成维护的困难。

setter 方法注入: 当前对象只需要为其依赖对象对应的属性添加 setter 方法,就可以通过 setter 方法将依赖对象注入到被依赖对象中。setter 方法注入在描述性上要比构造方法注入强,并且可以被继承,允许设置默认值。缺点是无法在对象构造完成后马上进入就绪状态。

接口注入: 必须实现某个接口,接口提供方法来为其注入依赖对象。使用少,因为它强制要求被注入对象实现不必要接口,侵入性强。

依赖注入的过程? 什么是Spring AOP

AOP的目的是在不修改代码的情况下增强方法的功能。通过@Component注解将切面和增强类注入到容器中,通过动态代理模式生成代理对象,主要实现类是InvocationHandler和Proxy类。

ps:Cglib的底层原理是基于 asm 第三方框架,通过修改字节码生成成成一个子类,然后重写父类的方法,实现对代码的增强

Spring中用到了那些设计模式?

单例模式:Spring 中的 Bean 默认情况下都是单例的。
工厂模式:BeanFactory和ApplicationContext都是通过工厂模式来创建Bean
代理模式:AOP的主要就是通过动态代理模式来实现的,还有JDK动态代理
模板方法模式:主要是一些对数据库操作的类用到,比如 JdbcTemplate、JpaTemplate,因为查询数据库的建立连接、执行查询、关闭连接几个过程,非常适用于模板方法
原型模式:IOC容器,通过scope=“prototype” 来将创建的类设置为原型类

Spring怎么解决循环依赖的?

Spring通过三个缓存来解决缓存依赖,假如两个对象互相形成依赖,创建BeanA时,在执行了BeanA的构造方法后就将BeanA对象放入Spring的三级缓存singletonFactories,然后发现BeanA依赖BeanB,开始创建BeanB对象,执行完BeanB的构造方法后,放入三级缓存,处理BeanB的依赖BeanA时,发现三级缓存中有一个BeanA,拿到这个BeanA完成B的注入,同时也完成A的注入。

Spring事务失效问题

Spring事务 的本质其实就是数据库对事务的支持

获取连接 Connection con = DriverManager.getConnection()
开启事务con.setAutoCommit(true/false);
执行CRUD
提交事务/回滚事务 con.commit() / con.rollback();
关闭连接 conn.close();

失效原因
1、数据库引擎不支持事务
2、是否被加载为Bean
3、方法不是 public 的。 Spring 官方文档规定
4、自身调用问题

//下面两种都不生效
@Service
public class OrderServiceImpl implements OrderService {

    public void update(Order order) {
        updateOrder(order);
    }
    @Transactional
    public void updateOrder(Order order) {
        // update order
    }
}

@Service
public class OrderServiceImpl implements OrderService {
    @Transactional
    public void update(Order order) {
        updateOrder(order);
    }
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void updateOrder(Order order) {
        // update order
    }
}
 5.把异常吃了,然后又不抛出来,事务怎么回滚吧!
 6.异常类型错误,因为默认回滚的是:RuntimeException
SpringBoot SpringBoot自动配置的原理是什么?

在@SpringApplicaiton里面有个@EnableAutoConfiguration注解,这个注解中通@import(AutoConfigurationimportSelector.class)导入的配置功能,AutoConfigurationimportSelector中的方法getCandidateConfigurations,得到待配置的class的类名集合,这个集合就是所有需要进行自动配置的类,而是是否配置的关键在于meta-INF/spring.factories文件中是否存在该配置信息

Spring Boot Stater是怎么回事? Spring Boot 中事务失效问题。 SpringCloud 五大组件–注册中心nacos/eureka/zookeeper

nacos服务注册发现原理:

注册:
在nacos包下面的spring.factories可以看到一个NacosDiscoveryAutoConfiguration的自动配置类,里面有NacosAutoServiceRegistry, 这个类的实现了ApplicationListener事件监视器中的事件处理方法,在服务启动时会调用一个叫register的方法实现nacos服务注册。nacos会维护一个存放服务信息的hashmap用于服务发现。

nacos/eureka/zookeeper的区别

nacos支持配置中心,并且可以动态的刷新配置。nacos有管理界面

五大组件–Feign

概况:Feign通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的 Request 请求

Feign是通过JDK 代理对象完成远程访问。

在服务启动的时候,会进行包的扫描并且对加了@feignCLient注解的类创建一个JDK动态代理,注入到IOC容器中。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/324891.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号