`
powersoft
  • 浏览: 198613 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
53a63413-d61c-321e-8dc6-5008e88923c6
Redis官方文档翻译和源...
浏览量:191382
社区版块
存档分类
最新评论

Spring依赖注入的模拟实现

阅读更多
一 依赖注入和控制反转(DI & IoC)
1 依赖注入的模拟
//客户端代码
public class Business implements IBeanAware {
	private IWriter writer;

	public Business() {

	}

	// type1 Constructor Injection
	public Business(IWriter writer) {
		this.writer = writer;
	}

	// type2 Interface Injection
	@Override
	public void injectBean(Object dependcy) {
		writer = (IWriter) dependcy;
	}

	// type3 Setter Injection
	public void setWriter(IWriter writer) {
		this.writer = writer;
	}

	public void save() {
		writer.write();
	}

	public static void main(String[] args) throws Exception {
		BeanFactory applicationContext = new FileSystemBeanFactory(
				"simulation.properties");
		Business biz = (Business) applicationContext.getBean("business");
		biz.save();
	}
}

public interface IBeanAware {
	public void injectBean(Object dependcy);
}

// 组件接口
public interface IWriter {
	public void write();
}

//组件代码
public class FileWriter implements IWriter {

	@Override
	public void write() {
		System.out.println("write into file.");
	}
}

//组件代码
public class ConsoleWriter implements IWriter {

	@Override
	public void write() {
		System.out.println("write into console.");
	}
}

//模拟IoC容器接口
public interface BeanFactory {
	public Object getBean(String beanName) throws Exception;
}

//模拟IoC容器,管理依赖注入
public class FileSystemBeanFactory implements BeanFactory {
	private Object bean;
	private Properties props;

	public FileSystemBeanFactory(String contextFile) throws Exception {
		props = new Properties();
		props.load(new FileInputStream(contextFile));
	}

	@Override
	public Object getBean(String beanName) throws Exception {
		bean = BeanCreator.create(beanName, props);
		return bean;
	}
}

//模拟IoC容器,管理依赖注入
public class ClassPathBeanFactory implements BeanFactory {
	private Object bean;
	private Properties props;

	public ClassPathBeanFactory(String contextFile) throws Exception {
		props = new Properties();
		props.load(this.getClass().getResourceAsStream((contextFile)));
	}

	@Override
	public Object getBean(String beanName) throws Exception {
		bean = BeanCreator.create(beanName, props);
		return bean;
	}
}

public class BeanCreator {
	
	public static Object create(String beanName, Properties props)
			throws Exception {
		IWriter writer = (IWriter) Class.forName(props.getProperty("writer"))
				.newInstance();

		Class<?> claz = Class.forName(props.getProperty(beanName));
		Constructor<?> c = claz.getConstructor(IWriter.class);

		Object bean;

		if (c.getParameterTypes().length != 0) {
			bean = c.newInstance(writer);
			System.out.println("type1 Constructor Injection");
		} else if (IBeanAware.class.isAssignableFrom(claz)) {
			bean = claz.newInstance();
			IBeanAware aware = (IBeanAware) bean;
			aware.injectBean(writer);
			System.out.println("type2 Interface Injection");
		} else {
			bean = claz.newInstance();
			Method m = claz.getDeclaredMethod("setWriter", IWriter.class);
			m.invoke(bean, writer);
			System.out.println("type3 Setter Injection");
		}
		return bean;
	}
}


bean.properties
business = org.powersoft.spring.demo.Business
writer = org.powersoft.spring.demo.FileWriter
#writer = org.powersoft.spring.demo.ConsoleWriter

分享到:
评论

相关推荐

    模拟spring依赖注入

    依赖注入则是将这种耦合关系反转,由外部容器(如Spring IoC容器)负责创建对象并管理它们的依赖关系,使得对象可以在不知道依赖的具体实现的情况下工作,降低了代码的复杂性。 Spring框架的IoC(Inversion of ...

    使用反射和注解模拟Spring的依赖注入

    这种模拟实现虽然简单,但可以让我们理解Spring框架背后的基本机制。然而,实际的Spring框架提供了更高级的功能,如AOP(面向切面编程)、代理模式、基于XML或Java配置的bean定义、条件注解等,使得依赖注入更加灵活...

    模拟Spring的依赖注入

    本篇文章将深入探讨如何通过Java代码来模拟Spring的依赖注入机制。 **依赖注入的概念** 依赖注入是一种设计模式,它允许对象在运行时获取其依赖项,而不是在构造函数或初始化方法中硬编码这些依赖项。这样做的好处...

    自己的代码模拟spring的依赖注入

    现在,我们将深入探讨如何通过自己的代码来模拟Spring的依赖注入。 首先,理解依赖注入的概念至关重要。依赖注入意味着组件不直接创建其依赖的对象,而是由外部实体(如Spring IoC容器)提供。这样做的好处是,我们...

    AngularJS之依赖注入模拟实现

    AngularJS有一经典之处就是依赖注入,对于什么是依赖注入,熟悉spring的同学应该都非常了解了,但,对于前端而言,还是比较新颖的。  依赖注入,简而言之,就是解除硬编码,达到解偶的目的。  下面,我们看看...

    Spring依赖注入原理解析.doc

    Spring依赖注入机制,也被称为控制反转(Inversion of Control,IOC),是Spring框架的核心特性,它使得应用程序的组件之间能够实现松散耦合。在传统编程中,对象通常自行创建和管理它们所依赖的其他对象,而在...

    Spring 依赖注入

    ### Spring 依赖注入详解 #### 一、依赖注入(DI)概述 依赖注入(Dependency Injection,简称 DI)是一种设计模式,旨在减少代码间的耦合度并简化对象的创建过程。这种模式通过将对象间的依赖关系从对象内部转移...

    使用xml和annotation实现类似spring依赖注入和自动扫描类的功能

    这个实现可能包含了XML配置文件、带有注解的Java类,以及一些测试用例,用于演示如何在没有Spring框架的情况下实现依赖注入和类扫描。通过研究这个实现,你可以进一步加深对这些概念的理解,并可能将其应用到自己的...

    spring依赖注入

    Spring依赖注入是Java开发中的核心概念,特别是在使用Spring框架时,它是实现松耦合和可测试性的重要机制。依赖注入(Dependency Injection,简称DI)允许我们解耦组件之间的关系,使得代码更易于维护和扩展。它通过...

    Spring.Net依赖注入例子

    在这个“Spring.Net依赖注入例子”中,我们将探讨如何利用Spring.NET来实现DI。 首先,依赖注入的基本思想是,对象不应该自行创建或查找其依赖的对象,而是应该由外部容器(如Spring.NET的ApplicationContext)在...

    Spring简单仿写,实现基本IOC,依赖注入和AOP 未解决循环依赖

    你需要模拟Spring容器的行为,管理bean的生命周期,处理依赖注入,并且确保在遇到循环依赖时能够优雅地处理。这涉及到对Java反射机制的理解,以及如何通过设计模式来解耦代码。 在压缩包文件"spring-Imitation"中,...

    模拟Spring的IOC

    在Java世界中,Spring框架以其强大的依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IOC)能力,成为企业级应用开发的首选框架之一。理解并模拟Spring的IOC机制对于深入学习Spring...

    利用spring实现打印机

    在IT行业中,Spring框架是Java开发领域中广泛使用的轻量级框架,以其强大的依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect Oriented Programming,简称AOP)特性而闻名。本教程将深入探讨如何利用...

    Java模拟spring实现

    总结来说,这个模拟展示了Spring框架的核心概念——依赖注入。通过XML配置文件,我们可以声明bean及其依赖关系,使得Spring容器可以在运行时自动创建和管理这些对象,从而降低组件之间的耦合度,提高代码的可测试性...

    Spring中依赖注入与容器

    在Spring框架中,依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IoC)是核心概念,它们旨在简化组件之间的耦合,提高代码的可测试性和可维护性。IoC指的是应用程序的控制权由原本...

    Spring的本质系列(1)依赖注入共3页.pdf.zip

    Spring框架是Java开发中不可或缺的一部分,它以其强大的依赖注入(Dependency...通过本文的介绍,相信你对Spring依赖注入有了更深入的理解。在实际开发中,灵活运用这些知识,可以让你的项目更加健壮、易于扩展和维护。

    基于java简单模拟实现spring_ioc

    Spring的核心特性之一是依赖注入(Dependency Injection,简称DI),也称为控制反转(Inversion of Control,IoC)。在这个项目中,“基于java简单模拟实现spring_ioc”显然是为了帮助开发者理解Spring的IoC容器是...

    模拟Spring架构的简易实现

    Spring框架是Java开发中广泛应用的一个开源框架,以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)的核心特性,极大地简化了企业级应用的开发工作。"模拟Spring架构的...

    Spring简单模拟Spring容器

    总之,这个主题涵盖的内容非常广泛,包括了Spring的核心概念、IoC/DI的原理、容器的模拟实现以及可能涉及的开发工具。深入理解这些知识点对于任何使用Spring框架的开发者来说都至关重要,因为它能提升代码质量和可...

    依赖注入相关解释

    ### 依赖注入相关解释 #### 一、Spring框架与依赖注入的重要性 在现代软件开发领域,...通过理解和掌握依赖注入的概念及其在Spring中的实现方式,开发者可以更好地利用Spring框架的优势,提升软件开发的质量和效率。

Global site tag (gtag.js) - Google Analytics