一道面试题,简单模拟spring ioc

自己实现的,程序写的土了点,很多情况没去考虑,主要是复习理解怎么使用反射来实现spring 的依赖注入。

package dom4jtest;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Test3 {
    private static Object o1;
    public static void main(String[] args) {
        BeanA ba = (BeanA) getBean("beanA");
        ba.getBeanB().show();
    }
    public static Object getBean(String name){
        if(o1==null)
            o1 = setBean(name);
        return o1;
    }
    @SuppressWarnings("unchecked")
    public static Object setBean(String name){
        SAXReader sr = new SAXReader();
        Object o = null;
        Class clz = null;
        Class clz2 = null;
        String ref = null;
        String name1 = null;
        try {
            Document doc = sr.read(Test3.class.getClassLoader().getResourceAsStream("beans.xml"));
            Element e = doc.getRootElement();
            @SuppressWarnings("unchecked")
            List<Element> eles = e.elements();
            for(Element ee : eles){
                if(ee.attributeValue("id")!=null){
                    if(ee.attributeValue("id").equals(name)){
                        clz = Class.forName(ee.attributeValue("class"));
                        o = clz.newInstance();

                        List<Element> elus = ee.elements("property");
                        ref = elus.get(0).attributeValue("ref");
                        name1 = elus.get(0).attributeValue("name");
                        if(ref!=null&&name1!=null){
                            for(Element eee:eles){
                                if(eee.attributeValue("id")!=null){
                                    if(eee.attributeValue("id").equals(ref)){
                                        clz2 = Class.forName(eee.attributeValue("class"));
                                        name1 ="set"+ name1.substring(0, 1).toUpperCase() + name1.substring(1);
                                        Method m = clz.getDeclaredMethod(name1,clz2);
                                        m.invoke(o, clz2.newInstance());
                                    }

                                }
                            }
                        }

                    }
                }

            }
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e1) {
            e1.printStackTrace();
        } catch (InstantiationException e1) {
            e1.printStackTrace();
        } catch (IllegalAccessException e1) {
            e1.printStackTrace();
        } catch (IllegalArgumentException e1) {
            e1.printStackTrace();
        }
        catch (InvocationTargetException e1) {
            e1.printStackTrace();
        } catch (NoSuchMethodException e1) {
            e1.printStackTrace();
        }
        catch (SecurityException e1) {
            e1.printStackTrace();
        }
        return o;
    }
}
时间: 2024-10-06 20:37:05

一道面试题,简单模拟spring ioc的相关文章

简单的Spring Ioc

控制反转(Inversion of Control,Ioc),也被称为依赖注入(Dependency Injection,DI),是面向对象的一种设计理念,用来降低程序代码之间的耦合度. 首先要考虑什么是依赖.依赖,在代码中一般是指通过局部变量.方法参数.返回值等建立的对于其他对象的调用关系.例如,A类的方法中,实例化了B类的对象并调用其方法已完成特定的功能,我们就说A类依赖于B类 ---------------------------正文---------------------------

简单的Spring IoC入门学习

IoC控制反转,由spring统一管理类的创建,不再由自己创建. 一.导入所需jar core.context.beans.expression.common-logging 二.目标类 package com.claudxyz.IoC; public interface UserService { public abstract void addUser(); } package com.claudxyz.IoC; public class UserServiceImpl implements

从一道面试题简单谈谈发布订阅和观察者模式

今天的话题是javascript中常被提及的「发布订阅模式和观察者模式」,提到这,我不由得想起了一次面试.记得在去年的一次求职面试过程中,面试官问我,"你在项目中是怎么处理非父子组件之间的通信的?".我答道,"有用到vuex,有的场景也会用EventEmitter2".面试官继续问,"那你能手写代码,实现一个简单的EventEmitter吗?" 手写EventEmitter 我犹豫了一会儿,想到使用EventEmitter2时,主要是用emit发

[Spring系列01]Spring IOC/DI模拟

本文以一个简单的实例大致模拟Spring IOC/DI的运行原理,代码简单分dao,model,service三层.即:dao 与数据库的操作,增删改查等方法model 一般都是javabean对象,例如与数据库的某个表相关联.service 供外部调用,等于对dao,model等进行了包装. 程序结构图如下: 先粘贴部分代码,再进行解释: UserDAO.java package com.ctsh.dao; import com.ctsh.model.User; public interfac

Spring容器的简单实现(IOC原理)

引言:容器是什么?什么是容器?Spring容器又是啥东西?我给Spring容器一个对象名字,为啥能给我创建一个对象呢? 一.容器是装东西的,就像你家的水缸,你吃饭的碗等等. java中能作为容器的有很多,例如Map,List,数组.....还有好多 二.Spring 容器的核心就是一个Map集合(可能不是很准确,见谅!) Map<String, Object> 这个容器里根据key-value存放了好多键值对.假如你给一个String的key,就能获得相应的Object的对象,各位大佬,对Sp

Spring IoC的概念

大部分的企业架构都基于Spring框架.它的成功来自于理念,而不是技术,它最为核心的理念是IoC(控制反转)和AOP(面向切面编程),其中IoC是Spring的基础,而AOP则是其重要的功能,最为典型的当属数据库事务的使用. Spring的概述 Spring提供了以下策略: •对于POJO的潜力开发,提供轻量级和低侵入的编程,可以通过配置(XML.注解等)来扩展POJO的功能,通过依赖注入的理念去扩展功能,建议通过接口编程,强调OOD的开发模式理念,降低系统耦合度,提高系统可读性和可扩展性. •

Spring 架构的简单模拟实现

Spring 架构主要有两大特点: IOC /DI: 控制反转/依赖注入 AOP  切面编程 . 今天主要是实现IOC这一特点. 主要的逻辑如下: User 用户类. UserDAO  User类的访问接口. UserDAOImpl  实现UserDAO 接口以实现拓展. UserService  包含一系列的用户功能 ,如addUser 关于以上类的代码: package com.bjsxt.model; public class User { private String username;

自己实现简单Spring Ioc

IoC则是一种 软件设计模式,简单来说Spring通过工厂+反射来实现IoC. 原理简单说明: 其实就是通过解析xml文件,通过反射创建出我们所需要的bean,再将这些bean挨个放到集合中,然后对外提供一个getBean()方法,以便我们获得这bean.通俗来讲就如同婚姻介绍所,只需要告诉它找个什么样的女朋友,然后婚介就会按照我们的要求,提供一个mm,如果婚介给我们的人选不符合要求,我们就会抛出异常. 简单实现: 1.需要引用maven依赖: <dependency> <groupId

容器学习(一):动手模拟spring的IoC

介绍 学习经典框架的实现原理以及设计模式在事实上际中的运用,是很有必要的,能够让我们更好进行面向对象. 本篇文章就来模拟Spring的IOC功能.明确原理后,能够更好的使用它,进而为进行面向对象提供一种思路. 点击下载源代码:下载 动手模拟IoC实现 首先我们把我们用的dao.service.entity定义出来: Student.java : package com.bzu.entity; public class Student { private int id; private Strin