学习模拟Spring(一)
博客专区 > noteman 的博客 > 博客详情
学习模拟Spring(一)
noteman 发表于9个月前
学习模拟Spring(一)
  • 发表于 9个月前
  • 阅读 16
  • 收藏 1
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

摘要: spring ioc aop

                     简单模拟实现 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(默认)

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 13
博文 206
码字总数 39577
×
noteman
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: