autowired问题
package com.imooc.spring.ioc.dao;
public interface IUserDao {
}package com.imooc.spring.ioc.dao;
import org.springframework.stereotype.Repository;
// 组件类型注解默认为beanId首字母小写
@Repository
public class UserDao implements IUserDao {
public UserDao(){
System.out.println("正在创建userDao");
}
}package com.imooc.spring.ioc.dao;
import org.springframework.stereotype.Repository;
@Repository
public class UserODao implements IUserDao{
public UserODao(){
System.out.println("正在创建udao2");
}
}package com.imooc.spring.ioc.service;
import com.imooc.spring.ioc.dao.IUserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
// 不再执行set方法,spring ioc 会通过反射技术将属性private修饰符自动改成public,直接进行赋值,不用在写setter/getter
@Autowired
private IUserDao userDao;
//
public IUserDao getUserDao() {
return userDao;
}
}package com.imooc.spring.ioc;
import com.imooc.spring.ioc.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringApplicationContext {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
// String[] strs = context.getBeanDefinitionNames();
// for (String s:strs){
// System.out.println(s);
// }
String[] strs = context.getBeanDefinitionNames();
for (String s:strs){
System.out.println(s);
}
}
}
// 控制台输出
/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=53694:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_333.jdk/Contents/Home/jre/lib/rt.jar:/Users/gaoyulin/imooc/spring-ioc2/target/classes:/Users/gaoyulin/.m2/repository/org/springframework/spring-context/5.3.14/spring-context-5.3.14.jar:/Users/gaoyulin/.m2/repository/org/springframework/spring-aop/5.3.14/spring-aop-5.3.14.jar:/Users/gaoyulin/.m2/repository/org/springframework/spring-beans/5.3.14/spring-beans-5.3.14.jar:/Users/gaoyulin/.m2/repository/org/springframework/spring-core/5.3.14/spring-core-5.3.14.jar:/Users/gaoyulin/.m2/repository/org/springframework/spring-jcl/5.3.14/spring-jcl-5.3.14.jar:/Users/gaoyulin/.m2/repository/org/springframework/spring-expression/5.3.14/spring-expression-5.3.14.jar com.imooc.spring.ioc.SpringApplicationContext
正在创建userDao
正在创建udao2
userController
userDao
userODao
userService
stringUtils
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
Process finished with exit code 0// pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.imooc</groupId> <artifactId>spring-ioc2</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.14</version> </dependency> </dependencies> </project>
我这个代码使用autowired装配了之后没有报错呢,并且创建了两个bean,一个叫UserDao,一个叫UserODao,这是为什么呢?
21
收起
正在回答
1回答
同学你好,@Autowired默认是根据类型进行自动装配的,当存在多个满足条件的 Bean 时,则会根据名称进行注入。
同学代码中声明为:private IUserDao userDao,项目中存在两个该类型的Bean,则会继续按照名称进行注入,会直接将UserDao对象注入,故同学的程序可以正常运行。
课程中声明为private IUserDao uDao时,项目中存在两个IUserDao类型的Bean,且不存在名为uDao的bean故会注入失败,出现报错提示“No qualifying bean of type 'com.imooc.spring.ioc.dao.IUserDao' available:expected single matching bean but found 2: userDao,userOracleDao
祝学习愉快~
2023版Java工程师
- 参与学习 人
- 提交作业 8789 份
- 解答问题 9886 个
综合就业常年第一,编程排行常年霸榜,北上广深月薪过万! 不需要基础,无需脱产即可学习,只要你有梦想,想高薪! 全新升级:技术栈升级(包含VUE3.0,ES6,Git)+项目升级(前后端联调与功能升级)
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星