autowired问题

autowired问题

1
2
3
4
package com.imooc.spring.ioc.dao;
 
public interface IUserDao {
}
1
2
3
4
5
6
7
8
9
10
package com.imooc.spring.ioc.dao;
 
import org.springframework.stereotype.Repository;
// 组件类型注解默认为beanId首字母小写
@Repository
public class UserDao implements IUserDao {
    public UserDao(){
        System.out.println("正在创建userDao");
    }
}
1
2
3
4
5
6
7
8
9
10
package com.imooc.spring.ioc.dao;
 
import org.springframework.stereotype.Repository;
 
@Repository
public class UserODao implements IUserDao{
    public UserODao(){
        System.out.println("正在创建udao2");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 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,这是为什么呢?

正在回答

登陆购买课程后可参与讨论,去登陆

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

祝学习愉快~

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师
插入代码