Spring的@Autowired依赖注入原来这么多坑!(下)

简介: 像第一个案例,同种类型的实现,可能不是同时出现在自己的项目代码中,而是有部分实现出现在依赖的类库。看来研究源码的确能让我们少写几个 bug!

修正

引用处修正

@Autowired
@Qualifier("cassandraDataService")
DataService dataService;

定义处显式指定Bean名字,我们可以保持引用代码不变,而通过显式指明CassandraDataService 的Bean名称为CassandraDataService来纠正这个问题。

@Repository("CassandraDataService")
@Slf4j
public class CassandraDataService implements DataService {
  //省略实现
}

如果你不太了解源码,不想纠结于首字母到底是大写还是小写,建议第二种方法

引用内部类的Bean遗忘类名

这就能搞定所有Bean显式引用不出 bug 吗?

沿用上面案例,稍微再添加点别的需求,例如我们需要定义一个内部类来实现一种新的DataService,代码如下:

public class StudentController {
    @Repository
    public static class InnerClassDataService implements DataService{
        @Override
        public void deleteStudent(int id) {
          //空实现
        }
    }
    // ...
 }

这时一般都用下面的方式直接去显式引用这个Bean:

@Autowired
@Qualifier("innerClassDataService")
DataService innerClassDataService;

那直接采用首字母小写,这样就万无一失了吗?

仍报错“找不到Bean”,why?

答疑

现在问题是“如何引用内部类的Bean”。

在AnnotationBeanNameGenerator#buildDefaultBeanName,只关注了首字母是否小写,而在最后变换首字母前,有这么一行处理 class 名称的:

image.png

我们可以看下它的实现:

ClassUtils#getShortName

image.png

假设是个内部类,例如下面的类名:

com.javaedge.StudentController.InnerClassDataService

经过该方法处理后,得到名称:

StudentController.InnerClassDataService

最后经Introspector.decapitalize首字母变换,得到Bean名称:

studentController.InnerClassDataService

所以直接使用 innerClassDataService 找不到想要的Bean。

修正

@Autowired
@Qualifier("studentController.InnerClassDataService")
DataService innerClassDataService;

总结

像第一个案例,同种类型的实现,可能不是同时出现在自己的项目代码中,而是有部分实现出现在依赖的类库。看来研究源码的确能让我们少写几个 bug!

目录
相关文章
|
2月前
|
XML Java 程序员
Spring的依赖注入
Spring的依赖注入
|
1月前
|
Java Spring 容器
Spring中@Autowired和@Resource注解异同点
Spring中@Autowired和@Resource注解异同点
31 0
|
2月前
|
Java Spring
Spring5深入浅出篇:Spring中ioc(控制反转)与DI(依赖注入)
Spring5深入浅出篇:Spring中ioc(控制反转)与DI(依赖注入)
|
3月前
|
Java API Spring
Spring6-IoC(Inversion of Control)控制反转和DI(Dependency Injection)依赖注入,手动实现IOC
Spring6-IoC(Inversion of Control)控制反转和DI(Dependency Injection)依赖注入,手动实现IOC
|
1月前
|
Java 数据库连接 API
【Spring】1、Spring 框架的基本使用【读取配置文件、IoC、依赖注入的几种方式、FactoryBean】
【Spring】1、Spring 框架的基本使用【读取配置文件、IoC、依赖注入的几种方式、FactoryBean】
47 0
|
4月前
|
XML Java 数据格式
手写spring 框架——第二篇(依赖注入)
手写spring 框架——第二篇(依赖注入)
41 0
|
2月前
|
设计模式 开发框架 Java
Spring 依赖注入方式有哪些?
Spring 依赖注入方式有哪些?
81 0
Spring 依赖注入方式有哪些?
|
2月前
|
开发框架 Java 测试技术
Spring Boot 项目中使用 `@Autowired` 注解,合理吗?
Spring Boot 项目中使用 `@Autowired` 注解,合理吗?
120 1
Spring Boot 项目中使用 `@Autowired` 注解,合理吗?
|
2月前
|
设计模式 Java 测试技术
Spring依赖注入的魔法:深入DI的实现原理【beans 五】
Spring依赖注入的魔法:深入DI的实现原理【beans 五】
113 0
|
2月前
|
安全 Java 开发者
Spring依赖注入大揭秘:@Autowired、@Qualifier和@Resource的区别与应用
Spring依赖注入大揭秘:@Autowired、@Qualifier和@Resource的区别与应用
52 0