spring boot注解如何实现(Spring Boot源码-@EnableConfigurationProperties @ConfigurationProperties注解配置原理)
本文目录
- Spring Boot源码-@EnableConfigurationProperties @ConfigurationProperties注解配置原理
- SpringBoot Starter自定义注解 - 接口加解密
- SpringBoot:如何书写一个自定义的Enable*注解
Spring Boot源码-@EnableConfigurationProperties @ConfigurationProperties注解配置原理
1 概述 2 实例 3 配置注入实现原理 使用过Spring Boot的都会知道,我们可以在application.properties文件中进行一系列的配置,该配置会被自动注入到我们需要使用的bean中,下面我们就介绍配置注入的实现原理。 首先,要知道在application.properties中的配置是通过 BeanPostProcessor 进行注入的,具体完成该功能的 BeanPostProcessor 实现类是 ConfigurationPropertiesBindingPostProcessor 。 本文接下来会介绍 ConfigurationPropertiesBindingPostProcessor 是在何时被加入到beanfactory中的,以及 @EnableConfigurationProperties 、 @ConfigurationProperties 注解的实现原理。 Spring Boot自动配置中充斥着大量使用通过application.properties进行扩展配置的实现,比如我们熟悉的 MybatisAutoConfiguration : 下面我们在看下 MybatisProperties 类的定义: 通过如上的注解,MyBatis就可以获得我们在application.properties中的配置了,比如如下配置: 要了解配置注入的实现原理,首先要找到上文介绍到的 ConfigurationPropertiesBindingPostProcessor 是何时被注册到beanfactory中的,通过阅读源码发现,在spring.factories文件中有如下一行: 可见,是通过 @EnableAutoConfiguration 注解引入了相关的配置, @EnableAutoConfiguration 通过 @Import 注解自动配置的原理这里不再介绍。我们看下 ConfigurationPropertiesAutoConfiguration 类的实现: 首先 ConfigurationPropertiesAutoConfiguration 被 @Configuration 注解,因此会在beanfactory加载时被作为配置类处理,具体在 ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry 调用 ConfigurationClassParser.parse 进行处理。 我们再看 @EnableConfigurationProperties 定义: @EnableConfigurationProperties 通过 @Import(EnableConfigurationPropertiesImportSelector.class) 向容器中注入了相关的处理类, @Import 也是在 ConfigurationClassParser.parse 进行处理的。 EnableConfigurationPropertiesImportSelector 类定义如下: 好了,到这里,我们已经知道注解@ EnableConfigurationProperties.value 中指定的配置类是如何被注入到beanfactory中的了,那么注解 EnableConfigurationProperties.value 中指定的配置类中的属性是如何从application.properties被注入的呢?比如上面的 对应配置如下: 这就是我们前面提到的 BeanPostProcessor 接口实现类 ConfigurationPropertiesBindingPostProcessor 类处理的,而 ConfigurationPropertiesBindingPostProcessor 则是通过上面 EnableConfigurationPropertiesImportSelector 中使用类 ConfigurationPropertiesBindingPostProcessorRegistrar 进行注册的: ConfigurationPropertiesBindingPostProcessor 是接口 BeanPostProcessor 的实现,会被 ApplicationContext 检测出来,在实例化每个bean时会被调用进行扩展处理。
SpringBoot Starter自定义注解 - 接口加解密
目标
本章我们将编写一个starter,目标如下:
1、对外提供 @OpenAPI 注解,使用此注解它会对接收的请求数据进行解密,对要返回的数据进行加密。
2、完成服务端使用示例
3、完成前端调用示例
加密规则
1、对业务数据进行AES加密,示意代码:encryptData=AES("业务数据", aesKey)
2、对AES的key进行公钥加密,示意代码:encryptKey=RSA(aesKey, 公钥)
3、签名sign=md5(encryptData+encryptKey)
加密后请求示例
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
请求参数
服务端返回示例
pom.xml
定义注解
配置公私钥
具体代码逻辑
定义切面和自动装配
spring.factories
服务端修改
在业务项目中引入jar 包
配置公私钥
改动的地方很少,只需要在原接口增加@OpenAPI注解即可
前端修改
修改前代码
修改后要先对参数加密,然后对返回数据解密
安装两个加密库
封装RSA、AES和Base64加解密
SpringBoot:如何书写一个自定义的Enable*注解
1.新建自定义的注解 2.应用此注解到配置类 3.这时候需要在EnableCustomFeature 类中通过@Import的方式引入一系列需要前置处理的Bean类 上述通过@Import方式做的原因,主要是将@Import标记的配置类中的bean作为ApplicationContext处理 使用Selector选择器启用Enable 自定义注解 示例如下: 上述示例中,自定义的注解中有一个criteria自定义注解属性字段,默认值为default,后面我们需要做的就是根据criteria的值激活两种不同的bean功能集合: 所以如果criteria字段值为 "default",就会加载SomeBeanConfigurationDefault, 否则就是加载SomeBeanConfigurationType1。 ***隐藏网址***
本文相关文章:
持续集成与持续部署实践 pdf(如何在 linux 上配置持续集成服务)
2024年9月29日 02:55
datasource health check failed(java中运行时出现下面的错误是什么原因呢其中有配置spring)
2024年9月26日 04:16
phpstorm配置xdebug(如何在xampp环境下配置phpstrom xdebug)
2024年9月10日 02:30
oracle11g 数据库创建失败(oracle 11g_r2 创建数据库时 Enterprise Manager 配置失败)
2024年9月6日 19:50
centos7网卡配置(centos 7虚拟机怎么配置网卡eno 16)
2024年8月31日 12:35
xml常用标签(web.xml文件主要配置有哪些,都有什么含义)
2024年8月26日 11:20
feignclient(Feign Client超时时间配置以及单独给某接口设置超时时间方法记录)
2024年8月20日 09:55
hibernate二级缓存有什么用(如果不配置hibernate的二级缓存的话,是不是就体现不出hibernate的优越性)
2024年8月16日 14:55
vscode配置python(mac下VScode怎么配置编译Python)
2024年8月11日 06:07
java获取项目中的文件(java文件怎么获取项目下的配置文件)
2024年8月9日 18:30
centos java环境配置(如何在阿里云Centos7.0上配置java web环境)
2024年8月5日 22:10
超详细tomcat安装及配置教程(apache_tomcat_7.0.69怎样安装及配置)
2024年8月5日 04:15
vmware开100个虚拟机(我电脑要开100个虚拟机电脑需要什么样的配置)
2024年8月5日 03:25
web服务器的配置(ASP.NET开发宝典:配置Web服务器(IIS)虚拟站点)
2024年8月4日 12:35
apache一键安装(怎样在windows下配置apache vhost)
2024年8月3日 20:50
更多文章:
最简单的中文网页模板(求助,运用最简单的HTML和DIV+CSS设计一个自己的网页,像博客之类的,要有内页的)
2024年7月23日 13:33
gradle打包依赖的jar(如何使用Android Studio打包混淆的Jar)
2024年7月20日 08:13
什么样子的替换才用通配符(请问谁有word所有的替换功能的详解么 就比如那个“使用通配符”选项 应该怎么用)
2024年5月14日 07:54
34岁唐艺昕带娃逛街(张若昀唐艺昕十指紧扣吃饭逛街,他们的感情究竟有多甜蜜)
2024年4月15日 00:10
docker安装群晖系统(群晖ds216j如何安装docker套件)
2024年7月8日 20:25
sort对结构体数组排序(c++以一个数组为关键字对多个数组排序)
2024年7月23日 07:36
oracle client是什么(Oracle11g的database 和client的区别是什么)
2024年7月23日 14:37
数组计算后如何返回公式(怎么根据数组公式的值返回相对应的值)
2024年7月23日 00:15
ajax编程带来的新的攻击变化(AJAX技术有哪些方面的优势)
2024年7月20日 06:02