You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot AOP不生效且触发空指针异常求助

嘿,折腾三天肯定挺闹心的,别慌!你的空指针问题其实和AOP没关系,是启动应用时获取Bean的方式错了,我帮你捋清楚:

问题根源

你在main方法里手动new App()创建了一个实例,这个对象不是Spring容器管理的Bean,所以Spring不会给它注入businessClass属性,调用invokeRetrieveSomething()时自然就触发空指针了。

修复方案

方法一:让App实现CommandLineRunner

这是Spring Boot中最常用的启动后执行逻辑的方式,Spring启动完成后会自动调用run方法:

@SpringBootApplication
public class App implements CommandLineRunner {
    @Autowired
    BusinessClass businessClass;

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println("Starting application...");
        invokeRetrieveSomething();
    }

    public void invokeRetrieveSomething() {
        businessClass.retrieveSomething();
    }
}

方法二:从Spring容器中获取Bean

如果你不想实现接口,也可以从SpringApplication.run()返回的上下文里获取App实例:

@SpringBootApplication
public class App {
    @Autowired
    BusinessClass businessClass;

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
        System.out.println("Starting application...");
        App app = context.getBean(App.class);
        app.invokeRetrieveSomething();
    }

    public void invokeRetrieveSomething() {
        businessClass.retrieveSomething();
    }
}
关于你的AOP代码

值得开心的是,你的切面类、自定义注解和BusinessClass的代码都是完全正确的!只要Spring能扫描到这些类(你已经加了@Component、@Aspect,@SpringBootApplication默认会扫描当前包及子包),修复启动逻辑后,AOP就能正常记录方法执行耗时了。

验证效果

修改后启动应用,你会看到类似这样的输出:

Starting application...
This is the retrieveSomething() method.
void com.yourpackage.BusinessClass.retrieveSomething() executed in Xms

内容的提问来源于stack exchange,提问作者prometheusnoob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:10:41