仿spring的ioc实现之注解注入的小例子

首先,我们先写出一个自定义的注解

<span style="font-size:14px;">package com.test.aonntion;

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

// 生命该注解的范围为属性
@Target(ElementType.FIELD)
// 表示该注解为运行时注入
@Retention(RetentionPolicy.RUNTIME)
public @interface Ioc {
	// obj传入的参数类型为object的子类的类型,默认参数为Object.class
	public Class<? extends Object> obj() default Object.class;
}</span>

然后我们声明三个类  用来测试

先声明一个抽象的父类

<span style="font-size:14px;">package com.test.aonntion;

public abstract class Parent {
	// 抽象方法
	public abstract void say();
}</span>

在声明两个子类,继承自我们的父类

SON子类

<span style="font-size:14px;">package com.test.aonntion;

public class Son extends Parent{

	@Override
	public void say() {
		// 儿子打酱油去
		System.out.println("i'm my Parent's Son");
	}

}</span><span style="font-weight: bold;">
</span>

Daughter子类

<span style="font-size:14px;">package com.test.aonntion;

public class Daughter extends Parent {

	@Override
	public void say() {
		// 闺女打酱油去
		System.out.println("i'm my Parent's Daughter");
	}

}</span>

接下来要完成我们的功能类的编写了

<span style="font-size:14px;">package com.test.aonntion;

import java.lang.reflect.Field;

public class IocTest {

	public static void startIoc(String objName) throws Exception{
		// 获取该类
		Class<?> clazz = Class.forName(objName);
		// 实例化该类的对象
		Object testIoc = clazz.newInstance();
		// 获得类下面的所有属性
		Field[] fields = clazz.getDeclaredFields();

		// 判断该类中的是否有属性
		if(fields != null && fields.length > 0 ){
			// 遍历所有的属性
			for(int i =0;i < fields.length; i++){
				// 获得当前属性的ioc注解
				Ioc ioc = fields[i].getAnnotation(Ioc.class);
				// 如果当前属性的ioc注解不为空并且obj的值不为空
				if( ioc != null && ioc.obj() != null ) {
					// 获得我们注入obj的类,并且实例化该类,得到该实例ojb
					Object ojb = ioc.obj().newInstance();
					// 让属性支持强制注入,既-当属性为私有变量并且没有set方法时
					// 强制调用set("属性名",要注入的属性);
					fields[i].setAccessible(true);
					// 将我们实例化的对象注入进属性内
					fields[i].set(testIoc, ojb);
				}
			}
		}
	}

	// 这是我派去打酱油的是我儿子
	@Ioc(obj=Son.class)
	// 声明一个父类对象1
	private static Parent parent;
	// 这是我派去打酱油的是我闺女
	@Ioc(obj=Daughter.class)
	// 声明一个父类对象2
	private static Parent parent1;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			// 启动注解
			startIoc("com.test.aonntion.IocTest");
		} catch (Exception e) {
			e.printStackTrace();
		}
		// 父亲A派出打酱油的人说
		parent.say();
		// 父亲B派出打酱油的人说
		parent1.say();
	}

}</span>

测试结果

时间: 2024-09-30 16:37:41

仿spring的ioc实现之注解注入的小例子的相关文章

Spring @Resource,@Autowired,@Qualifier的注解注入和区别

spring2.5提供了基于注解(Annotation-based)的配置,我们可以通过注解的方式来完成注入依赖.在Java代码中可以使用 @Resource或者@Autowired注解方式来经行注入.虽然@Resource和@Autowired都可以来完成注入依赖,但它们之间是有区 别的.首先来看一下: @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入: @Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qu

【SSH进阶之路】Spring的IOC逐层深入——依赖注入的两种实现类型(四)

