Spring Ioc 依賴查找

      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對象

  • 集合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

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章