仿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>

测试结果



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值