Day17

1. 说说Spring Boot的启动流程

  1. springboot项目会默认生成一个Application入口类,这个类中的main方法可以启动springboot项目
  2. main方法中,通过springApplication的静态方法,即run方法进行springApplication的实例化操作
  3. springApplication实例化对象调用另外一个run方法来完成整个项目的初始化和启动
  4. springApplication调用的run方法重点做了一下操作:
    1. 获取监听器参数配置
    2. 打印Banner信息
    3. 创建并初始化容器
    4. 监听器发送通知

2. 说说Spring Boot的自动装配

  1. 使用springboot时,我们需要引入对应的starter,springboot启动时便会自动加载相关依赖,配置相应的初始化参数,以最快捷、简单的形式对第三方软件进行集成,这便是springboot的自动配置功能
  2. 整个自动装配的过程是:springboot通过@EnableAutoConfiguration注解开启自动配置,加载spring.factories中注册的各种AutoConfiguration类,当某个AutoConfiguration类满足其注解@Conditinal指定的生效条件时,实例化该AutoConfiguration类中定义的Bean,并注入spring容器
  3. @EnableAutoConfiguration作用是从classpath中搜索所有META-INF/spring.factories配置文件,然后,将其中org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的配置项加载到spring容器

3. 简单介绍Spring

  1. spring框架包含众多模块,如Core,Testing,Data Access、Web Servlet等,其中Core是整个Spring框架的核心模块。Core模块提供了Ioc容器、Aop功能、数据绑定、类型转换等一系列的基础功能,而这些功能都是建立在IOC和AOP的基础上
  2. IOC是控制反转的意思,这是一种OOP的编程思想。在不采用这种思想的情况下,我们需要自己维护对象与对象之间的依赖关系,很容易造成对象之间耦合度过高,在一个大型的项目中这十分地不利于代码的维护。IOC则可以解决这种问题,他可以帮我们维护对象之间的依赖关系,降低对象之间的耦合度。说到IOC就不得不提到DI,DI是依赖注入的意思,他是实现IOC的实现方式,就是说IOC是通过DI来实现的。由于IOC这个词汇,即控制反转比较抽象,而DI却更直观,所以很多时候我们就用DI来代替它,习惯上我们将IOC和DI画等号。而实现依赖注入的关键是IOC容器,它的本质就是一个工厂。
  3. AOP是面向切面编程的思想,这种思想是对OOP的补充,他可以在OOP的基础上进一步提高编程效率。简单来说,他可以统一解决一批组件的共性需求(如权限检查、记录日志、事务管理等)。在AOP的思想下,我们可以将解决共性需求的代码独立出来,然后通过配置的方式,声明这些代码在什么地方,什么时机调用。当满足调用条件时,AOP会将该业务代码植入我们指定的位置

4. 说说你对IoC的理解

  1. IOC,即控制反转,是spring提供的用来解除对象之间高耦合的功能组件。假设A对象依赖于B对象,传统方式是先创建A对象,再创建B对象。然后A对象主动引入B对象。而引入IOC思想后,A对象和B对象根据其类的全限定名独自创建放入IOC容器中。然后IOC容器会根据对象之间的引用关系将B对象注入进A对象,整个流程中A对象由主动引入B对象变为了被动地注入B对象,这就是控制反转。
  2. IOC容器本质上就是一个用来装填JavaBean的Map。
  3. IOC流程:
    1. 通过@ComponentScan注解获取包扫描路径,并通过这些包下各个类中的Bean对象注解,例如@Service,@Controller,@Repository,@Autowired等建立对象之间的联系关系,以实现依赖注入
    2. 将这些扫描到的类对象装入一个set集合中
    3. 遍历set集合创建这些类实例放入IOC容器中
    4. 根据之前获取到的对象依赖关系实现依赖注入

5. 说说你对AOP的理解

  1. AOP是一种编程思想,是通过预编译方式和运行期动态代理方式实现在不修改源代码的情况下给程序动态统一添加功能的技术
  2. 面向对象编程将程序抽象成各个层次的对象,而面向切面编程时将程序抽象成各个切面。所谓切面,相当于应用对象间的横切点,我们可以将其抽象为单独的模块。AOP技术利用一种称为“横切”的技术,将影响多个类的公共行为封装到一个可重用的模块中,并将其命名为切面
  3. AOP可以有多种实现方式,而springaop支持如下两种实现方式:
    1. JDK动态代理. 这是Java提供的动态代理技术,可以在运行时创建接口的代理实例。springaop默认采用这种方式,在接口的代理实例中植入代码
    2. CGLib动态代理. 采用底层字节码技术,在运行时创建子类代理的实例。当目标对象不存在接口时,springaop就会采用这种方式,在子类实例中织入代码
    3. 在应用场景方面,springaop为IOC的使用提供了很多的便利,一方面,应用可以直接使用AOP的功能,设计应用的横切关注点,把跨越应用程序多个模块的功能抽象出来,并通过简单的AOP的使用,灵活地编制到模块中,比如可以通过AOP实现应用程序中的日志功能。另一方面,在spring的内部,例如事务处理之类的一些支持模块也是通过springaop来实现的。
    4. AOP不能增强的类:
      1. SpringAop只能对IOC容器中的Bean进行增强,对于不受容器管理的对象不能增强
      2. 由于CGLib采用动态创建子类的方式生成代理对象,所以不能对final修饰的类进行代理
最后修改:2024 年 06 月 08 日
如果觉得我的文章对你有用,请随意赞赏