(修改完成)spring 梳理5-- 使用配置文件注入开发 自动装配

spring作为长期以来java最火的框架,其IOC做的十分的健全,以上情况都是我们手动装配,但是我们也说了 spring及其灵活的帮助我们完成了解耦工作,如果所以的类都是自己手动完成注入,他的解耦能力就不会体现的那么强烈了,于是spring还为我们提供了自动装配的能力 只要我们的Beans满足bean之间的依赖,且这些bean都存在于容器,且唯一,那么我么就可以按照约定进行bean 的自动装配。同时还能大量的减少配置文件的数量。

 

本章使用配置文件的方式进行自动注入,下章会开启全新的注解方式注入

 

 1. 按名称

 

<bean id="user" class="com.xinzhi.entity.User" autowire="byName">
        <property name="name" value="孙锐"/>

        <!--property name="address" ref="address"/-->
        <!--其余略-->
        <!--property name="dog" ref="jinmao"/-->

    </bean>




    <bean id="address" class="com.xinzhi.entity.Address">
        <property name="addressInfo" value="南京"/>
    </bean>



    <bean id="teddy" class="com.xinzhi.entity.Dog">
        <property name="type" value="泰迪"/>
    </bean>

 

结果:

User(name=孙锐, address=Address(addressInfo=南京), hobbies=[sing, dance, rap, basketball], duties=[班长, 学习委员], familyTies={father=父亲, mother=母亲}, carts=[笔, 衣服, 鞋子], workExperience={第一年=实习了, 第二年=正式工作了}, dog=null)

 

发现address注入了,但是狗没有注入!

因为User类里面的dog变量,在xml里面,沒有找到 <bean>的id 与之相同

 

 

2. 按类型

<bean id="user" class="com.xinzhi.entity.User" autowire="byType">
        <property name="name" value="孙锐"/>
        <!--property name="address" ref="address"/-->
        <!--其他省略-->
        <!--property name="dog" ref="jinmao"/-->
    </bean>




    <bean id="address" class="com.xinzhi.entity.Address">
        <property name="addressInfo" value="南京"/>
    </bean>



    <bean id="teddy" class="com.xinzhi.entity.Dog">
        <property name="type" value="泰迪"/>
    </bean>




    <bean id="jinmao" class="com.xinzhi.entity.Dog">
        <property name="type" value="金毛"/>
    </bean>        

 

 

测试,报错!

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'user' defined in class path resource [beans.xml]: Unsatisfied dependency expressed through bean property 'dog'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.xinzhi.entity.Dog' available: expected single matching bean but found 2: teddy,jinmao

    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1515)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1395)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:845)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:144)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:85)
    at TestFirst.testDI(TestFirst.java:27)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.xinzhi.entity.Dog' available: expected single matching bean but found 2: teddy,jinmao
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:221)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1229)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1171)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1500)
    ... 35 more


Process finished with exit code -1
错误

 

 

 

这种错误以后比较常见,需要注意避免。按照类型注入,容器内的bean必须是单例

 

posted @ 2021-01-23 10:49  Master_Sun  阅读(96)  评论(0编辑  收藏  举报