实现的功能

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类代码

  1. package ioc.core.test.service;
  2.  
  3. /**
  4. * 一个普通的类,用于测试是否可以创建对象
  5. * @author ranger
  6. *
  7. */
  8. public class UserService {
  9.  
  10. public void login(){
  11. System.out.println("-登录-");
  12. }
  13. }

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. }

测试代码

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

  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. @Test
  11. public void login(){
  12. try {
  13. AnntationApplicationContext context=new AnntationApplicationContext(Config.class);
  14. //如果可以打印出容器里面的对象,说明成功
  15. UserService userService = context.getBean("UserService", UserService.class);
  16. userService.login();
  17. } catch (Exception e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. }

一起写框架-Ioc内核容器的实现-基础功能-getBean(五)的更多相关文章

  1. 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan(四)

    功能说明 该步骤实现的功能包括: 1. 启动程序时,将@ComponentScan加载的类,创建对象并放在容器里面. 2. 通过ApplicatoinContext的getBean()方法获得容器里面 ...

  2. 一起写框架-Ioc内核容器的实现-基础功能-容器对象名默认首字母小写(八)

    实现功能 --前面实现的代码-- 默认的对象名就类名.不符合Java的命名规范.我们希望默认的对象名首字母小写. 实现思路 创建一个命名规则的帮助类.实现将对大写开头的对象名修改为小写开头. 实现步骤 ...

  3. 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan支持组件注解限制(七)

    实现功能 以上的代码我们发现.我们都是将@ComponentScan扫描的路径下的所有类都加载到容器中的. 而实际需求,我们并不希望所有的类都创建对象,而是加了组件注解@Controller,@Ser ...

  4. 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan支持多包扫描(六)

    实现功能 1.我们看到@ComponentScan注解一个开始定义就是需要支持,扫描多个包,将多个包的类名获取到.现在就实现这个功能. 实现思路 根据传入的字符串数组,获得多个包下的类全限制名. 实现 ...

  5. 一起写框架-Ioc内核容器的实现-基础API的定义(三)

    Ioc内核要解决的问题 1.被调用方,在程序启动时就要创建好对象,放在一个容器里面. 2.调用方使用一个接口或类的引用(不用使用new),就可以创建获得对象. 解决这个两个问题的思路 1.定义一个对象 ...

  6. 自己动手写框架——IoC的实现

    先看看 IoC百度百科 优化过程 namespace Test { class Program { static void Main(string[] args) { //场景 某公司客服要回访一些客 ...

  7. 用C写一个web服务器(一) 基础功能

    .container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px } .conta ...

  8. 一起写框架-控制反转(Ioc)概述(二)

    控制反转概述 控制反转(Inversion of Control,英文缩写为IoC),就是将代码的调用的控制权,由调用方转移给被调用方. 如图:修改代码A类的代码,才能将B类的对象换成C类.代码的控制 ...

  9. Spring框架IOC容器和AOP解析 非常 有用

    Spring框架IOC容器和AOP解析   主要分析点: 一.Spring开源框架的简介  二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面 ...

随机推荐

  1. .Net 内存对象分析

    在生产环境中,通过运行日志我们会发现一些异常问题,此时,我们不能直接拿VS远程到服务器上调试,同时日志输出的信息无法百分百反映内存中对象的状态,比如说我们想查看进程中所有的Socket连接状态.服务路 ...

  2. JavaScript高级(01)

    前端开发工具 1.1. WebStorm介绍和下载 l  介绍 WebStorm是JetBrains 推出的一款强大的HTML5编辑工具,拥有丰富的代码快速编辑,可以智能的补全代码.代码格式化.htm ...

  3. Python实战之双向队列deque/queue学习笔记及简单练习

    ['__add__', '__bool__', '__class__', '__contains__', '__copy__', '__delattr__', '__delitem__', '__di ...

  4. wxPython中基本控件学习

    wxPython工具包提供了多种不同的窗口部件,包括了本章所提到的基本控件.我们涉及静态文本.可编辑的文本.按钮.微调.滑块.复选框.单选按钮.选择器.列表框.组合框和标尺.对于每种窗口部件,我们将提 ...

  5. 浅谈Java多态

    什么是Java中的多态?又是一个纸老虎的概念,老套路,把它具体化,细分化,先想三个问题(注意,这里不是简单的化整为零,而是要建立在学习一个新概念时的思考框架): 1.这个东西有什么用?用来干什么的?它 ...

  6. mysql登录出现1045错误修改方法

    在cmd中输入mysql -uroot -p出现1045错误如下: ERROR 1045(28000): Access denied for user 'root'@'localhost'(using ...

  7. win10 uwp 拖动控件

    我们会使用控件拖动,可以让我们做出好看的动画,那么我们如何移动控件,我将会告诉大家多个方法.其中第一个是最差的,最后的才是我希望大神你去用. Margin 移动 我们可以使用Margin移动,但这是w ...

  8. PDO详解

    PDO扩展为PHP定义了一个访问数据库的轻量的,持久的接口.实现了PDO接口的每一种数据库驱动都能以正则扩展的形式把他们各自的特色表现出来.注意:利用PDO扩展本身并不能实现任何数据库函数.你必须使用 ...

  9. 【转】Linux设备驱动--块设备(一)之概念和框架

    原文地址:Linux设备驱动--块设备(一)之概念和框架 基本概念   块设备(blockdevice) --- 是一种具有一定结构的随机存取设备,对这种设备的读写是按块进行的,他使用缓冲区来存放暂时 ...

  10. 使用Git与Github创建自己的远程仓库

    原因 早就想创建一个自己的远程仓库,方便发布到Nuget上,自己用也好,项目组用也好,都方便. 今天抽了个时间建了个仓库,随便记下溜方便后来的人. 流程 1,创建自己的GitHub仓库 首先需要到 G ...