一塊兒寫框架-Ioc內核容器的實現-基礎功能-getBean(五)

 

實現的功能

1. 啓動程序時,將@ComponentScan加載的類,建立對象並放在容器裏面。(查看上一篇文)框架

2. 經過ApplicatoinContextgetBean()方法得到容器裏面的對象。ide

   (1)使用getBean("對象名")返回的對象都Object類型測試

   (2)使用getBean("對象名",<對象類型>),返回指定類型的對象this

思路說明

 

在上面的代碼的基礎上,在AbstractApplicationContext抽象類實現getBean的方法。經過getBean能夠得到容器中的對象。spa

 

 

實現步驟

實現使用getBean("對象名")返回的對象都Object類型

 

1.在AbstractApplicationContext重寫getBean方法code

 

 1     /**
 2      * 實現從容器經過對象名,得到對象
 3      */
 4     @Override
 5     public Object getBean(String objectName) {
 6         //1.得到容器中的全部對象
 7         Map<String, Object> objects = this.getContext().getObjects();
 8         //2.經過Key得到容器中的對象
 9         Object object = objects.get(objectName);
10         //3.若是對象不爲空,返回對象
11         if(object!=null){
12             return object;
13         }
14         return null;
15     }

 

 

測試代碼

1.測試對象UserService類代碼對象

package ioc.core.test.service;

/**
 * 一個普通的類,用於測試是否能夠建立對象
 * @author ranger
 *
 */
public class UserService {
    
    public void login(){
        System.out.println("-登陸-");
    }
}

 

2.經過getBean得到容器中的UserService對象blog

 

 1 package ioc.core.test;
 2 
 3 import org.junit.Test;
 4 
 5 import ioc.core.impl.AnntationApplicationContext;
 6 import ioc.core.test.config.Config;
 7 import ioc.core.test.service.UserService;
 8 
 9 public class AnntationApplicationContextTest {
10     
11     @Test
12     public void login(){
13         try {
14             AnntationApplicationContext context=new AnntationApplicationContext(Config.class);
15             //若是能夠打印出容器裏面的對象,說明成功
16             UserService userService = (UserService) context.getBean("UserService");
17             //若是能夠調用login方法,說明成功。
18             userService.login();
19         } catch (Exception e) {
20             e.printStackTrace();
21         }
22     }
23 
24 }

測試結果接口

 

實現使用getBean("對象名",<對象類型>),返回指定類型的對象

 

1.ApplicationContext接口增長一個getBean的重載方法get

 

 1 package ioc.core;
 2 
 3 /**
 4  * Ioc框架的容器操做接口
 5  * @author ranger
 6  *
 7  */
 8 public interface ApplicationContext {
 9     /**
10      * 經過容器裏面的對象名,返回容器中的對象
11      * @param objectName
12      * @return
13      */
14     Object getBean(String objectName);
15     
16     /**
17      * 經過容器裏面的對象名,返回容器中的對象,指定返回類型
18      * @param objectName
19      * @param className
20      * @return
21      */
22     <T> T getBean(String objectName,Class<T> className);
23 
24 }

 

2.AbstractApplicationContext類實現該方法

 

 1     @Override
 2     public <T> T getBean(String objectName, Class<T> className) {
 3         //1.得到容器中的全部對象
 4         Map<String, Object> objects = this.getContext().getObjects();
 5         //2.經過Key得到容器中的對象
 6         Object object = objects.get(objectName);
 7         //3.若是對象不爲空,,判斷對象是否與傳入的類類型的父接口或類類型兼容,返回對象
 8         if(object!=null&&className.isAssignableFrom(object.getClass())){
 9             return (T) object;
10         }
11         return null;
12     }

 

測試代碼

--根據傳入的類型,直接返回指定的類型,不用強制轉換

package ioc.core.test;

import org.junit.Test;

import ioc.core.impl.AnntationApplicationContext;
import ioc.core.test.config.Config;
import ioc.core.test.service.UserService;

public class AnntationApplicationContextTest {
    @Test
    public void login(){
        try {
            AnntationApplicationContext context=new AnntationApplicationContext(Config.class);
            //若是能夠打印出容器裏面的對象,說明成功
            UserService userService = context.getBean("UserService", UserService.class);
            userService.login();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
相關文章
相關標籤/搜索