邪修 Spring 10 连击|IoC 黑洞、AOP 暴走、事务幽灵

编程狮(w3cschool.cn) 2025-08-08 10:28:54 浏览数 (145)
反馈

邪修 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 入门课程》开始!

0 人点赞