Spring ioc 有依賴查找和依賴注入,之前不太明白依賴查找是什么意思,翻了一大堆博客看了好多定義也不太清楚 ,后來看了小馬哥視頻,他通過代碼演示,清楚地講解了什么是 依賴查找以及幾種依賴查找的方法,本文結合代碼淺析一下Spring ioc的依賴查找,通過代碼來更加形象的理解依賴查找。
1.根據bean名稱查找:
-
實時查找
-
1.配置xml文件
1 <beans xmlns="http://www.springframework.org/schema/beans" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://www.springframework.org/schema/beans 4 http://www.springframework.org/schema/beans/spring-beans.xsd 5 "> 6 <!--實時查找--> 7 <bean id="User" class="thinking.in.spring.ioc.overview.domain.User"> 8 <property name="id" value="1"/> 9 <property name="name" value="小明"/> 10 </bean> 11 <!--延時查找--> 12 <bean id="objectFactory" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean"> 13 <property name="targetBeanName" value="User"/> 14 </bean> 15 </beans>
2.啟動spring應用上下文
1 public class DenpendencyLookupDemo { 2 public static void main(String[] args) { 3 BeanFactory beanFactory=new ClassPathXmlApplicationContext("META-INF/dependency-Lookup-context.xml"); 4 //時實查找 5 User user=(User) beanFactory.getBean("User"); 6 System.out.println("實時查找"+user.toString()); 7 //延時查找 8 ObjectFactory<User> objectFactory= (ObjectFactory<User>)beanFactory.getBean("objectFactory"); 9 User user1=objectFactory.getObject(); 10 System.out.println("延時查找"+user1.toString()); 11 } 12 }
輸出:
2.通過類型查找
-
集合Bean對象
1 /** 2 * 根據類型查找單個bean 3 * @param beanFactory 4 */ 5 private static void lookupSingleByType(BeanFactory beanFactory){ 6 7 User user2 = beanFactory.getBean(User.class); 8 System.out.println("根據類型時實查找單一" + user2.toString()); 9 } 10 /** 11 * 查找多個bean 12 */ 13 private static void lookupCollectionBtType (BeanFactory beanFactory){ 14 if (beanFactory instanceof ListableBeanFactory) { 15 ListableBeanFactory listableBeanFactory = (ListableBeanFactory) beanFactory; 16 Map<String, User> users = listableBeanFactory.getBeansOfType(User.class); 17 System.out.println("查找多個bean" + users); 18 } 19 }
輸出:
3.通過注解查找
1 <beans xmlns="http://www.springframework.org/schema/beans" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://www.springframework.org/schema/beans 4 http://www.springframework.org/schema/beans/spring-beans.xsd 5 "> 6 <!--實時查找--> 7 <bean id="User" class="thinking.in.spring.ioc.overview.domain.User"> 8 <property name="id" value="1"/> 9 <property name="name" value="小明"/> 10 </bean> 11 <!--延時查找--> 12 <bean id="objectFactory" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean"> 13 <property name="targetBeanName" value="User"/> 14 </bean> 15 <bean id="superUser" class="thinking.in.spring.ioc.overview.domain.SuperUser" parent="User" primary="true"> 16 <property name="number" value="1"/> 17 </bean> 18 </beans>
@Super注解
1 @Target({ElementType.TYPE}) 2 @Retention(RetentionPolicy.RUNTIME) 3 public @interface Super { 4 }
SuperUser類
@Super public class SuperUser extends User{ private String number; public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } @Override public String toString() { return "SuperUser{" + "number='" + number + '\'' + "} " + super.toString(); } }
用法
1 /** 2 * 通過注解查找 3 * @param beanFactory 4 */ 5 private static void lookupByAnnotatonType(BeanFactory beanFactory){ 6 if(beanFactory instanceof ListableBeanFactory){ 7 ListableBeanFactory listableBeanFactory=(ListableBeanFactory)beanFactory;
//根據注解查找 8 Map<String,User> users=( Map)listableBeanFactory.getBeansWithAnnotation(Super.class); 9 System.out.println("查找標注@Super 所有的User集合對象"+users); 10 } 11 }
輸出:
只查找出標注了@Super注解且是User類型的Bean