LOFTER for ipad —— 让兴趣,更有趣

点击下载 关闭
SpringMVC个人笔记 part3 底层方法
Nowakii 2018-10-12

书接上文

今天是BeanDI注解的使用 以及怎么书写一个好的程序。

@BeanDI

  • private UserDao userDao;

  • public void setUserDao(UserDao userDao) {

this.userDao = userDao;

}


@BeanDI注解 可以放在set方法上面作为注解   也可以放在属性上面。

在此我们放在成员变量上面进行展示:

那么相应的beanFactory中应该添加方法来解析这个注释

public static void resolveFieldAnnotation(Object beanInstance){

    Field[] fields=beanInstance.getClass().getDeclaredFields();

    for(Field field:fields){

    if(null!=field&&field.isAnnotationPresent(BeanDI.class)){

    BeanDI bd=field.getAnnotation(BeanDI.class);

    String beanId=bd.name();

    Object value="";

    if(beanId!=null&&"".equals(beanId)){

    value=singletonBeanMap.get(beanId);

    }else{

    for(String key:singletonBeanMap.keySet()){

    if(field.getType().isAssignableFrom(singletonBeanMap.get(key).getClass())){

    value=singletonBeanMap.get(key);

    break;

    }

    }

    }

    field.setAccessible(true);

    try {

    //beaninstance当前对象  value表示注入的值

    //对带有注解的属性初始化 使用set方法

field.set(beanInstance, value);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

    }

    }

    }

我们获取了BeanDI的class。放在Field数组里,然后判断是否为空,如果不是空,直接赋值。是空的话遍历map获取然后赋值。

然后把我们的对象和所获得的注解值捆绑在一起。做到对应。


放在set方法上面时,我们应该在BeanFactory写什么方法呢?

public static void resolvePropertyAnnotation(Object beanInstance){

    try {

    /**

     * 拆分成多行代码:

     * 1.更容易看中间过程

     * 2.异常定位

     * 3.变量接受返回值重复利用

     * Beaninfo的信息包括(重点):

     * beandescriptor:描述类 包名 类名

     * methodDescriptor:描述本类及父类中的方法 eg:UserDao和父类Object

     * propertyDecriptor:描述本类及父类的属性或成员变量 get*** set***

     */

BeanInfo beanInfo=Introspector.getBeanInfo(beanInstance.getClass());

        PropertyDescriptor[] pdArray= beanInfo.getPropertyDescriptors();

        for(PropertyDescriptor pd:pdArray){

        /**

         * PropertyDescriptor:getwritr获取set方法

         * getreadmethod获取get方法

         */

        Method setter = pd.getWriteMethod();

        //setter方法注解  不用注解会遍历 效率降低

        if(null!=setter && setter.isAnnotationPresent(BeanDI.class)){

        BeanDI bd=setter.getAnnotation(BeanDI.class);

        String name="";

        Object value="";

        if(bd.name()!=null&&!"".equals(bd.name())){

        name=bd.name();

        //获得注解的实例

        value=singletonBeanMap.get(name);

        }else{

        

        for (String beanId : singletonBeanMap.keySet()) {

if (pd.getPropertyType().isAssignableFrom(singletonBeanMap.get(beanId).getClass())){

value = singletonBeanMap.get(beanId);

break;

}

}

        }

        setter.setAccessible(true);

    setter.invoke(beanInstance, value);

        }

        

        }


} catch (Exception e) {

e.printStackTrace();

}

    }

通过 PropertyDescriptor:getwritr获取set方法

其他基本差距不大



推荐文章
评论(0)
分享到
转载我的主页