news 2026/2/14 12:43:39

SpringBoot代码集

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot代码集
一、获取Spring容器对象
1.1 实现BeanFactoryAware接口

实现BeanFactoryAware接口,然后重写setBeanFactory方法,就能从该方法中获取到Spring容器对象。

@Service public class PersonService implements BeanFactoryAware { private BeanFactory beanFactory; @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; } public void add() { Person person = (Person) beanFactory.getBean("person"); } }
1.2 实现ApplicationContextAware接口

实现ApplicationContextAware接口,然后重写setApplicationContext方法,也能从该方法中获取到Spring容器对象。

@Service public class PersonService2 implements ApplicationContextAware { private ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } public void add() { Person person = (Person) applicationContext.getBean("person"); } }
1.3 实现ApplicationListener接口

实现ApplicationListener接口,需要注意的是该接口接收的泛型是ContextRefreshedEvent类,然后重写onApplicationEvent方法,也能从该方法中获取到Spring容器对象。

@Service public class PersonService3 implements ApplicationListener<ContextRefreshedEvent> { private ApplicationContext applicationContext; @Override public void onApplicationEvent(ContextRefreshedEvent event) { applicationContext = event.getApplicationContext(); } public void add() { Person person = (Person) applicationContext.getBean("person"); } }
二、初始化bean

Spring中支持3种初始化bean的方法:

  • xml中指定init-method方法

  • 使用@PostConstruct注解

  • 实现InitializingBean接口

第一种方法太古老了,现在用的人不多,具体用法就不介绍了。

2.1 使用@PostConstruct注解

在需要初始化的方法上增加@PostConstruct注解,这样就有初始化的能力。

@Service public class AService { @PostConstruct public void init() { System.out.println("===初始化==="); } }
@Component public class AlipayUtils { @Resource private AlipayConfigIOS configIOS; @Resource private AlipayConfigAndroid configAndroid; public AlipayClient alipayClientIOS; public AlipayClient alipayClientAndroid; @PostConstruct public void init(){ System.out.println("===初始化==="); //构建IOS alipayClientIOS = new DefaultAlipayClient( configIOS.getGateWay(), configIOS.getAppId(), configIOS.getAppPrivateKey(), configIOS.getFormat(), configIOS.getCharset(), configIOS.getAliPayPublicKey(), configIOS.getSignType()); //构建Android alipayClientAndroid = new DefaultAlipayClient( configAndroid.getGateWay(), configAndroid.getAppId(), configAndroid.getAppPrivateKey(), configAndroid.getFormat(), configAndroid.getCharset(), configAndroid.getAliPayPublicKey(), configAndroid.getSignType()); } }
2.2 实现InitializingBean接口

实现InitializingBean接口,重写afterPropertiesSet方法,该方法中可以完成初始化功能。

@Service public class BService implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { System.out.println("===初始化==="); } }
三、自定义自己的Scope

我们都知道Spring默认支持的Scope只有两种:

  • singleton 单例,每次从spring容器中获取到的bean都是同一个对象。
  • prototype 多例,每次从spring容器中获取到的bean都是不同的对象。

Spring web又对Scope进行了扩展,增加了:

  • RequestScope 同一次请求从spring容器中获取到的bean都是同一个对象。
  • SessionScope 同一个会话从spring容器中获取到的bean都是同一个对象。

即便如此,有些场景还是无法满足我们的要求。比如,我们想在同一个线程中从spring容器获取到的bean都是同一个对象,该怎么办?这就需要自定义Scope了。

3.1 第一步实现Scope接口
public class ThreadLocalScope implements Scope { private static final ThreadLocal THREAD_LOCAL_SCOPE = new ThreadLocal(); @Override public Object get(String name, ObjectFactory<?> objectFactory) { Object value = THREAD_LOCAL_SCOPE.get(); if (value != null) { return value; } Object object = objectFactory.getObject(); THREAD_LOCAL_SCOPE.set(object); return object; } @Override public Object remove(String name) { THREAD_LOCAL_SCOPE.remove(); return null; } @Override public void registerDestructionCallback(String name, Runnable callback) { } @Override public Object resolveContextualObject(String key) { return null; } @Override public String getConversationId() { return null; } }
3.2 第二步将新定义的Scope注入到Spring容器中
@Component public class ThreadLocalBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { beanFactory.registerScope("threadLocalScope", new ThreadLocalScope()); } }
3.3 第三步使用新定义的Scope
@Scope("threadLocalScope") @Service public class CService { public void add() { } }
四、自定义类型转换

Spring目前支持3种类型转换器:

  • Converter<S,T>:将 S 类型对象转为 T 类型对象

  • ConverterFactory<S, R>:将 S 类型对象转为 R 类型及子类对象

  • GenericConverter:它支持多个source和目标类型的转化,同时还提供了source和目标类型的上下文,这个上下文能让你实现基于属性上的注解或信息来进行类型转换。

这3种类型转换器使用的场景不一样,我们以Converter<S,T>为例。假如:接口中接收参数的实体对象中,有个字段的类型是Date,但是实际传参的是字符串类型:2021-01-03 10:20:15,要如何处理呢?

