1. 啓動程序時,將@ComponentScan加載的類,建立對象並放在容器裏面。(查看上一篇文)框架
2. 經過ApplicatoinContext的getBean()方法得到容器裏面的對象。ide
(1)使用getBean("對象名")返回的對象都Object類型測試
(2)使用getBean("對象名",<對象類型>),返回指定類型的對象this
在上面的代碼的基礎上,在AbstractApplicationContext抽象類實現getBean的方法。經過getBean能夠得到容器中的對象。spa
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 }
測試結果接口
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(); } } }