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
相关产品推荐
相关产品推荐