4.1 第一步,定义一个实体User
@Data public class User { private Long id; private String name; private Date registerDate; }
4.2 第二步,实现Converter接口
public class DateConverter implements Converter<String, Date> { private static final String dateFormat = "yyyy-MM-dd HH:mm:ss"; private static final String shortDateFormat = "yyyy-MM-dd"; @Override public Date convert(String source) { if(StringUtils.isEmpty(value)) { return null; } value = value.trim(); try { if(value.contains("-")) { SimpleDateFormat formatter; if(value.contains(":")) { formatter = new SimpleDateFormat(dateFormat); }else { formatter = new SimpleDateFormat(shortDateFormat); } Date dtDate = formatter.parse(value); return dtDate; }else if(value.matches("^\\d+$")) { Long lDate = new Long(value); return new Date(lDate); } } catch (Exception e) { throw new RuntimeException(String.format("parser %s to Date fail", value)); } throw new RuntimeException(String.format("parser %s to Date fail", value)); } }
4.3 第三步,将新定义的类型转换器注入到Spring容器中
@Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addFormatters(FormatterRegistry registry) { registry.addConverter(new DateConverter()); } }
4.4 第四步,调用接口
@RequestMapping("/user") @RestController public class UserController { @RequestMapping("/save") public String save(@RequestBody User user) { return "success"; } }

请求接口时User对象中registerDate字段会被自动转换成Date类型。

五、Enable开关

不知道你有没有用过Enable开头的注解,比如:EnableAsyncEnableCachingEnableAspectJAutoProxy等,这类注解就像开关一样,只要在@Configuration定义的配置类上加上这类注解,就能开启相关的功能,让我们一起实现一个自己的开关。

5.1 第一步,定义一个LogFilter
public class LogFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("记录请求日志"); chain.doFilter(request, response); System.out.println("记录响应日志"); } @Override public void destroy() { } }
5.2 第二步,注册LogFilter
@ConditionalOnWebApplication public class LogFilterWebConfig { @Bean public LogFilter timeFilter() { return new LogFilter(); } }

注意,这里用了@ConditionalOnWebApplication注解,没有直接使用@Configuration注解。

5.3 第三步,定义开关@EnableLog注解
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(LogFilterWebConfig.class) public @interface EnableLog { }
5.4 第四步,启动类加上@EnableLog注解

只需在Springboot启动类加上@EnableLog注解即可开启LogFilter记录请求和响应日志的功能。

AI大模型学习福利

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。


因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

四、AI大模型商业化落地方案

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/8 6:23:22

Miniconda-Python3.9如何支持PyTorch与Data Drift Monitoring集成

Miniconda-Python3.9 如何支持 PyTorch 与 Data Drift Monitoring 集成 在现代 AI 工程实践中&#xff0c;一个看似简单的问题却常常让团队陷入困境&#xff1a;为什么本地训练完美的模型&#xff0c;一上线就表现异常&#xff1f;更糟糕的是&#xff0c;这种性能下降往往滞后数…

作者头像 李华
网站建设 2026/2/10 2:28:41

Windows用户如何在Miniconda-Python3.9中配置PyTorch GPU

Windows环境下基于Miniconda-Python3.9搭建PyTorch GPU开发环境 在深度学习项目日益普及的今天&#xff0c;一个稳定、高效且可复现的本地开发环境&#xff0c;往往是决定研究进展快慢的关键因素。尤其是对于使用Windows系统的用户而言&#xff0c;如何绕开Python依赖混乱、版…

作者头像 李华
网站建设 2026/2/10 10:25:23

【STM32C092RC 测评】+基于TIM控制DMA从内存到内存的数据传输

首先对tim1进行配置&#xff0c;这个是高级功能的计时器&#xff1a;按照图中标注进行配置&#xff0c;&#xff0c;另外这个有一个操作技巧&#xff0c;就是ctrl鼠标左键&#xff0c;可以查找具有相同复用功能的引脚 比如说&#xff0c;TIM1_CH1这个功能&#xff0c;如果参考数…

作者头像 李华
网站建设 2026/2/10 21:47:56

链动创新,共赴热爱!AtomGit 亮相 BoHack 2025 天津黑客松

当代码与灵感碰撞&#xff0c;当协作与创新共振&#xff0c;为期 3 天 42 小时的 BoHack 2025 天津黑客松在天开高教科创园圆满收官&#xff01;AtomGit 作为参展企业&#xff0c;全程深度参与这场以 “Connect to Create | 链动创新” 为主题的科技盛宴&#xff0c;与来自各地…

作者头像 李华
网站建设 2026/2/13 20:09:52

移动端app获取wifi步骤 用的uni

1manifest.json配置权限说明&#xff1a;WiFi&#xff1a;启用 uni.startWifi / uni.getWifiList / uni.onGetWifiList 等 APIGeolocation&#xff1a;Wi-Fi 扫描在 Android 8 必须依赖定位模块✅ 这是正确且必须的配置 ⚠️ 没有 Geolocation&#xff0c;Wi-Fi 列表在真机上会…

作者头像 李华
网站建设 2026/2/6 8:20:45

Miniconda-Python3.9环境下实现PyTorch模型A/B测试架构

Miniconda-Python3.9环境下实现PyTorch模型A/B测试架构 在当今AI系统频繁迭代的背景下&#xff0c;一个常见的工程难题浮出水面&#xff1a;如何确保新模型真的比旧模型更好&#xff1f; 很多团队经历过这样的场景——算法团队兴奋地宣布“新模型离线指标提升5%”&#xff0c;结…

作者头像 李华