`
vvggsky
  • 浏览: 66924 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

自己编写IOC

    博客分类:
  • J2SE
阅读更多
<?xml version="1.0" encoding="UTF-8"?>   
<mybeans >   
<bean id="first" name="first" implement="com.my.ioc.testpackage.MybeanOneImpl"></bean>   
</mybeans> 


public class XmlToBean {    
   
    public Mybean getBean() throws Exception {    
        Mapping map = new Mapping();    
        URL u = this.getClass().getClassLoader().getResource("com/my/ioc/config/config-mapping.xml");    
        map.loadMapping(u);    
        Unmarshaller un = new Unmarshaller(Mybean.class);    
        File file = new File("myconfig.xml");    
        file.getAbsoluteFile();    
        Reader reader = new FileReader(file);    
        // Unmarshaller unmarshaller = new Unmarshaller(map);    
        un.setMapping(map);    
        Mybean read = (Mybean) un.unmarshal(reader);    
   
        return read;    
    }    
}   



<?xml version="1.0" encoding="UTF-8"?>   
<!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Mapping DTD Version 1.0//EN"    
    "http://castor.org/mapping.dtd">   
<mapping>   
    <class name="com.my.ioc.config.Mybean" auto-complete="true">   
        <map-to xml="my_beans" />   
        <field name="mybeans" type="com.my.ioc.config.ConfigBean" collection="arraylist">   
            <bind-xml name="bean" node="element" />   
        </field>   
    </class>   
    <class name="com.my.ioc.config.ConfigBean" auto-complete="true">   
        <field name="id">   
            <bind-xml name="id"  node="attribute"/>   
        </field>   
        <field name="name">   
            <bind-xml name="name" node="attribute"/>   
        </field>   
        <field name="implement">   
            <bind-xml name="implement"  node="attribute"/>   
        </field>   
    </class>   
</mapping>   



public class ConfigBean implements Serializable{    
    private String id;    
   
    private String name;    
   
    private String implement;    
   
    public String getId() {    
        return id;    
    }    
   
    public void setId(String id) {    
        this.id = id;    
    }    
   
    public String getImplement() {    
        return implement;    
    }    
   
    public void setImplement(String implement) {    
        this.implement = implement;    
    }    
   
    public String getName() {    
        return name;    
    }    
   
    public void setName(String name) {    
        this.name = name;    
    }    
}    
   
public class Mybean {    
   
    private List<ConfigBean> mybeans;    
   
    public List<ConfigBean> getMybeans() {    
        return mybeans;    
    }    
   
    public void setMybeans(List<ConfigBean> mybeans) {    
        this.mybeans = mybeans;    
    }    
   
}   


@Retention(RetentionPolicy.RUNTIME)    
@Target(ElementType.TYPE)    
public @interface MyClassAnnotation {    
    String isInvoke() default "NO";    
} 

@Retention(RetentionPolicy.RUNTIME)    
public @interface MyMethodAnnotation {    
    String isTransaction() default "NO";    
}


class MyTranstionHandler implements MyHandler,InvocationHandler{    
    private Object o;    
   
    private MyJotmTranstion tra;    
   
    public MyTranstionHandler(Object delegate) {    
        o = delegate;    
//        tra = new MyJotmTranstion();    
    }    
   
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {    
        Object a = null;    
        try {    
   
            if (method.isAnnotationPresent(MyMethodAnnotation.class)) {    
                MyMethodAnnotation an = method.getAnnotation(MyMethodAnnotation.class);    
                if (an.isTransaction().equals("yes") && an != null) {    
//                    getTransactionManager().begin();    
                    System.out.print("\n" + "start");    
                    a = method.invoke(o, args);    
//                    getTransactionManager().commit();    
                    System.out.print("\n" + "end");    
                } else {    
                    a = method.invoke(o, args);    
                }    
            }    
            return null;    
        } catch (Exception e) {    
            System.out.print("\n" + "invoke Exception");    
        }    
        return a;    
    }    
        
    private TransactionManager getTransactionManager()    
    {    
        return tra.getTransactionManager();    
    }    
}    

4 现在给出一个具体的实现类

java 代码
@MyClassAnnotation(isInvoke="yes")    
public class MybeanOneImpl implements IMybeanOne {    
    @MyMethodAnnotation(isTransaction = "yes")    
    public void printString() {    
        System.out.print("\n"+" don some thing");    
    }    
    @MyMethodAnnotation(isTransaction = "yes")    
    public void printString1() {    
        System.out.print("\n"+" good work");    
    }    
}   

 

5 然后给出我的bean工厂了

java 代码
public class MyBeanFactory {    
    private static MyBeanFactory instance = null;    
   
    private MyBeanFactory() {    
        try {    
            initBean();    
        } catch (Exception e) {    
            int b = 0;    
        }    
    }    
   
    public static MyBeanFactory getInstance() {    
        return instance = new MyBeanFactory();    
    }    
   
    private Map<String, Class> beanMap = new HashMap<String, Class>();    
   
    private Object getConfigBean() throws Exception {    
        XmlToBean xml = new XmlToBean();    
        return xml.getBean();    
    }    
   
    private void initBean() throws Exception {    
        Mybean beans = (Mybean) getConfigBean();    
        List<ConfigBean> configList = beans.getMybeans();    
        for (int i = 0; i < configList.size(); i++) {    
            ConfigBean bean = configList.get(i);    
            registerBean(bean.getName(), bean.getImplement());    
   
        }    
        int i = 0;    
    }    
   
    private void registerBean(String beanName, String className) throws Exception {    
        Class bean = Class.forName(className);    
        beanMap.put(beanName, bean);    
   
    }    
   
    public Object getRegistedBean(String beanName) throws Exception {    
   
        Class o = beanMap.get(beanName);    
       if(o.isAnnotationPresent(MyClassAnnotation.class))    
           return o.newInstance();    
        MyClassAnnotation classAnn = (MyClassAnnotation) o.getAnnotation(MyClassAnnotation.class);    
        if (classAnn.isInvoke().equals("yes")) {    
            InvocationHandler handler = new MyTranstionHandler(o.newInstance());    
            return   Proxy.newProxyInstance(o.getClassLoader(), o.getInterfaces(), handler);    
        } else {    
            return o.newInstance();    
        }    
    }    
}   

 

6 测试代码

 

java 代码
public static void main(String[] args) {    
       MyBeanFactory f = MyBeanFactory.getInstance();    
       try {    
           IMybeanOne o =(IMybeanOne) f.getRegistedBean("first");    
           o.printString();    
       } catch (Exception e) {    
           System.out.print("error "+e.getMessage());    
       }    
   }   






String idValue = map.get("id");   
if (idValue == null) {   
  throw ...;   
}   
int id = Integer.parseInt(idValue);   
  
String name = map.get("name");   
if (name == null) {   
  name = "";   
}   
  
String sexValue = map.get("sex");   
if (sexValue == null) {   
  throw ...;   
}   
Gender sex = Gender.valueOf(sexValue);   
...  

String idValue = map.get("id");
if (idValue == null) {
  throw ...;
}
int id = Integer.parseInt(idValue);

String name = map.get("name");
if (name == null) {
  name = "";
}

String sexValue = map.get("sex");
if (sexValue == null) {
  throw ...;
}
Gender sex = Gender.valueOf(sexValue);
...



public final class PropertyConverter<T> {   
  private final Class<T> targetType;   
     
  private PropertyConverter(Class<T> targetType) {...}   
  
  public static <T> PropertyConverter<T> to(Class<T> targetType) {   
    return new PropertyConverter<T>(targetType);   
  }   
  
  public T from(final Map<String, String> map) {   
    return Proxy.newProxyInstance(   
      new Class[]{targetType}, targetType.getClassLoader(), new InvocationHandler() {   
        public Object invoke(Object proxy, Method method, Object[] args) {   
          String value = map.get(method.getName());   
          if (value == null) {   
            Object defaultValue = method.getDefaultValue();   
            if (defaultValue == null) {   
              throw ...;   
            }   
            return defaultValue;   
          }   
          return convert(value, method.getReturnType());   
        }   
    });   
  }   
}  

public final class PropertyConverter<T> {
  private final Class<T> targetType;
  
  private PropertyConverter(Class<T> targetType) {...}

  public static <T> PropertyConverter<T> to(Class<T> targetType) {
    return new PropertyConverter<T>(targetType);
  }

  public T from(final Map<String, String> map) {
    return Proxy.newProxyInstance(
      new Class[]{targetType}, targetType.getClassLoader(), new InvocationHandler() {
        public Object invoke(Object proxy, Method method, Object[] args) {
          String value = map.get(method.getName());
          if (value == null) {
            Object defaultValue = method.getDefaultValue();
            if (defaultValue == null) {
              throw ...;
            }
            return defaultValue;
          }
          return convert(value, method.getReturnType());
        }
    });
  }
}


convert()函数是调用apache的ConvertUtilsBean做的,没什么说的。 

@interface Foo {   
  int id();   
  String name() default "";   
  Gender sex();   
}   
  
Map<String, String> map = ...;   
Foo foo = PropertyConverter.to(Foo.class).from(map);   
foo.id();   
foo.name(); 

分享到:
评论

相关推荐

    Spring IOC容器实现分析.pdf 下载

    《Spring IOC容器实现分析》 在Java开发领域,Spring框架无疑是使用最为广泛的轻量级框架之一,其中的核心组件就是IOC(Inversion of Control)容器。本文将深入剖析Spring的IOC容器,理解其工作原理和重要功能,以...

    spring ioc模块手写demo

    spring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demo...

    自己的IoC框架实现

    在本项目中,我们将根据Spring的IoC原理,尝试实现自己的IoC框架。 首先,理解IoC的概念至关重要。IoC是指应用程序的控制权由传统的方式(如:对象直接创建和管理依赖关系)转移到框架或容器中,这样对象不再负责...

    springIOC手写框架分析

    springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC...

    手写一个SpringIoc容器

    9. **单元测试与调试**:为了确保容器功能的正确性,需要编写单元测试用例。同时,良好的日志记录和调试信息可以方便开发者理解和调试容器。 通过实现这样一个自定义的Spring IOC容器,我们可以更深入地理解Spring...

    手写SpringIOC注解实现版本

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心组成部分,它负责管理应用程序中的对象。这个"手写Spring IOC注解实现版本"项目旨在帮助我们深入理解Spring框架的工作原理,通过实际动手实现来增强...

    手写IOC,DI,servlet

    在【标签】中,“IOC DI 手写”进一步强调了实现的核心特性,即这些核心组件都是开发者自行编写的,没有依赖额外的框架。 从【压缩包子文件的文件名称列表】"ShouXieMVC"来看,这可能是作者实现的一个简易的Model-...

    手写SpringIoc的XML实现方式

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它负责管理对象的生命周期和依赖关系。在本主题中,我们将深入探讨如何手写一个基于XML的Spring IOC实现,模仿Spring框架中的`...

    自己开发项目ioc

    在标题"自己开发项目ioc"中,我们可以推断出你在构建一个自定义的项目,并且在这个项目中应用了IoC的概念。这可能意味着你正在创建一个框架或者服务,其中包含了一个IoC容器来管理对象的生命周期和依赖关系。这样的...

    手写spring ioc(三) 资源org.zip

    在本资源"手写spring ioc(三) 资源org.zip"中,我们主要关注的是如何实现一个简易版的Spring IOC(Inversion of Control)容器,它涵盖了ioc的基本功能,包括解决循环依赖、使用构造器注入以及自动注入等核心特性。...

    springIoc实现原理

    在IoC中,不再由对象自己去创建或查找依赖的对象,而是将这种控制权交给一个专门的容器(即Spring Ioc容器)。这样,对象只需要声明自己需要哪些依赖,而具体的获取和管理过程则由容器负责,实现了对象间的低耦合。 ...

    IoC容器的设计(利用反射、注解和工厂模式实现)

    实验要求 1. 利用注解、反射和工厂模式设计一个简单的IoC容器 2. 该IoC容器包含3个...然后我们需要自己实现一个IoC容器类,处理自定义的注解的基本逻辑; 接下来在test类中实例化IoC容器,并从中取得bean,调用其方法

    用java写的一个简单的ioc实现,初学的朋友可以看看

    通过自己动手实现,初学者可以更好地理解Spring是如何在幕后管理对象和处理依赖的,这对于提升编程技能和设计模式的理解非常有益。同时,这也是软件开发中常用的一种学习方法——通过模仿和实践来深入理解复杂的概念...

    自己写了三个分别关于WEB,IOC,ORM的框架现将开源

    自己写了三个分别关于WEB,IOC,ORM的框架现将全部开源,内有说明文档,测试示例项目,框架源代码文件,sql语句等

    雷赛IOC0640.rar

    标题中的“雷赛IOC0640.rar”指的是雷赛智能公司的一款名为IOC0640...通过深入学习这些内容,无论是系统集成商、自动化工程师还是设备维护人员,都能提升自己在工业自动化领域的专业技能,更好地应对实际工作中的挑战。

    图片转IOC图标工具

    总的来说,"图片转IOC图标工具"是一款高效且实用的开发辅助工具,它解决了在iOS应用开发中创建和管理图标时可能出现的繁琐工作,使得开发者可以更专注于代码编写和功能实现,从而提高整体开发效率。对于任何涉及iOS...

    IOC练习事列

    1. **依赖注入(Dependency Injection, DI)**:这是IOC的核心概念,DI允许我们通过构造函数、属性或方法将依赖注入到对象中,而不是让对象自己去创建或查找依赖。这样可以避免硬编码,使代码更加灵活。 2. **接口...

    JavaEE Spring IoC入门

    总的来说,学习"JavaEE Spring IoC入门"意味着你需要理解Spring如何通过IoC管理对象,掌握XML配置文件的编写,以及如何在Web环境中使用Spring MVC进行开发。此外,还需要了解如何编写测试用例来验证Spring配置的有效...

    手写IOC项目,学习理解Spring IOC原理

    我们都知道,Spring框架的IOC是基于Java的反射机制实现,实现IOC,...IOC和DI是Spring里面最核心的东西,,资源中会写出这两个模块。资源内容包括Java反射机制的实践,使用反射机制实现IOC(包括依赖注入和对象创建)。

    IOC模式 c#经典例子

    IOC(Inversion of Control,控制反转)模式是一种软件设计原则,它在面向对象编程中用于解耦组件之间的依赖关系。C#中实现IOC的一种常见方式是通过依赖注入(Dependency Injection,DI)。在这个“IOC模式 c#经典...

Global site tag (gtag.js) - Google Analytics