Spring Boot 1.5.9静态内部类@Autowired注入Repo失败求助
静态内部类中实现依赖注入的可行方案
首先明确核心问题:Spring的依赖注入是基于实例对象的,静态内部类不属于外部类的实例范畴,默认不会被Spring容器纳入管理,所以直接在静态内部类中用@Autowired注入依赖必然失败。你之前尝试的@Entity是JPA实体注解,和依赖注入逻辑无关,自然无效;@Component如果没处理好静态类的扫描规则,也无法让Spring识别并创建Bean。
下面给出几种不需要用JdbcTemplate的解决方案:
方案1:将静态内部类改为非静态内部类
如果业务允许调整类结构,把静态内部类改成非静态,同时给外部类和内部类都加上@Component注解,让Spring能扫描并管理这两个类的实例:
@Component public class OuterClass { @Component public class InnerClass { @Autowired private SomeRepo someRepo; // 业务方法逻辑 } }
注意:非静态内部类依赖外部类的实例,只要外部类是Spring管理的Bean,Spring会自动处理内部类的实例化和依赖注入,你可以在需要使用内部类的地方直接注入InnerClass即可。
方案2:通过Spring上下文手动获取Bean(保留静态内部类结构)
如果必须保留静态内部类的结构,可以让外部类实现ApplicationContextAware接口,拿到Spring上下文,然后在静态内部类中通过上下文获取SomeRepo实例:
@Component public class OuterClass implements ApplicationContextAware { private static ApplicationContext appContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { appContext = applicationContext; } public static class InnerClass { private final SomeRepo someRepo; public InnerClass() { this.someRepo = appContext.getBean(SomeRepo.class); } // 业务方法逻辑 } }
这种方式不需要修改静态内部类的静态属性,通过构造方法初始化依赖,避免了静态依赖的潜在问题。
方案3:将静态内部类独立为普通Bean类
如果静态内部类的业务逻辑和外部类耦合度不高,最干净的方式是把它独立成一个普通类,加上@Component注解,让Spring直接管理:
@Component public class InnerService { @Autowired private SomeRepo someRepo; // 原静态内部类的业务方法 }
之后在原来的外部类中直接注入InnerService即可使用,完全符合Spring的依赖注入规范。
补充说明
- 之前尝试从调用处传入依赖失败,大概率是因为调用处本身不是Spring管理的Bean,或者依赖传递的时机早于Bean初始化完成的时间;
- 确保你的项目配置了正确的组件扫描路径(Spring Boot默认扫描启动类所在包及子包,传统Spring需在配置类或xml中指定),否则Spring无法识别你添加的
@Component注解。
内容的提问来源于stack exchange,提问作者cakimax113
相关产品推荐
相关产品推荐

