【理解Spring】系列前言
在开发中,Spring 是我使用最多的框架,故而对它进行更深入的学习,可以更快的实现想要的功能,同时写出更优雅的代码。
基于 Spring Framework 5.3.10-SNAPSHOT 学习,后续博文内容对应此版本
核心原理
[[Spring核心接口]]
BeanDefinition
抽象 BeanDefinition
BeanFactory
ApplicationContext
BeanPostProcessor
FactoryBean
Spring启动
Spring扫描
Spring初始化所有非懒加载单例Bean
...
订阅 Google AI Pro 会员教程
近期 Google 在 X 平台(原 Twitter)的 @GeminiApp 官方账号宣布了一项限时优惠活动:Google AI Pro 年度计划享受 50% 折扣,年费仅需 $99.99(原价 $199.99)。
记录一下在国内环境下成功订阅 Google AI Pro 年度会员的完整流程。
遇到的问题
最初尝试使用美区 Google 账户直接在网页端购买,但在添加支付方式时遇到了问题:添加国内招商银行 Visa 卡失败。
后偶然发现可以通过 App Store 进行支付,从而绕过直接绑定信用卡的限制。
解决方案
通过 Apple 生态系统完成订阅,具体流程如下:
1. 准备美区 Apple 账号余额
由于需要在美区 App Store 进行支付,首先需要为美区 A...
Proxmox VE 9.1.1 屏蔽订阅弹窗提示
Proxmox VE (PVE) 是一款优秀的开源虚拟化管理平台,基于 Debian 并集成了 KVM 和 LXC 虚拟化技术。然而,在使用社区版时,每次登录 Web 管理界面都会弹出订阅提示窗口,虽然不影响功能使用,但频繁出现确实会影响使用体验。
本文将介绍如何在 Proxmox VE 9.1.1 版本中屏蔽这个登录后的订阅提示弹窗。
操作步骤
1. 备份原始文件
在进行任何修改之前,强烈建议先备份原始的 JavaScript 文件,以便在出现问题时能够快速恢复:
cp /usr/share/pve-manager/js/pvemanagerlib.js \
/usr/share/pve-manager/js/pvemanagerlib.js.bak
这条命令会在...
kiss-translator(简约翻译)配置 Gemini AI Studio
由于沉浸式翻译 最近出现了许多负面消息,于是尝试寻找替代品。
看到有推荐 kiss-translator 于是尝试使用。
由于默认的 Gemini 配置与 Gemini AI Studio 不兼容,于是摸索在自定义接口中配置。
在【接口设置】中,点开一个Custom,接口名称填一个易于分别的名字。
URL填写:https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent
如果是自搭建的 GeminiBalance,填写 http://ip:port/v1beta/models/gemini-2.5-flash-lite:generateContent
...
【Spring实战】动态获取Bean
在开发中,常常会定义接口,后对接口进行实现。实现的方式可能有一种,也可能有多种,在不同的场景,需要调用不同的实现。
例如
public interface Azh3ngService {
void foo();
}
public class AaAzh3ngServiceImpl implements Azh3ngService {
@Override
public void foo() {
System.out.println("aa");
}
}
public class BbAzh3ngServiceImpl implements Azh3ngService {
@Override
public void foo(...
【Spring实战】@Qualifier 注解的使用
在使用 Spring 的过程中,当需要进行依赖注入时,往往会选用 @Autowired 注解进行自动装配,如果被 @Autowired 注解的类在 Spring 中有多个 Bean,则通过变量名称选取合适的 Bean,例如:
@Component
public class FooService implements BaseService {
}
@Component
public class BarService implements BaseService {
}
@Component
public class SomeBean {
@Autowired
private BaseService barService; // 根据变量名称会找到 BarServi...
【理解Spring】事务
在 Spring 中,事务有两种实现方式:
编程式事务管理:编程式事务管理使用 TransactionTemplate 可实现细粒度的事务控制
声明式事务管理:基于 Spring AOP 实现。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务
开发中更常使用声明式事务,因为不会入侵代码,通过 @Transactional 注解即可以完成事务管理
声明式事务基于 Spring AOP 实现:向 Spring 中添加 BeanPostProcessor 扫描被 @Transactional 注解的类,生成代理对象,通过代理对象完成事务管理
使用示例
编程式事务使用示例
使用 TransactionTe...
【理解Spring】TargetSource
org.springframework.aop.TargetSource
TargetSource的使用
在 Spring AOP 中,通常被代理对象就是 Bean 对象,由 BeanFactory 创建。
同时 Spring AOP 中提供了 TargetSource 接口,可以自定义逻辑创建被代理对象。例如 @Lazy 注解,当加在属性上时,会产生一个代理对象赋值给这个属性,产生代理对象的代码为:
org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver#buildLazyResolutionProxy
public class ContextAnnotationAutowi...
共计 50 篇文章,7 页。