文档章节

学习模拟Spring(一)

noteman
 noteman
发布于 2017/05/13 23:40
字数 404
阅读 18
收藏 1

                     简单模拟实现 spring ioc 容器

1.容器类(类似与Spring 的factory):

import java.util.Map;

import com.step.base.ioc.util.IocUtil;

public class IocContainer {
	
	/**
	 * 用来存储需要管理的bean
	 * */
	private Map<String,Object> beans;
	
	private String path;
	
	public Object getBean(String name) {
		return beans.get(name);
	}
	
	/**
	 * 初始化容器,传入需要扫描的路径
	 * */
	public IocContainer(String path){
		this.path = path;
	}
	
	/**
	 * 启动容器,初始化各种需要管理的bean
	 * */
	public void start(){
		beans = IocUtil.createBeans(path);
	}

}

 

2: 工具类(类似与Spring的core):

public class IocUtil {

	public static Map<String, Object> createBeans(String path) {
		
		System.out.println("要扫描的包路径是:"+path);
		
		Map<String, Object> map =new HashMap<String,Object>(4);
		//这里为了方便,做了简化处理,不解析路径,直接获得类路径
		String class1 = "com.step.base.ioc.bean.Student";
		String class2 = "com.step.base.ioc.bean.Teacher";
		try {
			/**
			 * 通过路径反射获得类
			 * */
			Class<?> c1 = Class.forName(class1);
			Class<?> c2 = Class.forName(class2);
			/**
			 * 通过反射获得类对象
			 * **/
			Object o1 = c1.newInstance();
			Object o2 = c2.newInstance();
			
			/**
			 * 依赖属性注入
			 * */
			Field[] fs1 = c1.getDeclaredFields();
			for(Field f : fs1){
				//关键的判断属性依赖步骤!!!!!!!!!!!!
				if(f.getType().equals(c2) && (IocUtil.upFirstStr(f.getName()).length()>0)){
					System.out.println("属性开始注入..."+c2.getName());
					Method o1d = c1.getDeclaredMethod("set"+IocUtil.upFirstStr(f.getName()),o2.getClass());
					o1d.invoke(o1, o2);
				}
			}
			//将构造好的bean对象,放到map中,返回
			map.put("Student", o1);
			map.put("Teacher", o2);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return map;
	}
	
	/**
	 * 注意 :java 的get set 方法标准格式
	 * **/
	public static String upFirstStr(String str){
		if( null != str && str.length() > 0){
			return (str.substring(0, 1).toUpperCase())+str.substring(1);
		}
		return "";
	}
	

}

 

3: 测试:

public class IocTest {

	//测试
	@Test
	public void test() {
		//象征性传入扫描的包路径
		String path="com.step.base.ioc.bean";
		//初始化容器
		IocContainer ip = new IocContainer(path);
		//启动容器
		ip.start();
		Student st = (Student) ip.getBean("Student");
		st.yell();
	}

}

4:控制台输出的结果:


要扫描的包路径是:com.step.base.ioc.bean

属性开始注入...com.step.base.ioc.bean.Teacher

我是:jack(默认),我的老师是:tom(默认)

 

© 著作权归作者所有

共有 人打赏支持
下一篇: 注解入门
noteman
粉丝 14
博文 233
码字总数 44869
作品 0
六安
私信 提问
Java程序员从笨鸟到菜鸟之(六十八)细谈Spring(二)自己动手模拟spring

在我们学习spring之前,根据spring的特性,我们来自己来模拟一个spring出来,也就是说不利用spring来实现spring的效果。本实例主要是实现spring的IOC功能。 点击下载源码:用力点 首先我们把...

长平狐
2012/11/12
131
0
初试Spring Boot:构建第一个Web程序

Spring Boot主要提供快速构建项目的功能。本文中我们会使用Spring Boot构建第一个Web程序,同时介绍Spring Boot最简单的功能,例如运行单元测试,发布与调用REST服务等。 本文作者杨恩雄,选...

博文视点
2018/11/14
0
0
轻松理解Dubbo分布式服务框架

Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的...

别打我会飞
2018/10/19
0
0
三分钟轻松了解Spring框架基础知识

做为一个合格的Java开发人员,你一定听说过Spring框架,虽然会应用,但却未必能够深入理解框架的原理,只是像其它人一样,泛泛的只是停留在理解的层面。小编会带着大家一步步了解Spring框架。...

爱尚实训
2018/07/22
0
0
Spring Boot基础教程 ( 一 ) :基础项目构建,引入web模块,完成一个简单的RESTful API

原文出处:didispace 简介 在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复黏贴的配置有一些厌烦?那么您就不妨来试...

didispace
2018/09/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据教程(11.9)hive操作基础知识

上一篇博客分享了hive的简介和初体验,本节博主将继续分享一些hive的操作的基础知识。 DDL操作 (1)创建表 #建表语法CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name ...

em_aaron
今天
0
0
OSChina 周四乱弹 —— 我家猫真会后空翻

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @我没有抓狂 :#今天听这个# 我艇牛逼,百听不厌,太好听辣 分享 Led Zeppelin 的歌曲《Stairway To Heaven》 《Stairway To Heaven》- Led Z...

小小编辑
今天
2
0
node调用dll

先安装python2.7 安装node-gyp cnpm install node-gyp -g 新建一个Electron-vue项目(案例用Electron-vue) vue init simulatedgreg/electron-vue my-project 安装electron-rebuild cnpm ins......

Chason-洪
今天
3
0
scala学习(一)

学习Spark之前需要学习Scala。 参考学习的书籍:快学Scala

柠檬果过
今天
3
0
通俗易懂解释网络工程中的技术,如STP,HSRP等

导读 在面试时,比如被问到HSRP的主备切换时间时多久,STP几个状态的停留时间,自己知道有这些东西,但在工作中不会经常用到,就老是记不住,觉得可能还是自己基础不够牢固,知识掌握不够全面...

问题终结者
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部