青岛网站建设排名,软件工程考研难度,wordpress 密码爆破,建站源码下载引言
使用Autowired自动注入时#xff1a; 如果注入的接口有多个实现类#xff0c;如下所示#xff1a; 那么如果不指定具体是哪个实现类的Bean#xff0c;在Spring Boot启动时就会发生异常#xff08;下图请点击查看#xff09;#xff1a; 异常的描述信息非常简单Autowired自动注入时 如果注入的接口有多个实现类如下所示 那么如果不指定具体是哪个实现类的Bean在Spring Boot启动时就会发生异常下图请点击查看 异常的描述信息非常简单就是告诉开发者自动注入的地方需要一个Bean而spring 容器却找到了3个实现类的Bean。
Action可以采取的行动: 考虑使用Primary注解或Qualifier注解。 Primary
此注解用在类上面官方解释如下 简单翻译过来就是这个注解相当于Spring 的xml配置文件中bean标签里的 primary属性。
它表示在需要自动注入一个单值依赖的地方却有多个候选依赖那么这个注解会指定一个类作为preference偏好选择。
可以简单理解为我们把Primary注解标记在任意一个类上面在使用Autowired注入的时候如果不特殊指明如何特殊指明请看Qualifier的讲解那么默认就注入被Primary标记的类。
但是只可以指定一个类作为偏好类否则依然会产生冲突。
Qualifier
此注解用在属性上、方法上、参数上等官方解释如下 翻译过来就是说这个注解用在属性上或参数上在自动注入的时候作为多个候选bean的限定。也可以使用在其他的随后会被用于限定bean的定制注解上。
其实大多数用于属性上和Autowired一起联用。
这个注解有一个参数 default关键字应该是java8中引入的关键字不过我也是第一次见过这种写法可能是孤陋寡闻各位大神轻喷
稍微思考一下就可以猜到如果不为Qualifier注解指定参数那么默认使用类的默认别名即类的首字母小写比如 ChineseTeacher类的默认别名是chineseTeacher EnglishTeacher类的默认别名是englishTeacher MathTeacher类的默认别名是mathTeacher。 使用默认别名的方法很简单直接用类的默认别名来命名我们的自动注入对象如下所示 Teacher接口有三个实现类ChineseTeacher、EnglishTeacher、MathTeacher我们不需要使用Primary也不使用Qualifier直接在自动注入的变量上使用默认别名依然可以注入成功。 是的当我们在自动注入的时候使用类的默认别名就不会发生候选Bean冲突的问题。 使用Qualifier或Primary注解仅仅是在你不想用默认别名来命名注入的bean或是忘记了使用默认别名的情形。 当我们不使用默认别名来使用自动注入功能我们就需要使用Qualifier来指定选择的类型像下面这样 注意如果想将ChineseTeacher注入到teacher对象中就必须给ChineseTeacher类设置别名。 Service、Component等注解都可以传入一个字符串作为类的别名。
注意使用Qualifier注入bean的时候它所选取的类的别名需要与具体的类的别名一致否则会报无法找到指定类型的错误。 总结
罗里吧嗦说了这么多其实总结起来很简单。
我们自动注入的时候如果有多个候选实现类的beanspring boot启动的时候就不知道该选择哪个bean进行注入因此会报错。
使用Primary可以指定一个首选Bean注入使用Qualifier可以在自动注入的地方通过传入一个限定名也就是类的别名来选取指定的实现类只不过必须与类的别名一致如果不传限定名就使用类的默认别名
如果既不用Primary也不用Qualifier那就必须在自动注入的时候直接以类的默认别名来命名。
给spring ioc容器管理的类设置别名的方式是Service(别名)、Component(别名) 、Bean(别名) 等等。