转载

【java实例】自己动手实现IOC和MVC(三)

上一节中可以扫描指定package以及子package下的所有class了,这一节我们会介绍怎么收集和整理这些扫描到得class的信息 这时候我们整理我扫描到得的class的信息并将其赋值给我们自己定义的一个class 问题如下: ①怎么定义扫描到class的信息的类呢? 首先我要实例化的bean的id必须是唯一的,这个id你可以在你要进行instance的class(如 UserDao.Java) 上进行annotation的,这里默认采用实例化类的名字 ,首字母小写(userDao),下面具体实现 BeanDefinition.java(用于收集实例化bean的类)
  1. package com.ajunframework.beans.definition;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. /**
  5.  * 读取注释bean的初始化属性
  6.  * @author harries
  7.  * @http://www.liuhaihua.cn
  8.  */
  9. public class BeanDefinition {
  10.     private String id;//默认为class的名字
  11.     private String calssName;//com.ajun.bean.AjunClass
  12.     //用于实现依赖注入
  13.     private List<PropertyDefinition> properties = new ArrayList<PropertyDefinition>();
  14.     public BeanDefinition(String id, String calssName) {
  15.         super();
  16.         this.id = id;
  17.         this.calssName = calssName;
  18.     }
  19.     public String getId() {
  20.         return id;
  21.     }
  22.     public void setId(String id) {
  23.         this.id = id;
  24.     }
  25.     public String getCalssName() {
  26.         return calssName;
  27.     }
  28.     public void setCalssName(String calssName) {
  29.         this.calssName = calssName;
  30.     }
  31.     public List<PropertyDefinition> getProperties() {
  32.         return properties;
  33.     }
  34.     public void setProperties(List<PropertyDefinition> properties) {
  35.         this.properties = properties;
  36.     }
  37. }
用于收集注入bean的属性的信息类
  1. package com.ajunframework.beans.definition;
  2. /**
  3.  * 注入属性的定义
  4.  * @author harries
  5.  * @http://www.liuhaihua.cn
  6.  */
  7. public class PropertyDefinition {
  8.     private String name;//注入的属性的名字 默认为属性名字
  9.     private String ref;//注入到哪个bean中,bean的id
  10.     public PropertyDefinition(String name, String ref) {
  11.         this.name = name;//注入属性的名字
  12.         this.ref = ref;//注入到哪个bean中 ,这个表示bean的id
  13.     }
  14.     public String getName() {
  15.         return name;
  16.     }
  17.     public void setName(String name) {
  18.         this.name = name;
  19.     }
  20.     public String getRef() {
  21.         return ref;
  22.     }
  23.     public void setRef(String ref) {
  24.         this.ref = ref;
  25.     }
  26. }
②怎么进行收集并赋值给我们定义信息类 因为上一节中我们提到过 ,有一个辅助我们扫描的工具类 ,返回我要扫描的类的class数组,此时我们就要在这个class数组上下手了,然后创建BeanDefinition对象 ,一个扫描的类就对应一个BeanDefinition对象 ,此时我们会把我们扫描出来的class ,根据java annotation信息才实例化BeanDefinition对象 ,并且填充在一个List中 ,供我实例化应用。下面收集class信息的类的具体,请详细看注释 BeandefinitionList.java
  1. package com.ajunframework.beans.definition;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Method;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import com.ajunframework.beans.annotation.Action;
  7. import com.ajunframework.beans.annotation.Dao;
  8. import com.ajunframework.beans.annotation.Property;
  9. import com.ajunframework.beans.annotation.Service;
  10. import com.ajunframework.beans.factory.RequestMapingMap;
  11. import com.ajunframework.beans.utils.BeanUtils;
  12. import com.ajunframework.exception.AjunIocException;
  13. import com.ajunframework.servlet.annotation.RequestMapping;
  14. /**
  15.  * 用于存储Beandefinition
  16.  * @author harries
  17.  * @http://www.liuhaihua.cn
  18.  */
  19. public class BeandefinitionList {
  20.     //存储class信息类的集合
  21.     private static List<BeanDefinition> beanDefinitions = new ArrayList<BeanDefinition>();
  22.     /**
  23.      * 添加一个信息类
  24.      * @param bd
  25.      */
  26.     public static void addBeanDefinition(BeanDefinition bd){
  27.         beanDefinitions.add(bd);
  28.     }
  29.     /**
  30.      * 添加一个信息类 根据类得全名
  31.      * @param fullClassName com.ajun.UserDao
  32.      */
  33.     public static void addBeanDefinition(String id ,String fullClassName){
  34.         BeanDefinition bd = new BeanDefinition(id,fullClassName);
  35.         addBeanDefinition(bd);
  36.     }
  37.     /**
  38.      * 添加一个信息类并且导入其对应的属性信息类
  39.      * @param clazz
  40.      */
  41.     public static void addBeanDefinitionAndSetProperty(Class<?> clazz){
  42.         String fullName = clazz.getName();
  43.         String id ="";
  44.         if(clazz.isAnnotationPresent(Dao.class)){
  45.              id = clazz.getAnnotation(Dao.class).value();
  46.         }else if(clazz.isAnnotationPresent(Service.class)){
  47.              id = clazz.getAnnotation(Service.class).value();
  48.         }else if(clazz.isAnnotationPresent(Action.class)){
  49.             id = clazz.getAnnotation(Action.class).value();
  50.         }
  51.         if(id==null ||  "".equals(id.trim())){
  52.             id = fullName.substring(fullName.lastIndexOf(".")+1).substring(0,1).toLowerCase()+ fullName.substring(fullName.lastIndexOf(".")+1).substring(1);
  53.         }
  54.         BeanDefinition bd  = new BeanDefinition(id,fullName);
  55.         Field [] fields = BeanUtils.findDeclaredFields(clazz);
  56.         if(fields!=null && fields.length>0){
  57.             for(Field f:fields){
  58.                 if(f.isAnnotationPresent(Property.class)){
  59.                     PropertyDefinition pd = new PropertyDefinition(f.getName(),id);
  60.                     bd.getProperties().add(pd);
  61.                 }
  62.             }
  63.         }
  64.         Method [] methods = BeanUtils.findDeclaredMethods(clazz);
  65.         for(Method m : methods){
  66.             if(m.isAnnotationPresent(RequestMapping.class)){
  67.                 String path = m.getAnnotation(RequestMapping.class).value();
  68.                 if(RequestMapingMap.getBeanName(path)!=null){
  69.                     throw new AjunIocException("RequestMapping's url is only ,now it is not only");
  70.                 }
  71.                 RequestMapingMap.put(path, id);
  72.             }
  73.         }
  74.         addBeanDefinition(bd);
  75.     }
  76.     //返回class信息类的List
  77.     public static List<BeanDefinition> getBeanDefinitions(){
  78.         return beanDefinitions;
  79.     }
  80. }
现在我要进行实例化的信息都收集起来,接下来一节中我就可以进行实例化了  
正文到此结束
Loading...