一起写框架-Ioc内核容器的实现-基础功能-getBean(五)

时间:2022-04-22 17:45:16

实现的功能

1. 启动程序时,将@ComponentScan加载的类,创建对象并放在容器里面。(查看上一篇文)

2. 通过ApplicatoinContext的getBean()方法获得容器里面的对象。

(1)使用getBean("对象名")返回的对象都Object类型

(2)使用getBean("对象名",<对象类型>),返回指定类型的对象

思路说明

在上面的代码的基础上,在AbstractApplicationContext抽象类实现getBean的方法。通过getBean可以获得容器中的对象。

实现步骤

实现使用getBean("对象名")返回的对象都Object类型

1.在AbstractApplicationContext重写getBean方法

     /**
* 实现从容器通过对象名,获得对象
*/
@Override
public Object getBean(String objectName) {
//1.获得容器中的所有对象
Map<String, Object> objects = this.getContext().getObjects();
//2.通过Key获得容器中的对象
Object object = objects.get(objectName);
//3.如果对象不为空,返回对象
if(object!=null){
return object;
}
return null;
}

测试代码

1.测试对象UserService类代码

package ioc.core.test.service;

/**
* 一个普通的类,用于测试是否可以创建对象
* @author ranger
*
*/
public class UserService { public void login(){
System.out.println("-登录-");
}
}

2.通过getBean获得容器中的UserService对象

 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 = (UserService) context.getBean("UserService");
//如果可以调用login方法,说明成功。
userService.login();
} catch (Exception e) {
e.printStackTrace();
}
} }

测试结果

一起写框架-Ioc内核容器的实现-基础功能-getBean(五)

实现使用getBean("对象名",<对象类型>),返回指定类型的对象

1.在ApplicationContext接口增加一个getBean的重载方法

 package ioc.core;

 /**
* Ioc框架的容器操作接口
* @author ranger
*
*/
public interface ApplicationContext {
/**
* 通过容器里面的对象名,返回容器中的对象
* @param objectName
* @return
*/
Object getBean(String objectName); /**
* 通过容器里面的对象名,返回容器中的对象,指定返回类型
* @param objectName
* @param className
* @return
*/
<T> T getBean(String objectName,Class<T> className); }

2.AbstractApplicationContext类实现该方法

     @Override
public <T> T getBean(String objectName, Class<T> className) {
//1.获得容器中的所有对象
Map<String, Object> objects = this.getContext().getObjects();
//2.通过Key获得容器中的对象
Object object = objects.get(objectName);
//3.如果对象不为空,,判断对象是否与传入的类类型的父接口或类类型兼容,返回对象
if(object!=null&&className.isAssignableFrom(object.getClass())){
return (T) object;
}
return null;
}

测试代码

--根据传入的类型,直接返回指定的类型,不用强制转换

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();
}
}
}