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必须是单例