自定义starter,扫描指定注解的bean
自定义starter相当于自己根据配置信息生成了一个默认的bean导入依赖?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion3.5.10/versionrelativePath/!-- lookup parent from repository --/parentgroupIdcom.cj/groupIdartifactIdhello-spring-boot-starter/artifactIdversion0.0.1-SNAPSHOT/versionnamehello-spring-boot-starter/namedescriptionhello-spring-boot-starter/descriptionurl/licenseslicense//licensesdevelopersdeveloper//developersscmconnection/developerConnection/tag/url//scmpropertiesjava.version17/java.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency/dependenciesbuildpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdconfigurationannotationProcessorPathspathgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-configuration-processor/artifactId/pathpathgroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/path/annotationProcessorPaths/configuration/plugin/plugins/build/project将springboot启动类测试类删掉将maven打包成jar的配置删掉2. 自定义一个配置类来定义配置packagecom.cj.hellospringbootstarter;importlombok.Data;importorg.springframework.boot.context.properties.ConfigurationProperties;ConfigurationProperties(prefixmytest)DatapublicclassHelloProperties{privateStringid;privateStringname;privateStringaddress;}通过这个配置加载一个默认的 BeanDataNoArgsConstructorpublicclassHelloService{privateStringname;privateStringaddress;publicHelloService(Stringname,Stringaddress){this.namename;this.addressaddress;}}ConfigurationComponentScanEnableConfigurationProperties(HelloProperties.class)publicclassHelloServiceAutoConfiguration{AutowiredprivateHelloPropertieshelloProperties;BeanpublicHelloServicehelloService(){returnnewHelloService(helloProperties.getName(),helloProperties.getAddress());}}容器中就有这个默认的 HelloService的bean设置自动装配springboot3是在META-INF/spring文件夹下创建org.springframework.boot.autoconfigure.AutoConfiguration.imports这个文件填入自动配置类的全限定类名springboot2是在META-INF下面创建spring.factories打包使用dependencygroupIdcom.cj/groupIdartifactIdhello-spring-boot-starter/artifactIdversion0.0.1-SNAPSHOT/version/dependencyRestControllerLogpublicclassHelloController{AutowiredHelloServicehelloService;GetMapping(/hello)publicHelloServicegetHelloService(){returnhelloService;}}自定义一个注解写在starter里面动态的增强被标注这个注解的类可以用spring中BeanPostProcessor: spring完成 实例化配置 在初始化bean的前后可以实现一些自定义的配置有两个方法postProcessBeforeInitialization bean初始化之前调用postProcessAfterInitialization: bean初始化之后调用如果想增强指定的注解标注的类就可以写在BeanPostProcessor中拦截指定注解增强Target(ElementType.TYPE)Retention(RetentionPolicy.RUNTIME)publicinterfaceLog{/** * 是否打印参数 * return */booleanprintArgs()defaulttrue;booleanprintResult()defaulttrue;/** * 是否打印方法耗时 * return */booleanprintCostTime()defaulttrue;}packagecom.cj.hellospringbootstarter.annotation;importorg.springframework.beans.BeansException;importorg.springframework.beans.factory.config.BeanPostProcessor;importorg.springframework.cglib.proxy.Callback;importorg.springframework.cglib.proxy.Enhancer;importorg.springframework.cglib.proxy.MethodInterceptor;importorg.springframework.cglib.proxy.MethodProxy;importorg.springframework.stereotype.Component;importjava.lang.reflect.Method;importjava.util.Arrays;/** * 对Log 标注的 bean进行统一的 增强 * * * BeanPostProcessor spring完成实例化配置初始化一个bean之后可以实现一些自定义的逻辑 * - postProcessBeforeInitialization bean初始化之前调用 * - postProcessAfterInitialization bean初始化之后调用 */ComponentpublicclassLogBeanPostProcessorimplementsBeanPostProcessor{OverridepublicObjectpostProcessAfterInitialization(Objectbean,StringbeanName)throwsBeansException{Class?beanClassgetTargetClass(bean);// 是否标记了 Log注解if(beanClass.isAnnotationPresent(Log.class)){LoglogAnnotationbeanClass.getAnnotation(Log.class);ObjectenhanceBeancreateLogEnhanceProxy(bean,beanClass,logAnnotation);returnenhanceBean;}returnbean;}privateObjectcreateLogEnhanceProxy(ObjecttargetBean,Class?targetClass,LoglogAnnotation){EnhancerenhancernewEnhancer();enhancer.setSuperclass(targetClass);// MethodInterceptor : cglib的方法拦截器当你调任何方法的时候都会执行这个enhancer.setCallback(newMethodInterceptor(){OverridepublicObjectintercept(Objectobj,Methodmethod,Object[]args,MethodProxyproxy)throwsThrowable{// 跳过Object的基础方法if(isObjectBaseMethod(method)){returnproxy.invokeSuper(obj,args);}try{if(logAnnotation.printArgs()){System.out.printf([日志增强]%s.%s()入参%s%n,targetClass.getSimpleName(),method.getName(),Arrays.toString(args));}longstartTimeSystem.currentTimeMillis();Objectresultproxy.invokeSuper(obj,args);if(logAnnotation.printCostTime()){longendTimeSystem.currentTimeMillis();System.out.printf([日志耗时]%s.%s() 耗时%s,targetClass.getSimpleName(),method.getName(),startTime-endTime);}returnresult;}catch(Throwablee){System.out.printf(日志增强失败 %s.%s() 异常为:%s,targetClass.getSimpleName(),method.getName(),e.getMessage());throwe;}};});ObjectenhancedBeanenhancer.create();System.out.println(增强完成targetClass.getName());returnenhancedBean;}/** * 获取bean的真实类型 * param bean * return */privateClass?getTargetClass(Objectbean){Class?clazzbean.getClass();// 如果是CGLIB代理类获取父类if(clazz.getName().contains($$EnhancerByCGLIB$$)){returnclazz.getSuperclass();}returnclazz;}privatebooleanisObjectBaseMethod(Methodmethod){// 获取声明该方法的类Class?declaringClassmethod.getDeclaringClass();// method.getDeclaringClass()returndeclaringClassObject.class(method.getName().equals(toString)||method.getName().equals(hashCode)||method.getName().equals(equals));}}

