一起写框架-Ioc内核容器的实现-基础功能-getBean(五)
实现的功能
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();
}
} }
测试结果
实现使用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();
}
}
}
一起写框架-Ioc内核容器的实现-基础功能-getBean(五)的更多相关文章
- 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan(四)
功能说明 该步骤实现的功能包括: 1. 启动程序时,将@ComponentScan加载的类,创建对象并放在容器里面. 2. 通过ApplicatoinContext的getBean()方法获得容器里面 ...
- 一起写框架-Ioc内核容器的实现-基础功能-容器对象名默认首字母小写(八)
实现功能 --前面实现的代码-- 默认的对象名就类名.不符合Java的命名规范.我们希望默认的对象名首字母小写. 实现思路 创建一个命名规则的帮助类.实现将对大写开头的对象名修改为小写开头. 实现步骤 ...
- 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan支持组件注解限制(七)
实现功能 以上的代码我们发现.我们都是将@ComponentScan扫描的路径下的所有类都加载到容器中的. 而实际需求,我们并不希望所有的类都创建对象,而是加了组件注解@Controller,@Ser ...
- 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan支持多包扫描(六)
实现功能 1.我们看到@ComponentScan注解一个开始定义就是需要支持,扫描多个包,将多个包的类名获取到.现在就实现这个功能. 实现思路 根据传入的字符串数组,获得多个包下的类全限制名. 实现 ...
- 一起写框架-Ioc内核容器的实现-基础API的定义(三)
Ioc内核要解决的问题 1.被调用方,在程序启动时就要创建好对象,放在一个容器里面. 2.调用方使用一个接口或类的引用(不用使用new),就可以创建获得对象. 解决这个两个问题的思路 1.定义一个对象 ...
- 自己动手写框架——IoC的实现
先看看 IoC百度百科 优化过程 namespace Test { class Program { static void Main(string[] args) { //场景 某公司客服要回访一些客 ...
- 用C写一个web服务器(一) 基础功能
.container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px } .conta ...
- 一起写框架-控制反转(Ioc)概述(二)
控制反转概述 控制反转(Inversion of Control,英文缩写为IoC),就是将代码的调用的控制权,由调用方转移给被调用方. 如图:修改代码A类的代码,才能将B类的对象换成C类.代码的控制 ...
- Spring框架IOC容器和AOP解析 非常 有用
Spring框架IOC容器和AOP解析 主要分析点: 一.Spring开源框架的简介 二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面 ...
随机推荐
- Pycharm安装、设置、优化
一.版本选择 建议安装5.0版本,因为好注册,这个你懂得. 下载地址: https://confluence.jetbrains.com/display/PYH/Previous+PyCharm+Re ...
- python random从集合中随机选择元素
1.使用python random模块的choice方法随机选择某个元素 from random import choice foo = ['a', 'b', 'c', 'd', 'e'] print ...
- Java多线程——创建线程的两种方式
创建线程方式一:继承Thread类. 步骤:1,定义一个类继承Thread类.2,覆盖Thread类中的run方法.3,直接创建Thread的子类对象创建线程.4,调用start方法开启线程并调用线程 ...
- (10.20)Java小作业!
今天想要和大家分享一道我最近遇到的题,里面既包括了嵌套循环的运用,还有函数的定义与调用,我个人觉得挺有价值的. 打印一个由*号构成的等腰三角形: 具体的解题方法如下: public class get ...
- Spring高级装配
Spring高级装配 目录 一.Profile(根据开发环境创建对应的bean) 二.条件化的创建bean(根据条件创建bean) 三.处理自动装配歧义性(指定首选bean.限定符限制bean) 四. ...
- 模块:time,random,os,sys
时间模块 import time # print(time.time()) #时间戳 # print(time.strftime('%Y-%m-%d %X')) #格式化字符 # print(time ...
- 安装阿里Java代码规约插件
概述 2017年10月14日杭州云栖大会,Java代码规约扫描插件全球首发仪式正式启动,规范正式以插件形式公开走向业界,引领Java语言的规范之路.目前,插件已在云效公有云产品中集成,立即体验!(云效 ...
- 如何用VS EF连接 Mysql,以及执行SQL语句 和存储过程?
VS2013, MySQL5.7.18 , MySQL5.7.14 执行SQL语句: ztp_user z = new ztp_user(); object[] obj = new object[] ...
- LeetCode 205. Isomorphic Strings (同构字符串)
Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...
- 一次从0到1的java项目实践清单
虽说工作就是简单的事情重复做,但不是所有简单的事你都能有机会做的. 我们平日工作里,大部分时候都是在做修修补补的工作,而这也是非常重要的.做好修补工作,做好优化工作,足够让你升职加薪! 但是如果有机会 ...