本节主要讲述以下内容:
1 简述
2 代码演练
2.1 注解qualifier运用
1 简述
1.1 何种情况使用qualifier注解?
a 按类型自动装配多个bean实例,可以用@qualifier指定唯一
b 目标是构造器或一个多参方法时,最好使用qualifiers,否则用resource(只有一个参数的setter方法)
1.2 xml方式如何运用qualifier
<bean class="com.ddwei.bean"> <qualifier value="main"/> </bean>
2 代码演练
2.1 注解qualifier运用
实体类:
package com.imooc.beanannotation.multibean; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @Component public class BeanInvoker { @Autowired private List<BeanInterface> list; @Autowired private Map<String, BeanInterface> map; @Autowired @Qualifier("beanImplOne") private BeanInterface bInterface; // public void say(){ if(null!=list&&0!=list.size()){ System.out.println("list..."); for(BeanInterface bean :list){ System.out.println(bean.getClass().getName()); } }else{ System.out.println("list is not null"); } if(null!=map&&0!=map.size()){ System.out.println("map..."); for(Map.Entry<String,BeanInterface> entry :map.entrySet()){ System.out.println(entry.getKey()+" "+entry.getClass().getName()); } }else{ System.out.println("Map<String,BeanInterface> map is null"); } if(null!=bInterface){ System.out.println(bInterface.getClass().getName()); }else{ System.out.println("bInterface is null"); } } }
测试类:
package com.imooc.beaninvoker; import org.junit.Test; import com.imooc.beanannotation.injection.service.InjectionService; import com.imooc.beanannotation.multibean.BeanInvoker; import com.imooc.test.base.UnitTestBase; public class TestBeanInvoker extends UnitTestBase{ public TestBeanInvoker() { super("classpath*:spring-beaninvoker.xml"); } @Test public void testBeanInvoker(){ try { BeanInvoker bInvoker = super.getbean("beanInvoker"); bInvoker.say(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } }
xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.imooc.beanannotation"/> </beans>
dao1:
package com.imooc.beanannotation.multibean; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @Order(2) @Component public class BeanImplOne implements BeanInterface{ }
dao2:
package com.imooc.beanannotation.multibean; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @Order(1) @Component public class BeanImplTwo implements BeanInterface{ }
打印日志:
三月 20, 2019 6:39:04 上午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@789df61d: startup date [Wed Mar 20 06:39:04 CST 2019]; root of context hierarchy 三月 20, 2019 6:39:04 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from URL [file:/F:/xiangmu3/Xin/FuQiang/Spring/ddwei-dao/target/classes/spring-beaninvoker.xml] list... 三月 20, 2019 6:39:06 上午 org.springframework.context.support.ClassPathXmlApplicationContext doClose 信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@789df61d: startup date [Wed Mar 20 06:39:04 CST 2019]; root of context hierarchy com.imooc.beanannotation.multibean.BeanImplTwo com.imooc.beanannotation.multibean.BeanImplOne map... beanImplOne java.util.LinkedHashMap$Entry beanImplTwo java.util.LinkedHashMap$Entry com.imooc.beanannotation.multibean.BeanImplOne