上篇博文,我们介绍了为什么使用IOC容器,和IOC的设计思想以及IOC容器的优缺点,并且给大家转载了一篇介绍IOC原理的博文,我们这篇主要给大家依赖注入的两种方式,以及他们的优缺点. 我们这篇博文还是使用上篇博客中添加用户的实力,只是给大家在注入对象的方式上发生一点点变化,为了让大家更加容易接受.下面我们开始: 构造器注入 构造器注入,即通过构造函数完成依赖关系的设定.我们看一下spring的配置文件: <?xml version="1.0" encoding="UTF

【Spring】IOC之基于注解的配置bean(下)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.@Autowired注解 Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量.方法及构造函数进行标注,完成自动装配的工作. 通过 @Autowired的使用来消除 set ,get方法.Spring 通过一个 BeanPostProcessor 对 @Autowired 进行解析,所以要让 @Autowired 起作用必须事先在 Spring 容器中声明 Aut

【Spring】IOC之基于注解的配置bean

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.基于注解的配置 Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service 和 @Controller.在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层.业务层和控制层(Web 层)相对应.虽然目前这3 个注

用Spring发送和接受JMS消息的一个小例子

Spring提供的JmsTemplate对原生的JMS API进行了一层薄薄的封装,使用起来非常的方便. 我使用的JMS消息代理插件是Apache的ActiveMQ,建议安装最新版本,因为我之前安装老版本,各种不兼容,各种bug,最新版的activemq-all-5.9.1.jar包里面已经有了slf4j.impl包,之前就是被这个坑了...把这个jar包加到lib目录下面,就不会有各种ClassNotFound异常和类冲突的bug了. 下载ActiveMQ解压之后运行bin下面的activem

Spring之IOC容器注入

上一篇做了IOC和AOP的原理介绍,这一篇主要讲解IOC的注入.不过我依然困惑一个问题: 一 : 依赖注入(DI)中有三种注入方式,那Spring中到底实现了几种方式?也是三种? IOC在很多框架中都有实现,并不是Spring特有的,之前说过IOC主要包含DL(Dependency Lookup)和DI(Dependency Injection),也就是说实现IOC的技术有很多,但是主要包含DI和DL,但是相对而言,DI应用范围比较广泛,我想这也是为什么Martin Fowler将控制反转用依赖

spring注解注入:&lt;context:component-scan&gt;详解(转)

spring从2.5版本开始支持注解注入,注解注入可以省去很多的xml配置工作.由于注解是写入java代码中的,所以注解注入会失去一定的灵活性,我们要根据需要来选择是否启用注解注入. 我们首先看一个注解注入的实际例子,然后再详细介绍context:component-scan的使用. 如果你已经在用spring mvc的注解配置,那么你一定已经在使用注解注入了,本文不会涉及到spring mvc,我们用一个简单的例子来说明问题. 本例中我们会定义如下类: PersonService类,给上层提供

spring注解注入:&lt;context:component-scan&gt;详解

spring从2.5版本开始支持注解注入,注解注入可以省去很多的xml配置工作.由于注解是写入java代码中的,所以注解注入会失去一定的灵活性,我们要根据需要来选择是否启用注解注入. 我们首先看一个注解注入的实际例子,然后再详细介绍context:component-scan的使用. 如果你已经在用spring mvc的注解配置,那么你一定已经在使用注解注入了,本文不会涉及到spring mvc,我们用一个简单的例子来说明问题. 本例中我们会定义如下类: PersonService类,给上层提供

spring中IOC的简单使用

spring的ioc主要就是依赖注入,有基于构造器的依赖注入还有通过设值注入,这里我只简单的实现设值注入的方法,通过spring的依赖管理,我们可以很方便的了解各层之间的依赖关系,降低了各层之间的耦合,我们可以不用过多的去关注对象的管理和创建,我们只需要去bean工厂申请即可,这样我们更多的注意力就可以放到真正的代码实现,而不用去关心代码的创建和销毁.,接下来时简单的设值注入. 我们先简单的去创建一个学生类和老师类 public class Student { public void outhi