文档章节

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

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

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

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

didispace
09/27
0
0
轻松理解Dubbo分布式服务框架

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

别打我会飞
昨天
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的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
1
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
19
0
学习设计模式——观察者模式

1. 认识观察者模式 1. 定义:定义对象之间一种一对多的依赖关系,当一个对象状态发生变化时,依赖该对象的其他对象都会得到通知并进行相应的变化。 2. 组织结构: Subject:目标对象类,会被...

江左煤郎
昨天
1
0
emoji

前言:随着iOS系统版本的升级,对原生emoji表情的支持也越来越丰富。emoji表情是unicode码中为表情符号设计的一组编码,当然,还有独立于unicode的另一套编码SBUnicode,在OS系统中,这两种编...

HeroHY
昨天
2
0
rabbitmq学习(二)

生产者消费者初级案列 ChannelUtils package com.hensemlee.rabbitmq;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.Connecti......

hensemlee
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部