相关新闻

Java毕设项目:基于springboot的物业管理系统的设计与实现(源码+文档,讲解、调试运行,定制等)

Java毕设项目:基于springboot的物业管理系统的设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/6 21:10:21 阅读更多 →
【毕业设计】基于springboot的学生选课管理系统的设计与实现(源码+文档+远程调试,全bao定制等)

【毕业设计】基于springboot的学生选课管理系统的设计与实现(源码+文档+远程调试,全bao定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/6 13:18:07 阅读更多 →
Clawdbot MVP:从 0 → 1 的可落地设计方案

Clawdbot MVP:从 0 → 1 的可落地设计方案

一、MVP 的唯一目标(先立生死线) MVP 只验证一件事:Clawdbot 能否在一个高频场景中,稳定做出“比人不差”的判断,并持续自动执行。⚠️ 注意: 不是追求“很聪明”不是覆盖所有场景而是:跑通一个…

2026/7/5 12:16:32 阅读更多 →

最新新闻

鱼叉式钓鱼攻击:从社会工程学到多层防御的实战解析

鱼叉式钓鱼攻击:从社会工程学到多层防御的实战解析

1. 项目概述:从“广撒网”到“精准狙击”的威胁演进在网络安全领域,钓鱼攻击早已不是什么新鲜事。但如果你还停留在“恭喜您中奖了,请点击链接领取”这种群发邮件的印象里,那可能已经落后于攻击者的步伐了。今天要深入探讨的“鱼叉…

2026/7/7 12:11:28 阅读更多 →
基于ComfyUI的AI漫剧制作:8G显存下的零人工干预方案

基于ComfyUI的AI漫剧制作:8G显存下的零人工干预方案

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 最近在B站刷到不少AI生成的漫画剧视频,从角色设计到分镜再到视频合成,全程自动化,效果相当惊艳。但…

2026/7/7 12:09:27 阅读更多 →
上行与下行带宽区别

上行与下行带宽区别

很多朋友在测速时,都会看到两个数字:下载速度和上传速度。有时候,下载速度可以达到900Mbps,而上传速度却只有100Mbps左右;还有些企业申请专线时,运营商会特别说明“上下行对等带宽”。不少人虽然每天都在用…

2026/7/7 12:07:17 阅读更多 →
高压隔离技术:ISOM8710与STM32L4A6RG的安全设计实践

高压隔离技术:ISOM8710与STM32L4A6RG的安全设计实践

1. 高压安全隔离技术概述在工业自动化、医疗设备和电力电子等领域,高压电路与低压控制系统的安全隔离是确保人员和设备安全的关键需求。ISOM8710作为一款高性能数字隔离器,配合STM32L4A6RG低功耗微控制器,能够构建可靠的高压隔离解决方案。典…

2026/7/7 12:07:17 阅读更多 →
听歌不想只发截图?用MusicCard把喜欢的歌做成专属音乐海报

听歌不想只发截图?用MusicCard把喜欢的歌做成专属音乐海报

文章目录1.在极空间一键部署Music Card1.1ssh远程连接到极空间1.2安装docker1.3安装Music Card2.安装cpolar实现随时随地开发3.配置公网地址4.保留固定公网地址总结有些歌适合单曲循环,也适合被认真分享。只是很多时候,我们想表达的不只是“我在听这首歌…

2026/7/7 12:03:16 阅读更多 →
网盘直链下载助手完整指南:告别限速,一键获取真实下载链接

网盘直链下载助手完整指南:告别限速,一键获取真实下载链接

网盘直链下载助手完整指南:告别限速,一键获取真实下载链接 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国…

2026/7/7 11:57:12 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