文档章节

学习模拟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
粉丝 15
博文 225
码字总数 41963
作品 0
六安
三分钟轻松了解Spring框架基础知识

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

爱尚实训
07/22
0
0
spring boot框架学习4-spring boot核心(3)

本节主要: 1:spring boot 为我们提供的 starter pom 都有哪些 2:怎么添加xml配置文件 3:日志相关 本文是《凯哥陪你学系列-框架学习之spring boot框架学习》中第四篇 spring boot框架学习...

凯哥java
2017/10/31
0
0
spring boot框架学习6-spring boot的web开发(2)

本章节主要内容: 通过前面的学习,我们了解并快速完成了spring boot第一个应用。spring boot企业级框架,那么spring boot怎么读取静态资源?如js文件夹,css文件以及png/jpg图片呢?怎么自定...

凯哥java
2017/11/06
0
0
spring boot框架学习5-spring boot的web开发(1)

本章节主要内容: 通过前面的学习,我们了解并快速完成了spring boot第一个应用。spring boot企业级框架,那么spring boot怎么读取静态资源?如js文件夹,css文件以及png/jpg图片呢?怎么自定...

凯哥java
2017/11/01
0
0
spring cloud 入门系列:总结

从我第一次接触Spring Cloud到现在已经有3个多月了,当时是在博客园里面注册了账号,并且看到很多文章都在谈论微服务,因此我就去了解了下,最终决定开始学习Spring Cloud。我在一款阅读App...

JAVA开发老菜鸟
07/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

7 个致命的 Linux 命令

导读 如果你是一个 Linux 新手,在好奇心的驱使下,可能会去尝试从各个渠道获得的命令。以下是 7 个致命的 Linux 命令,轻则使你的数据造成丢失,重则使你的系统造成瘫痪,所以,你应当竭力避...

问题终结者
今天
0
0
设计模式:工厂方法模式(工厂模式)

工厂方法模式才是真正的工厂模式,前面讲到的静态工厂模式实际上不能说是一种真正意义上的设计模式,只是一种变成习惯。 工厂方法的类图: 这里面涉及到四个种类: 1、抽象产品: Product 2、...

京一
今天
0
0
区块链和数据库,技术到底有何区别?

关于数据库和区块链,总会有很多的困惑。区块链其实是一种数据库,因为他是数字账本,并且在区块的数据结构上存储信息。数据库中存储信息的结构被称为表格。但是,区块链是数据库,数据库可不...

HiBlock
今天
0
0
react native 开发碰到的问题

react-navigation v2 问题 问题: static navigationOptions = ({navigation, navigationOptions}) => ({ headerTitle: ( <Text style={{color:"#fff"}}>我的</Text> ), headerRight: ( <View......

罗培海
今天
0
0
Mac Docker安装流程

久仰Docker大名已久,于是今天趁着有空,尝试了一下Docker 先是从docker的官网上下载下来mac版本的docker安装包,安装很简易,就直接拖图标就好了。 https://www.docker.com/products/docker...

writeademo
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部