Spring @Autowired能否自动装配无实现类的接口?若可以,如何实现?
Spring @Autowired能否自动装配无实现类的接口?
答案是能,但仅限Spring框架提供了动态代理支持的特定接口,比如你示例里的Spring Data JPA Repository接口;普通自定义的无实现类接口直接用@Autowired会找不到对应Bean。
具体实现逻辑(以你的示例为例)
你的UserRepository继承了JpaRepository——这是Spring Data JPA提供的核心接口,Spring会通过以下步骤自动生成实现类并完成注入:
- Spring容器启动时,会扫描项目中所有继承自
Repository(或其子接口如JpaRepository)的接口 - 框架会使用JDK动态代理(或CGLIB,视接口情况而定)在运行时动态生成该接口的代理类
- 这个动态生成的代理类会被自动注册为Spring Bean,自带你定义的接口方法(包括JpaRepository原生的CRUD方法、自定义查询方法)的实现逻辑
- 当你用
@Autowired注入UserRepository时,Spring容器就能找到这个动态生成的Bean并完成注入
翻译后的示例代码
无实现类的Repository接口
public interface UserRepository extends JpaRepository<User, Integer> { }
注入该接口的控制器类
@RestController public class UserJpaResource { @Autowired private UserRepository service; // 后续业务代码 }
额外注意
如果是你自己定义的普通接口(没有继承Spring提供的特殊接口),又没有编写实现类,直接用@Autowired注入会抛出NoSuchBeanDefinitionException——因为Spring没有逻辑为这类接口自动生成实现类。
内容的提问来源于stack exchange,提问作者vishwanath challal
相关产品推荐
相关产品推荐

