一个简单的由老师指导实现的模拟spring的ioc的di注解以及注解容器(AnnotationConfigApplicationContext)代码

package com.yc.springframwork.annotation;

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


@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Bean {

	String[] name() default {};

	String initMethod() default "";
	
	String destroyMethod() default "";
}
以上是Bean注解:主要对一些外来类进行注解
package com.yc.springframwork.annotation;

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

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Configuration {

}
以上是Configuration注解:配置spring容器,相当于xml中的<beans>
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Resource {

	String name() default "";

}
以上是Resource注解:用来激活一个命名资源的依赖注入
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class YcAnnotationConfigApplicationContext {
	
	private Map<String,Object> beans=new HashMap<String,Object>();

	public YcAnnotationConfigApplicationContext(Class cls) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		Object appConfigObject=cls.newInstance();
		// 注解的解析
		//从cls中取出所有的方法  person(),循环
		Method[] ms=cls.getMethods();
		for (Method m:ms) {
			if (m.isAnnotationPresent(Bean.class)) {
				//激活这个方法,这样就可以得到person对象
				Object obj=m.invoke(appConfigObject, null);
				//beans.put(方法名,person的对象);
				//如果邀考虑配置的name属性的话
				Bean ano=m.getAnnotation(Bean.class);
				String[] names=ano.name();
				String beanName=m.getName();
				if (names!=null && names.length>0) {
					beanName=names[0];
				}
				beans.put(beanName, obj);
			}
		}
		
		Collection c=beans.values();
		Iterator ite=c.iterator();
		while(ite.hasNext()) {
			Object obj=ite.next();
			Method[] methods=obj.getClass().getMethods();
			for (Method m:methods) {
				if (m.isAnnotationPresent(Resource.class)) {
					//取出resource中配置的名字
					Resource resourAnnotation=m.getAnnotation(Resource.class);
					String beanName=resourAnnotation.name();
					Object o=beans.get(beanName);
					
					m.invoke(obj, o);
				}
			}
		}
	}
	
}
以上为spring注解容器。使用时直接new容器就可以
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值