为何无需手动创建CrudRepository子接口的Bean即可通过@Autowired注入
问题解答:继承CrudRepository的接口无需手动实现即可注入的原因与底层逻辑
核心原因
你不需要手动编写UserRepository的实现类就能直接注入使用,本质是Spring Data框架在应用启动阶段,自动为符合规则的Repository接口生成了动态代理实现类,并且将该代理类的实例注册为Spring IOC容器中的Bean,因此@Autowired可以直接匹配到对应的Bean完成注入。
底层实现流程
1. Repository接口扫描
只要你项目引入了对应的Spring Data模块依赖(比如Spring Data JPA),框架就会自动扫描指定路径下的接口:
- 非Spring Boot场景:需要在配置类上添加
@EnableJpaRepositories注解,指定扫描的Repository接口所在包 - Spring Boot场景:自动配置默认开启扫描,扫描范围是启动类所在包及其子包下所有继承了
Repository(含子接口CrudRepository、JpaRepository等)的接口
2. 动态生成代理实现类
扫描到符合规则的UserRepository接口后,框架会通过动态代理技术生成该接口的实现类:
- 通用CRUD方法(比如代码中用到的
save,以及findById、delete等)的逻辑已经由框架提供的SimpleJpaRepository类实现,代理类会将这类方法的调用直接转发给SimpleJpaRepository的实例处理 - 如果你在Repository接口中自定义了查询方法,框架会根据方法名规则、
@Query注解等解析生成对应的执行逻辑,绑定到代理类的对应方法上
3. 代理类注册为Spring Bean
生成代理实现类后,框架会自动将该类的实例注册到Spring IOC容器中,默认的Bean名称为接口名首字母小写(即UserRepository对应的Bean名为userRepository),和你代码中@Autowired注入的字段名匹配,因此可以完成自动注入。
内容的提问来源于stack exchange,提问作者Nishant Kumar
相关产品推荐
相关产品推荐

