模拟ClasspathXmlApplication:

package junit.test;

import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.apache.commons.beanutils.ConvertUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; public class ItcastClassPathXmlApplicationContext {
private ArrayList<BeanDefinition> beanDefinitions=new ArrayList<BeanDefinition>();
private Map<String,Object> sigletons=new HashMap<String,Object>(); public ItcastClassPathXmlApplicationContext(String filename){
this.readXml(filename);
this.instanceBeans();
this.annotationInject();
this.injectObject();
}
/**
* 注解方式装载对象
*/
private void annotationInject() {
for(String beanName :sigletons.keySet()){
Object bean=sigletons.get(beanName);
if(bean!=null){
try{
/*
* 查找方法上的注解
*/
PropertyDescriptor[] ps=Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();
for(PropertyDescriptor properdesc:ps){
Method setter=properdesc.getWriteMethod();
if(setter!=null && setter.isAnnotationPresent(ItcastResource.class)){
ItcastResource itcastResource=setter.getAnnotation(ItcastResource.class);
Object value=null;
if(itcastResource.name()!=null && !"".equals(itcastResource.name())){
value=sigletons.get(itcastResource.name());
}else{
value=sigletons.get(properdesc.getName());
if(value==null){
for(String key:sigletons.keySet()){
if(properdesc.getPropertyType().isAssignableFrom(sigletons.get(key).getClass())){
value=sigletons.get(key);
break;
}
}
}
}
setter.setAccessible(true);
setter.invoke(bean, value);
}
} /**
* 查找字段上的注解
*/
Field[] fields=bean.getClass().getDeclaredFields();
for(Field field:fields){
if(field.isAnnotationPresent(ItcastResource.class)){
ItcastResource resource=field.getAnnotation(ItcastResource.class);
Object value=null;
if(resource.name()!=null && !"".equals(resource.name())){
value=sigletons.get(resource.name());
}else{
value=sigletons.get(field.getName());
if(value==null){
for(String key:sigletons.keySet()){
if(field.getType().isAssignableFrom(sigletons.get(key).getClass())){
value=sigletons.get(key);
break;
}
}
}
}
String methodName="set"+field.getName().substring(,).toUpperCase()+field.getName().substring();
Method setter=bean.getClass().getMethod(methodName, field.getType());
setter.setAccessible(true);
setter.invoke(bean, value);
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
} /**
* 为bean对象的属性注入值
*/
private void injectObject() {
for(BeanDefinition beanDefinition: beanDefinitions){
Object bean=sigletons.get(beanDefinition.getId());
if(bean!=null){
try {
PropertyDescriptor[] ps=Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();
for(PropertyDefinition propertyDefinition:beanDefinition.getPropertys()){
for(PropertyDescriptor properdesc:ps){
if(propertyDefinition.getName().equals(properdesc.getName())){
Method setter=properdesc.getWriteMethod();//获取属性的setter方法
if(setter!=null){
Object value=null;
if(propertyDefinition.getRef()!=null &&!"".equals(propertyDefinition.getRef())){
value=sigletons.get(propertyDefinition.getRef());
}else{
value=ConvertUtils.convert(propertyDefinition.getValue(), properdesc.getPropertyType());
}
setter.setAccessible(true);
setter.invoke(bean, value); }
break; }
}
}
} catch (Exception e) {
e.printStackTrace();
} }
}
}
/**
* 完成bean的实例化
*/
private void instanceBeans(){
for(BeanDefinition bd:beanDefinitions){
try {
if(bd.getClassName()!=null && !"".equals(bd.getClassName().trim()))
sigletons.put(bd.getId(), Class.forName(bd.getClassName()).newInstance());
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 解析xml文件
* @param fileName
*/
private void readXml(String fileName) {
File inputXml=new File(fileName);
URL url=this.getClass().getClassLoader().getResource(fileName);
SAXReader saxReader=new SAXReader();
try {
Document document=saxReader.read(url);
Element root=document.getRootElement();
@SuppressWarnings("unchecked")
List<Element> beans=root.elements("bean"); for(Element bean:beans){
String id= bean.attributeValue("id");
String className=bean.attributeValue("class");
BeanDefinition bd=new BeanDefinition(id,className);
@SuppressWarnings("unchecked")
List<Element> propertys=bean.elements("property");
for(Element property:propertys){
String propertyName = property.attributeValue("name");
String propertyRef = property.attributeValue("ref");
String propertyValue=property.attributeValue("value");
PropertyDefinition pd=new PropertyDefinition(propertyName, propertyRef,propertyValue);
bd.getPropertys().add(pd);
}
beanDefinitions.add(bd);
} } catch (DocumentException e) {
e.printStackTrace();
}
} public Object getBean(String beanName){
return this.sigletons.get(beanName);
}
}

存放bean信息的类:

package junit.test;

import java.util.ArrayList;
import java.util.List; /**
* 存放读取到的bean的信息
* @author Administrator
*
*/
public class BeanDefinition {
private String id;
private String className;
private List<PropertyDefinition> propertys=new ArrayList<PropertyDefinition>(); public BeanDefinition() {
super();
} public BeanDefinition(String id, String className) {
super();
this.id = id;
this.className = className;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
} public void setPropertys(List<PropertyDefinition> propertys) {
this.propertys = propertys;
} public List<PropertyDefinition> getPropertys() {
return propertys;
} }

存放bean中属性信息的类:

package junit.test;
/**
* 属性的定义类
* @author Administrator
*
*/
public class PropertyDefinition { private String name;
private String ref;
private String value;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public PropertyDefinition(String name, String ref,String value) {
super();
this.name = name;
this.ref = ref;
this.value=value;
}
public PropertyDefinition() {
super();
}
public String getRef() {
return ref;
}
public void setRef(String ref) {
this.ref = ref;
}
public void setValue(String value) {
this.value = value;
}
public String getValue() {
return value;
} }

对应Resource注解:

package junit.test;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.METHOD})
public @interface ItcastResource {
public String name() default "";
}

spring框架IOC原理分析代码的更多相关文章

  1. Spring之IOC原理及代码详解

    一.什么是IOC 引用 Spring 官方原文:This chapter covers the Spring Framework implementation of the Inversion of ...

  2. Spring框架的反序列化远程代码执行漏洞分析(转)

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  3. Spring的IOC原理[通俗解释一下]

    Spring的IOC原理[通俗解释一下] 1. IoC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图 ...

  4. Spring依赖注入原理分析

    在分析原理之前我们先回顾下依赖注入的概念: 我们常提起的依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念.具体含义是:当某个角色( ...

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

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

  6. Shiro框架 (原理分析与简单实现)

    Shiro框架(原理分析与简单实现) 有兴趣的同学也可以阅读我之前分享的:Java权限管理(授权与认证)CRM权限管理   (PS : 这篇博客里面的实现方式没有使用框架,完全是手写的授权与认证,可以 ...

  7. 自己动手写Spring框架--IOC、MVC

    对于一名Java开发人员,我相信没有人不知道 Spring 框架,而且也能够轻松就说出 Spring 的特性-- IOC.MVC.AOP.ORM(batis). 下面我想简单介绍一下我写的轻量级的 S ...

  8. Spring IOC原理分析

    IOC IOC(Inversion of Control)控制反转:所谓的控制反转,就是把原先需要我们代码自己实现对象的创建和依赖,反转给容器来实现.那么必然Spring需要创建一个容器,同时需要创建 ...

  9. Spring框架IOC容器和AOP解析

    主要分析点: 一.Spring开源框架的简介  二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面向切面编程(AOP)和事务管理配置  一.S ...

随机推荐

  1. Shell脚本之:字符串

    字符串可以用单引号,也可以用双引号,也可以不用引号. 单引号 str='this is a string' 单引号字符串的限制: 1.单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的: 2 ...

  2. IE对CSS样式的数量和大小的限制

    项目中遇到的问题,css写的样式无法渲染,各种百度后发现大概是这个原因: IE对CSS样式的数量和大小的限制 文档中只有前31个link或style标记关联的CSS能够应用. 从第32个开始,其标记关 ...

  3. Neural Turing Machines-NTM系列(一)简述

    Neural Turing Machines-NTM系列(一)简述 NTM是一种使用Neural Network为基础来实现传统图灵机的理论计算模型.利用该模型.能够通过训练的方式让系统"学 ...

  4. HDFS源码分析心跳汇报之数据结构初始化

    在<HDFS源码分析心跳汇报之整体结构>一文中,我们详细了解了HDFS中关于心跳的整体结构,知道了BlockPoolManager.BPOfferService和BPServiceActo ...

  5. Mysql 免密码登录,修改密码及忘记密码操作

    ----免密码登陆 方式一 my.cnf增加[client]标签 [client] user="root" password="你的密码" 单对定义不同的客户端 ...

  6. 【转载】【selenium+Python WebDriver】之元素定位

    总结: 感谢: “煜妃”<Selenuim+Python之元素定位总结及实例说明> “Huilaojia123”<selenium WebDriver定位元素学习总结> “上海 ...

  7. asm 与 cglib(整理的)

    参考博客地址 http://www.oseye.net/user/kevin/blog/304#top http://www.blogjava.net/vanadies10/archive/2011/ ...

  8. JQuery 获取URL中传递的参数

    该方法基于JQuery,然后给方法传递URL中的参数名,返回参数值 (function($){    $.getUrlParam = function(name){        var reg = ...

  9. IOS - unity3d错误Could not produce class with ID

    运行环境 Unity 5.3.5f1 (IL2CPP)编译IOS版本 XCode Version 7.2.1 (7C1002) Mac OS X 10.11.3 (15D21) (Mac mini) ...

  10. python 基础 5.0 python类一般形式

    一. 类的一般形式 创建类我们一般使用class 关键字来创建一个类,class 后面跟类型名字,可以自定义,最后以冒号结尾,如下所示:   #/usr/bin/python #coding=utf- ...