您现在的位置是:亿华云 > 知识
SpringBoot自动配置原理解析
亿华云2025-10-04 00:56:14【知识】0人已围观
简介来源:京东云开发者一、什么是SpringBoot自动配置首先介绍一下什么是SpringBoot,SpringBoost是基于Spring框架开发出来的功能更强大的Java程序开发框架,其最主要的特点是
来源:京东云开发者
一、自动什么是配置SpringBoot自动配置首先介绍一下什么是SpringBoot,SpringBoost是原理基于Spring框架开发出来的功能更强大的Java程序开发框架,其最主要的解析特点是:能使程序开发者快速搭建一套开发环境。SpringBoot能将主流的自动开发框架(例如SpringMVC,Dubbo,Mybatis,Redis等),做到像Maven导入Jar包一样的配置简洁快速,做到开箱即用。原理其中最关键的解析技术就是SpringBoot定制的各种Starter,通Maven引入Starter就能快速搭建开发环境。自动二、配置SpringBoot Starter自动装配案例在以前单独使用SpringMVC Web编程框架时,原理我们需要单独配置DispatcherServlet和Tomcat,解析使用SpringBoot之后,自动我们只需要引入SpringBoot-Starter-Web就能直接开始编写Controller等Web相关的配置代码,这就是原理SpringBoot为们提供的开箱即用的便捷能力,下面就以SpringBoot-Starter-Web来说明SpringBoot自动配置的关键原理三、SpringBoot自动装配案例源码解析3.1 DispatcherServlet的源码库自动配置原理
首先我们定位到SpringBoot自动配置的Maven依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <version>${ spring-boot.version}</version> </dependency>在依赖的Jar包中我们可以在META-INF/spring.factories中找到自动配置类:org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration在这个类中存在有一个静态内部类:org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration.DispatcherServletConfiguration下图是这个配置类的主要源码和解析:
3.1.1:@EnableConfigurationProperties({ WebMvcProperties.class})注解解析
这个注解表示使WebMvcProperties.class类上的@ConfigurationProperties这个注解生效,同时@ConfigurationProperties这个注解是将application.xml中以spring.mvc开头的配置参数自动注入到WebMvcProperties.class类的字段中3.1.2:@Conditional({ DefaultDispatcherServletCondition.class}注解解析
该注解的原理就是将满足特定条件情况下的Bean自动加载到Spring容器中,该注解对应的Spring接口就是org.springframework.context.annotation.Condition这个接口public interface Condition { boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2);}3.1.3:@ConditionOnClass注解解析
@ConditionOnClass这个注解是在当程序代码环境classpath下存在xxx.class的情况下条件成立,同时最终也会调用到matches方法中,其中关键的源码如下:protected static Class<?> resolve(String className, ClassLoader classLoader) throws ClassNotFoundException { return classLoader != null ? Class.forName(className, false, classLoader) : Class.forName(className);}从上面可以看到,代码利用Class.forName方法加载classpath下的xxx.class类,如果加载成功条件就会成立。最后,在满足了所有@ConditionOnal注解条件后,SpringBoot就会自动为我们在Spring容器中注入DispatcherServlet了,无需单独配置了,直接引入spring-boot-starter-webr即可开始使用web相关功能。3.1.4:总结
我们以DispatcherServlet是如何自动配置到容器中为例,云服务器提供商探究了SpringBoot Starter的自动配置原理,其中涉及了几个关键的注解和步骤:第一步:涉及到了配置文件的读取和个性化配置,这里就涉及到了下面这两个注解@ConfigurationProperties@EnableConfigurationProperties第二步:设计到了在什么条件下才自动配置的注解@Conditional@ConditionalOnClass第三步:约定了自动配置类的加载路径/META-INF/spring-factoriesorg.springframework.boot.autoconfigure.EnableAutoConfiguration=自动配置类全路径名称在我们了解到了SpringBoot自动配置的原理之后,我们就可以自定义一个SpringBoot Starter来快速搭建我们的开发环境了。四、自定义一个打印输入输出日志的Starter4.1 首先定义一个标记需要打印出入参日志的注解@PrintLog
@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface PrintLog { }4.2 定义一个存放打印日志配置的实体类
//自动注入application配置文件中已log.switch开头的配置参数@ConfigurationProperties("log.switch")public class LogProperties { //是否启用打印日志功能 private Boolean enabled = false; //是否打印调用者ip private Boolean printIp = false; //是否打印调用者url private Boolean printUrl = false}4.3 定义一个@PrintLog注解的切面类
@Aspectpublic class LogAspect { private static final Log LOGGER = LogFactory.getLog(LogAspect.class); private LogProperties logProperties; @Pointcut("@annotation(com.zl.annotation.PrintLog)") public void Log(){ } @Around("Log()") public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); String methodName = method.getName(); //打印调用url if (Boolean.TRUE.equals(logProperties.getPrintUrl())){ LOGGER.info("URL:" + request.getRequestURL().toString()); } //打印ip if (Boolean.TRUE.equals(logProperties.getPrintIp())) { LOGGER.info("IP :" + request.getRemoteAddr()); } //打印方法 LOGGER.info("method :" + methodName); //打印参数 LOGGER.info("parameter :" + Arrays.toString(joinPoint.getArgs())); Object result = joinPoint.proceed(); //打印返回结果 LOGGER.info("return :" + JSON.toJSONString(result)); return result; }}4.4 定义一个打印日志的自动配置类
@Configuration@EnableConfigurationProperties({ LogProperties.class})//表示在application配置文件中必须配置log.switch.enabled = true才启动自动配置@ConditionalOnProperty(prefix = "log.switch", value = "enabled", havingValue = "true")public class LogAutoConfigure { @Bean //Advice.class是aop切面中关键的切面方法类(@Before,@After等) //程序中有Advice.class类说明需要使用切面功能,这时才加载自定义的切面类 @ConditionalOnClass(Advice.class) public LogAspect webLogAspect(LogProperties logProperties){ return new LogAspect(logProperties); }}@ConditionalOnProperty表示在application配置文件中必须存在相应的配置才能使条件成立4.5 配置自定义配置类的加载路径
META-INF/spring.factoriesorg.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.zl.autoConfigure.LogAutoConfigure4.6 Maven打包部署
maven install五、开始使用自定义的Starter5.1 在项目中引入Starter
<dependency> <groupId>com.zl.demo</groupId> <artifactId>LogStarter</artifactId> <version>1.0-SNAPSHOT</version></dependency>5.2 在application.yml中配置参数
log: switch: enabled: true //启用打印日志功能 printIp: true //打印请求ip printUrl: true //打印请求url经过上面两个步骤就,打印日志的功能就已经开启了,亿华云接下来就可以进行编码测试了5.3 定义一个Controller并标上打印日志的注解
@RestController@RequestMapping("/test")public class HelloWorldController { @PrintLog @RequestMapping("/hello") public String helleWorld(String test){ return "hello world!"; }}5.4 启动项目开始测试
com.zl.aspect.LogAspect : URL:http://localhost:8080/test/hellocom.zl.aspect.LogAspect : IP :0:0:0:0:0:0:0:1com.zl.aspect.LogAspect : method :helleWorldcom.zl.aspect.LogAspect : parameter :[test]com.zl.aspect.LogAspect : return :"hello world!"可以看到上面的入参和返回值都已经打印出来了,说明了自定义的starter已经生效了。六、总结SpringBoot自动配置功能带给我们的是开箱即用,快速便捷的功能,自动配置为我们研发人员带来的优点,我主要总结为以下两点:提高研发效率。我们可以快速构建开发环境,对于开发中使用到的开源组件和中间件,我们直接引入对应的Starter就可以直接开发了,例如Redis和Mybatis等,可以直接引入对应的spring-boot-starter-data-redis就可以直接使用RedisTemplate来操作Redis了,这样可以极大的提高研发的效率,无需再进行复杂的起步配置了和各种版本依赖管理了。标准模块复用。对于业务开发中的一些标准模块,例如常用的一些三方服务,我们可以利用Starter直接配置好,在需要使用的项目中直接引入这个starter就可以立即使用了,无需再去引入Jar包和编写配置文件等,同样的,对于一些标准非业务强耦合的功能,例如监控,鉴权等,也可以定义一个Starter,需要使用鉴权和监控功能的项目就可以直接复用了,无需再次开发。-end-
很赞哦!(3)
相关文章
- .com域名是国际最广泛流行的通用域名,目前全球注册量第一的域名,公司企业注册域名的首选。国际化公司通常会注册该类域名。
- 4、参加域名拍卖会
- 为什么起域名意义非凡?起域名有什么名堂?
- 5、使用企业名称的英文名称作为域名也是国内许多企业选择域名的一种方式,特别适合一些与计算机、网络和通信相关的行业。
- 为了避免将来给我们的个人站长带来的麻烦,在选择域名后缀时,我们的站长最好省略不稳定的后缀域名,比如n,因为我们不知道策略什么时候会改变,更不用说我们将来是否还能控制这个域名了。因此,如果站长不是企业,或者有选择的话,如果不能选择域名的cn类,最好不要选择它。
- CNAME:对应解析的记录值为域名地址
- 4、注册门槛低
- 国际域名转移的费用和处理步骤是什么?
- 主流搜索引擎显示的相关搜索项越多,越能积极反映该域名的市场价值。同时,被评估域名的搜索引擎显示结果不佳可能是由于以下两个原因:
- 审核通过的域名将显示在域名竞拍页面,并进入正式拍卖期,买家可以在拍卖周期内出价,加价幅度与拍卖保证金说明,点此查看。
热门文章
站长推荐
4、选择一个安全的域名注册商进行域名注册
当投资者经过第二阶段的认真学习之后又充满了信心,认为自己可以在市场上叱咤风云地大干一场了。但没想到“看花容易绣花难”,由于对理论知识不会灵活运用.从而失去灵活应变的本能,就经常会出现小赢大亏的局面,结果往往仍以失败告终。这使投资者很是困惑和痛苦,不知该如何办,甚至开始怀疑这个市场是不是不适合自己。在这种情况下,有的人选择了放弃,但有的意志坚定者则决定做最后的尝试。
打开https://www.aizhan.com/输入自己想要查询的域名然后按回车键,如果做过网站都会有数据显示出来
互联网中的地址是数字的IP地址,域名解析的作用主要就是为了便于记忆。
4、待所有域名查询结束后可在右侧点击导出结果,即可以excel的文件方式将查询到的结果导出。
注册域名要了解几大点?新手有什么方式注册域名?
2、定期提交和投标域名注册。例如,益华网络点击“立即预订”后,平台会抢先为客户注册域名。当然,一个域名可能会被多个客户预订,所以出价最高的人中标。
换新域名(重新来过)