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容器就可以