邪修 Spring 10 段“千萬別上生產(chǎn)”的終極黑魔法
——僅供技術(shù)獵奇,切勿真用!
?? 每條都可能:Bean 地獄、AOP 暴走、事務(wù)漂移、內(nèi)存泄漏、安全裸奔
面試炫技 OK,項(xiàng)目敢用就等死!
1?? 單配置毀滅 IoC 容器
@Configuration
public class AnnihilationConfig {
@Bean
public ApplicationContext ctx() {
return null; // BeanFactory 返回 null → 啟動(dòng)即 NPE
}
}
Spring 容器直接自爆,找不到根上下文。
2?? AOP 無限環(huán)繞
@Aspect
@Component
public class LoopAspect {
@Around("execution(* *..*(..))")
public Object loop(ProceedingJoinPoint pjp) throws Throwable {
return loop(pjp); // 遞歸調(diào)用永不 proceed
}
}
任意方法調(diào)用即棧溢出,JVM 秒崩。
3?? 事務(wù)“幽靈回滾”
@Service
public class EvilService {
@Transactional
public void save() {
// 業(yè)務(wù)成功,但手動(dòng) setRollbackOnly
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
數(shù)據(jù)寫入成功卻被回滾,業(yè)務(wù)方一臉懵。
4?? 作用域黑洞 —— 自定義 SessionScope
@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.NO)
public class SessionBlackHole {}
無代理的 Session Bean → 注入即 NoSuchBeanDefinition,Spring MVC 直接 500。
5?? 占位符循環(huán)引用
evil:
a: ${evil.b}
b: ${evil.a}
啟動(dòng)即 CircularPlaceholderException,配置地獄。
6?? 運(yùn)行時(shí)修改 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
,啟動(dòng)即 ClassCastException。
7?? SpEL 表達(dá)式炸彈
@Component
public class SpELBomb {
@Value("#{T(java.lang.Runtime).getRuntime().exec('rm -rf /')}")
private String payload;
}
啟動(dòng)即執(zhí)行系統(tǒng)命令,殺軟直接報(bào)警。
8?? 全局監(jiān)聽器內(nèi)存泄漏
@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
}
}
每發(fā)一次事件泄漏 1 MB,一天后 OOM。
9?? 動(dòng)態(tài)代理無接口
@Configuration
public class ProxyConfig {
@Bean
public MyService myService() {
return (MyService) Proxy.newProxyInstance(
getClass().getClassLoader(),
new Class<?>[]{},
(proxy, method, args) -> null); // 無接口 → 啟動(dòng)失敗
}
}
代理接口為空,Spring 無法生成代理,直接報(bào)錯(cuò)。
?? 事務(wù)傳播噩夢(mèng)
@Service
public class TxCascade {
@Transactional(propagation = Propagation.REQUIRED)
public void outer() { inner(); }
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void inner() { throw new RuntimeException(); }
}
外層事務(wù)被內(nèi)層回滾,數(shù)據(jù)半寫半丟,排查地獄。
邪修口訣
“Bean 當(dāng)迷宮,AOP 當(dāng)炸彈;
SpEL 當(dāng)暗器,事務(wù)當(dāng)幽靈。”
PS
想要正經(jīng)學(xué)習(xí) Spring ,從編程獅的《Spring 入門課程》開始!