一起写框架-Ioc内核容器的实现-基础功能-getBean(五)
实现的功能
1. 启动程序时,将@ComponentScan加载的类,创建对象并放在容器里面。(查看上一篇文)
2. 通过ApplicatoinContext的getBean()方法获得容器里面的对象。
(1)使用getBean("对象名")返回的对象都Object类型
(2)使用getBean("对象名",<对象类型>),返回指定类型的对象
思路说明
在上面的代码的基础上,在AbstractApplicationContext抽象类实现getBean的方法。通过getBean可以获得容器中的对象。
实现步骤
实现使用getBean("对象名")返回的对象都Object类型
1.在AbstractApplicationContext重写getBean方法
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对象
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的重载方法
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(); } } }