99re热视频这里只精品,久久久天堂国产精品女人,国产av一区二区三区,久久久精品成人免费看片,99久久精品免费看国产一区二区三区

App下載

邪修 Spring 10 連擊|IoC 黑洞、AOP 暴走、事務幽靈

編程獅(w3cschool.cn) 2025-08-08 10:28:54 瀏覽數(shù) (286)
反饋

邪修 Spring 10 段“千萬別上生產(chǎn)”的終極黑魔法
——僅供技術獵奇,切勿真用!

?? 每條都可能:Bean 地獄、AOP 暴走、事務漂移、內(nèi)存泄漏、安全裸奔

面試炫技 OK,項目敢用就等死!

1?? 單配置毀滅 IoC 容器

@Configuration
public class AnnihilationConfig {
    @Bean
    public ApplicationContext ctx() {
        return null;        // BeanFactory 返回 null → 啟動即 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?? 事務“幽靈回滾”

@Service
public class EvilService {
    @Transactional
    public void save() {
        // 業(yè)務成功,但手動 setRollbackOnly
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    }
}

數(shù)據(jù)寫入成功卻被回滾,業(yè)務方一臉懵。

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}

啟動即 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;
}

啟動即執(zhí)行系統(tǒng)命令,殺軟直接報警。

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?? 動態(tài)代理無接口

@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(); }
}

外層事務被內(nèi)層回滾,數(shù)據(jù)半寫半丟,排查地獄。

邪修口訣

“Bean 當迷宮,AOP 當炸彈;

SpEL 當暗器,事務當幽靈?!?/p>

PS

想要正經(jīng)學習 Spring ,從編程獅的《Spring 入門課程》開始!

0 人點贊