这是我参与8月更文挑战的第28天,活动详情查看:8月更文挑战
前言
在关于Spring和Springboot中,需要了解的知识可以说是天马行空,所谓活到老学到老,以AOP和IOC为中心轴延伸的知识点,今天就来做个简易的杂谈
历练
SpringBoot自动配置的原理是什么?
- SpringBoot的核心就是自动配置,自动配置又是基于条件判断来配置Bean。关于自动配置的源码在spring-boot-autoconfigure-2.0.3.RELEASE.jar
- 一般来说,我们获取配置都是在YML上写好配置,在Bean中使用注解@ConfigurationProperties(pefix=“前缀”)获取值得;
- 然而自动配置的话就是在SpringBoot启动的时候通过注解(@EnableAutoConfiguration),而是是否配置的关键在于META-INF/spring.factories文件中是否存在该配置信息,有的话就对其进行加载,而这些自动配置类的类名都是以AutoConfiguration结尾来命名的,它实际上就是一个javaConfig形式的Spring容器配置类,它们都有一个@EnableConfigurationPerperties的注解,通过这个注解启动XXXProperties命名的类去加载全局配置中的属性,如server.port,而XXXProperties通过@ConfigurationProperties注解将全局配置文件中的属性与自己的属性进行绑定
运行 SpringBoot 有哪几种方式?
-
打成jar包或者war包,然后用命令行执行
-
用 Maven/ Gradle 插件运行 (mvn xxx)
-
直接启动项目中的main方法执行
什么是 AOP?
在软件开发过程中,跨越应用程序点对点之间的功能称为交叉问题。这些交叉问题与应用程序的主要业务逻辑不同。很简单的例子,在业务中,经常有日志记录等功能,这些功能与业务无关,但是又必须监控每一个方法的调用;因此,将这些横切关注与业务逻辑分开是面向方面编程(AOP)的地方。
Spring的AOP理解
- OOP面向对象,允许开发者定义纵向的关系,但并不适用于定义横向的关系,会导致大量代码的重复,而不利于各个模块的重用。
- AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,提高系统的可维护性。可用于权限认证、日志、事务处理。
AOP实现的关键在于 代理模式,AOP代理主要分为静态代理和动态代理。静态代理的代表为AspectJ;动态代理则以Spring AOP为代表。
(1)AspectJ是静态代理,也称为编译时增强,AOP框架会在编译阶段生成AOP代理类,并将AspectJ(切面)织入到Java字节码中,运行的时候就是增强之后的AOP对象。
(2)Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。
Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理: ② 如果被代理类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。
(3)静态代理与动态代理区别在于生成AOP代理对象的时机不同,相对来说AspectJ的静态代理方式具有更好的性能,但是AspectJ需要特定的编译器进行处理,而Spring AOP则无需特定的编译器处理。
Spring 和 SpringBoot 有什么不同?
Spring 框架提供多种特性使得 web 应用开发变得更简便,包括IOC(控制反转 → DI(依赖注入))、AOP(切点切面)、数据绑定、数据存取等等。
随着时间推移,Spring 生态变得越来越周全,同时也变得越来越繁琐,并且应用程序所必须的配置文件也令人觉得可怕,特别是维护的XML文件,严重加大了开发人员的配置成本。这就是 Spirng Boot 的精彩之处了 – 它使得 Spring 的配置变得更开箱即用。
这里有两条 SpringBoot 带来的好处:
- 根据 classpath 中的 artifacts 的自动化配置应用程序
- 提供非功能性特性例如安全和健康检查给到生产环境中的应用程序 对于业务的API仔来说,这些都是需要关注的好处,虽然已经配置好了,但是也需要知道原理。
总结
本篇可以说是上班时间的杂谈,东记录一下西记录一下;不过对于Springboot项目的原理性算是小进了一步,希望后续会漫漫精进;特别是记录了Spring和Springboot的异同,以及其中的一小部分特性,如AOP和IOC