`
tmj_159
  • 浏览: 709344 次
  • 性别: Icon_minigender_1
  • 来自: 永州
社区版块
存档分类
最新评论

jdk模拟 spring 利用注解完成依赖注入功能

 
阅读更多

     依赖注入是Spring中一个极其重要的概念。    

     本文通过JDK的注解和反射机制来完成在Spring中完成依赖注入的功能。

 

     预备知识,注解,反射机制

     完成一个注解我们通常需要三个步骤1,定义注解,2,使用注解,3,解析注解

     下面我们通过实例来解释注解的使用

     定义注解

package cn.tang.demos.spring;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD) //注解用在什么地方,method,field,class,type
@Retention(RetentionPolicy.RUNTIME)//注解用在什么级别,Source,class,runtime
public @interface Autoware {
	String description() default "类似spring的自动装载";//注解元素的默认值
}

 使用注解

package cn.tang.demos.spring;

public class Bean {
	@Autoware(description="数据访问接口")
	private MysqlDao dao;
	
	public void testAdd(){
		dao.add();
	}

	public MysqlDao getDao() {
		return dao;
	}

	public void setDao(MysqlDao dao) {
		this.dao = dao;
	}

}

 解析注解,下面代码包括了依赖注入的内容

package cn.tang.demos.spring;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class DITest {
	/**
	 * 依赖注入的测试类,假设已经从xml配置文件中读取出来了两个Bean的类名
	 */
	private static final String daoClassStr = "cn.tang.demos.spring.MysqlDao";
	private static final String beanClassStr = "cn.tang.demos.spring.Bean";

	public static void main(String[] args) {
		try {
			test();// 为了能让代码更加直观,没有分别处理所有类型的异常,也没有多余的判断
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@SuppressWarnings("unchecked")
	public static void test() throws Exception {
		// 根据类名得到类类型
		Class daoClass = Class.forName(daoClassStr);
		// 根据类得到该类的构造方法
		Constructor daoCon = daoClass.getDeclaredConstructors()[0];
		// 调用构造方法得到类的一个实例
		MysqlDao dao = (MysqlDao) daoCon.newInstance();

		// 根据类名得到类类型
		Class beanClass = Class.forName(beanClassStr);
		// 根据类得到该类的构造方法
		Constructor beanCon = beanClass.getDeclaredConstructors()[0];
		// 调用构造方法得到类的一个实例
		Object beanObject = beanCon.newInstance();
		// 遍历所有的属性
		for (Field f : beanClass.getDeclaredFields()) {
			// 获取有注入类型的注解
			Autoware an = (Autoware) f.getAnnotation(Autoware.class);
			// 根据属性得到声明属性的类型 f.getGenericType()
			if (an != null) {
				// 输出注解的描述内容
				System.out.println("annotation description : "
						+ an.description());
				// 得到与该属性的set方法,这也是为什么spring中的属性需要set方法
				String setMethodName = "set"
						+ f.getName().substring(0, 1).toUpperCase()
						+ f.getName().substring(1);
				//得到该方法
				Method m = beanClass.getDeclaredMethod(setMethodName,
						new Class[] { (Class) f.getGenericType() });
				if (m != null) {
					//反射机制调用该方法,注入DAO到bean中
					m.invoke(beanObject, dao);
				}
			}
		}
		
		//现在我们得到了一个注入了dao的bean了,我们调用bean中的方法
		((Bean) beanObject).testAdd();
	}

}
 

 

 

分享到:
评论
1 楼 siwangqishimr 2015-10-21  

相关推荐

    以注解方式模拟Spring IoC AOP

    本篇将深入探讨如何通过注解方式来模拟Spring的这两种机制,帮助你理解其底层原理。 ### 1. 依赖注入(IoC) 依赖注入是Spring框架的核心特性之一,它通过反转对象创建和管理的控制权,使得应用程序组件之间的耦合...

    自己动手模拟spring

    【标题】:“自己动手模拟spring” 【描述】:在该主题中,我们将深入理解Spring框架的核心概念,并通过编码实践来模拟其工作原理。参考链接提供了一个CSDN博客文章,作者详细介绍了如何从零开始创建一个简易版的...

    Spring的学习笔记

    **模拟Spring功能** 在学习Spring之前,可能需要理解如何手动管理对象的依赖关系。Spring通过IOC(控制反转)和DI(依赖注入)实现了对对象生命周期的管理,从而消除了手动管理的复杂性。 **搭建Spring运行环境** ...

    模拟实现spring IOC AOP的例子

    在提供的例子中,你可以看到如何创建一个Bean工厂,模拟Spring的Bean定义和实例化过程。例如,通过XML配置文件或注解来声明Bean及其依赖,并在需要时由容器负责注入。 接下来,我们转向AOP。AOP允许开发者定义“切...

    spring开发指南

    - **创建业务逻辑类**:定义服务层和DAO层等业务逻辑组件,并使用Spring提供的注解进行依赖注入。 - **Spring基础语义** - **控制反转(IOC)**:也称为依赖注入(Dependency Injection),是一种设计模式,用于实现...

    spring3.2源码-官方原版.zip

    此外,Spring 3.2还加强了测试支持,包括MockMVC用于模拟Spring MVC请求,以及`@RunWith(SpringJUnit4ClassRunner.class)`注解配合`@ContextConfiguration`进行Spring应用上下文的加载,使单元测试和集成测试变得...

    spring 4.3.7 完整JAR包

    Spring的核心是依赖注入(Dependency Injection,DI),它允许对象之间的关系在运行时动态配置,而不是在编译时硬编码。这使得代码更易于测试和维护,因为依赖关系可以轻松地替换或模拟。此外,Spring还支持面向切面...

    第11章 开发Spring+Struts+Hibernate应用.pdf

    添加Spring功能通常包括配置Spring容器、定义Bean以及使用@Autowired或@Resource注解来进行依赖注入。此外,Spring的事务管理和国际化支持也是这一环节的重点。 ##### 11.5 Spring整合Hibernate Spring与Hibernate...

    (转载)自己动手写一个spring

    Spring是Java开发中最流行的框架之一,它以依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)为核心,极大地简化了企业级应用的开发。 首先,我们需要理解什么是依赖注入。...

    spring运行机制源码剖析

    在本文中,我们将深入探讨Spring的核心组件、依赖注入(DI)以及AOP(面向切面编程)的实现。 首先,让我们从Spring的核心组件开始。Spring由多个模块组成,包括核心容器(Core Container)、数据访问/集成(Data ...

    Spring2.0中文教程

    Spring 2.0的主要设计原则之一是依赖注入,它允许组件之间松耦合。DI通过容器管理对象及其依赖关系,而不是由对象自行创建或查找依赖。这提高了代码的可测试性,并简化了系统维护。 2. **AOP(面向切面编程)** ...

    Spring3 源码

    1. **依赖注入(Dependency Injection,DI)**:这是Spring的核心功能,允许对象之间的关系在运行时动态配置,而不是在代码中硬编码。通过XML配置文件、注解或者Java配置类,可以实现对象的创建和依赖关系的管理。 ...

    spring-framework-2.5.5

    在Spring框架中,最重要的概念之一是依赖注入(Dependency Injection,DI)。这个版本的Spring已经完全支持DI,通过它,我们可以将对象之间的依赖关系解耦,使代码更易于测试和维护。DI可以通过XML配置文件、注解或...

    spring源码 3.0.4

    在3.0.4版本中,测试框架已经相当完善,支持模拟对象和依赖注入。 通过阅读和分析Spring 3.0.4的源码,开发者可以深入了解Spring如何管理对象、执行AOP、处理Web请求以及与数据库交互,从而更好地利用Spring的功能...

    手动打造自己的spring

    Spring框架是Java开发中最常用的轻量级开源框架之一,它以依赖注入(Dependency Injection, DI)为核心,提供了AOP(面向切面编程)、事务管理、数据访问等多种功能,极大地简化了企业级应用的开发工作。本教程...

    spring2.5.6架包

    在2.5.6版本中,开发者可以使用Spring TestContext框架进行方便的依赖注入测试,同时支持Mockito等第三方库进行模拟对象测试。 7. **国际化和本地化**:Spring提供了对多语言环境的支持,可以在不同地区和语言环境...

    spring-framework-3.2.7.RELEASE 源码

    3. **依赖注入**:Spring的DI机制允许开发者在不关心对象如何创建和管理的情况下,仅通过接口编程。这降低了代码间的耦合度,增强了可测试性。通过@Autowired注解,Spring可以自动匹配并注入依赖,同时提供了@...

    手写简单的Spring框架

    5. **AOP支持**:虽然不是必须的,但为了模拟Spring的AOP功能,我们可以创建一个切面类和通知(advice),用于拦截和增强特定的Bean方法。这需要实现一个代理模式,如JDK动态代理或CGLIB代理。 6. **Scope管理**:...

    Spring2.0

    1. **依赖注入(Dependency Injection,DI)**:Spring 2.0进一步完善了DI,使得组件之间的依赖关系可以通过配置文件或注解来管理,降低了代码的耦合度。DI允许开发者在不修改代码的情况下更换组件,增强了软件的可...

    Spring4.1官方jar包完整版

    1. **核心容器**:Spring的核心组件包括Bean工厂和ApplicationContext,它们负责管理应用程序的bean和依赖注入。在4.1版本中,Spring引入了更多对Java配置的支持,使得开发者可以使用注解来配置bean,减少了XML配置...

Global site tag (gtag.js) - Google Analytics