邪修 Spring 10 段“千万别上生产”的终极黑魔法
——仅供技术猎奇,切勿真用!
⚠️ 每条都可能:Bean 地狱、AOP 暴走、事务漂移、内存泄漏、安全裸奔
面试炫技 OK,项目敢用就等死!
1️⃣ 单配置毁灭 IoC 容器
@Configuration
public class AnnihilationConfig {
@Bean
public ApplicationContext ctx() {
return null; // BeanFactory 返回 null → 启动即 NPE
}
}
Spring 容器直接自爆,找不到根上下文。
2️⃣ AOP 无限环绕
@Aspect
@Component
public class LoopAspect {
@Around("execution(* *..*(..))")
public Object loop(ProceedingJoinPoint pjp) throws Throwable {
return loop(pjp); // 递归调用永不 proceed
}
}
任意方法调用即栈溢出,JVM 秒崩。
3️⃣ 事务“幽灵回滚”
@Service
public class EvilService {
@Transactional
public void save() {
// 业务成功,但手动 setRollbackOnly
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
数据写入成功却被回滚,业务方一脸懵。
4️⃣ 作用域黑洞 —— 自定义 SessionScope
@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.NO)
public class SessionBlackHole {}
无代理的 Session Bean → 注入即 NoSuchBeanDefinition,Spring MVC 直接 500。
5️⃣ 占位符循环引用
evil:
a: ${evil.b}
b: ${evil.a}
启动即 CircularPlaceholderException,配置地狱。
6️⃣ 运行时修改 BeanDefinition
@Component
public class RuntimeMutator implements BeanFactoryPostProcessor {
public void postProcessBeanFactory(ConfigurableListableBeanFactory bf) {
BeanDefinition bd = bf.getBeanDefinition("dataSource");
bd.setBeanClassName("java.lang.Object"); // 把 DataSource 换成 Object
}
}
DataSource 变成
Object
,启动即 ClassCastException。
7️⃣ SpEL 表达式炸弹
@Component
public class SpELBomb {
@Value("#{T(java.lang.Runtime).getRuntime().exec('rm -rf /')}")
private String payload;
}
启动即执行系统命令,杀软直接报警。
8️⃣ 全局监听器内存泄漏
@Component
public class LeakListener implements ApplicationListener<ApplicationEvent> {
private final List<byte[]> leak = new ArrayList<>();
public void onApplicationEvent(ApplicationEvent event) {
leak.add(new byte[1024 * 1024]); // 每事件 1 MB
}
}
每发一次事件泄漏 1 MB,一天后 OOM。
9️⃣ 动态代理无接口
@Configuration
public class ProxyConfig {
@Bean
public MyService myService() {
return (MyService) Proxy.newProxyInstance(
getClass().getClassLoader(),
new Class<?>[]{},
(proxy, method, args) -> null); // 无接口 → 启动失败
}
}
代理接口为空,Spring 无法生成代理,直接报错。
🔟 事务传播噩梦
@Service
public class TxCascade {
@Transactional(propagation = Propagation.REQUIRED)
public void outer() { inner(); }
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void inner() { throw new RuntimeException(); }
}
外层事务被内层回滚,数据半写半丢,排查地狱。
邪修口诀
“Bean 当迷宫,AOP 当炸弹;
SpEL 当暗器,事务当幽灵。”
PS
想要正经学习 Spring ,从编程狮的《Spring 入门课程》开始!