手写Spring源码03 - 元数据读取器 MetadataReader 设计与实现(二)

详细设计

本片介绍元数据定义和实现、被标注的元数据类型定义,如下图圈出的部分
在这里插入图片描述

元数据定义和实现
被标注的元数据类型定义 - AnnotatedTypeMetadata

被标注的元数据类型定义,定义了获取注解方法等

代码实现

package cn.zhanghongyang.core.type;

import cn.zhanghongyang.core.annotation.MergedAnnotations;

/**
 * @Author: zhanghongyang
 * @Description: 可被标注的元数据定义
 * 从定义的方法和子类可以看出,这个接口子类的元数据上一定可以使用注解
 * 子类:AnnotationMetadata, MethodMetadata
 */
public interface AnnotatedTypeMetadata {

    /**
     * 获取所有注解
     * @return
     */
    MergedAnnotations getAnnotations();

}
类元数据 - ClassMetadata

类元数据定义,保存类元数据的信息

代码实现

package cn.zhanghongyang.core.type;

/**
 * @Author: zhanghongyang
 * @Description: 类元数据定义
 */
public interface ClassMetadata {

    /**
     * 类名
     * @return
     */
    String getClassName();

    /**
     * 超类名称
     * @return
     */
    String getSuperClassName();

    /**
     * 获取接口名称
     * @return
     */
    String[] getInterfaceNames();

}
注解元数据 - AnnotationMetadata

因为注解是继承了Annotation的接口,有类的属性,所以继承了ClassMetadata,又因为注解上面可以标注注解所以也继承AnnotatedTypeMetadata

package cn.zhanghongyang.core.type;

/**
 * @Author: zhanghongyang
 * @Description: 注解元数据定义
 */
public interface AnnotationMetadata extends ClassMetadata, AnnotatedTypeMetadata{

}
方法元数据 - MethodMetadata

因为方法上可以标注注解所以继承自AnnotatedTypeMetadata

package cn.zhanghongyang.core.type;

/**
 * @Author: zhanghongyang
 * @Description: 方法元数据定义
 */
public interface MethodMetadata extends AnnotatedTypeMetadata{

    /**
     * 获取方法名称
     * @return
     */
    String getMethodName();

    /**
     * 方法所在的类名称
     * @return
     */
    String getDeclaringClassName();

    /**
     * 获取返回类型
     * @return
     */
    String getReturnTypeName();

    /**
     * 抽象方法
     * @return
     */
    boolean isAbstract();

    /**
     * 静态方法
     * @return
     */
    boolean isStatic();

    /**
     * final方法
     * @return
     */
    boolean isFinal();

    /**
     * 是否可以重写
     * @return
     */
    boolean isOverridable();

}
注解类元数据的实现 - SimpleAnnotationMetadata

代码实现

package cn.zhanghongyang.core.type.classreader;

import cn.zhanghongyang.core.annotation.MergedAnnotations;
import cn.zhanghongyang.core.type.AnnotationMetadata;
import cn.zhanghongyang.core.type.MethodMetadata;

import java.util.Set;

/**
 * @Author: zhanghongyang
 * @Description: 注解元数据实现
 */
public class SimpleAnnotationMetadata implements AnnotationMetadata {

    //类名称
    private String className;

    //访问修饰
    private int access;

    //外部类名称
    private String enclosingClassName;

    //父类名称
    private String superClassName;

    //是否为独立的每部类
    private boolean independentInnerClass;

    //接口名称
    private String[] interfaceNames;

    //成员类名称,即内部类
    private String[] memberClassNames;

    //方法集合
    private MethodMetadata[] annotatedMethods;

    //注解和元注解集合类
    private MergedAnnotations annotations;

    //注解类型集合
    private Set<String> annotationTypes;


    public SimpleAnnotationMetadata(String className, int access, String enclosingClassName,
                             String superClassName, boolean independentInnerClass, String[] interfaceNames,
                             String[] memberClassNames, MethodMetadata[] annotatedMethods, MergedAnnotations annotations) {

        this.className = className;
        this.access = access;
        this.enclosingClassName = enclosingClassName;
        this.superClassName = superClassName;
        this.independentInnerClass = independentInnerClass;
        this.interfaceNames = interfaceNames;
        this.memberClassNames = memberClassNames;
        this.annotatedMethods = annotatedMethods;
        this.annotations = annotations;
    }



    @Override
    public MergedAnnotations getAnnotations() {
        return this.annotations;
    }

    @Override
    public String getClassName() {
        return this.className;
    }

    @Override
    public String getSuperClassName() {
        return this.superClassName;
    }

    @Override
    public String[] getInterfaceNames() {
        return this.interfaceNames;
    }
}
方法元数据的实现 - SimpleMethodMetadata

代码实现

package cn.zhanghongyang.core.type.classreader;

import cn.zhanghongyang.core.annotation.MergedAnnotations;
import cn.zhanghongyang.core.type.MethodMetadata;
import org.objectweb.asm.Opcodes;

/**
 * @Author: zhanghongyang
 * @Description: 方法元数据实现
 */
public class SimpleMethodMetadata implements MethodMetadata {

    private final String methodName;

    private final int access;

    private final String declaringClassName;

    private final String returnTypeName;

    public SimpleMethodMetadata(String methodName, int access, String declaringClassName, String returnTypeName) {
        this.methodName = methodName;
        this.access = access;
        this.declaringClassName = declaringClassName;
        this.returnTypeName = returnTypeName;
    }

    @Override
    public String getMethodName() {
        return this.methodName;
    }

    @Override
    public String getDeclaringClassName() {
        return this.declaringClassName;
    }

    @Override
    public String getReturnTypeName() {
        return this.returnTypeName;
    }

    @Override
    public boolean isAbstract() {
        return (this.access & Opcodes.ACC_ABSTRACT) != 0;
    }

    @Override
    public boolean isStatic() {
        return (this.access & Opcodes.ACC_STATIC) != 0;
    }

    @Override
    public boolean isFinal() {
        return (this.access & Opcodes.ACC_FINAL) != 0;
    }

    @Override
    public boolean isOverridable() {
        return !isStatic() && !isFinal() && !isPrivate();
    }

    public boolean isPrivate() {
        return (this.access & Opcodes.ACC_PRIVATE) != 0;
    }

    @Override
    public MergedAnnotations getAnnotations() {
        return this.getAnnotations();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
手写一个Spring源码实现是一个非常复杂的任务,需要对Spring的核心原理和设计思想有深入的理解。以下是一个简单的Spring源码实现的示例,仅供参考。 首先,我们需要创建一个核心的容器类来管理Bean的生命周期和依赖注入。这个容器类需要实现BeanFactory接口,提供getBean()方法来获取Bean对象。 ```java public interface BeanFactory { Object getBean(String name); } ``` 接下来,我们需要实现一个简单的Bean定义类,用于描述Bean的属性和依赖关系。 ```java public class BeanDefinition { private Class<?> beanClass; private Map<String, Object> properties = new HashMap<>(); private List<PropertyValue> propertyValues = new ArrayList<>(); public void setBeanClass(Class<?> beanClass) { this.beanClass = beanClass; } public Class<?> getBeanClass() { return beanClass; } public void addProperty(String name, Object value) { properties.put(name, value); } public Object getProperty(String name) { return properties.get(name); } public List<PropertyValue> getPropertyValues() { return propertyValues; } public void addPropertyValue(PropertyValue propertyValue) { propertyValues.add(propertyValue); } } public class PropertyValue { private final String name; private final Object value; public PropertyValue(String name, Object value) { this.name = name; this.value = value; } public String getName() { return name; } public Object getValue() { return value; } } ``` 然后,我们需要实现一个简单的BeanFactory实现类,用于创建和管理Bean对象。这个实现类需要读取Bean定义信息,创建Bean实例,并将其保存在一个Map中。 ```java public class SimpleBeanFactory implements BeanFactory { private final Map<String, BeanDefinition> beanDefinitions = new HashMap<>(); private final Map<String, Object> beans = new HashMap<>(); public SimpleBeanFactory(String configLocation) { loadBeanDefinitions(configLocation); createBeans(); } private void loadBeanDefinitions(String configLocation) { // 从配置文件中读取Bean定义信息 } private void createBeans() { for (String beanName : beanDefinitions.keySet()) { createBean(beanName); } } private Object createBean(String beanName) { BeanDefinition beanDefinition = beanDefinitions.get(beanName); Class<?> beanClass = beanDefinition.getBeanClass(); Object bean = createInstance(beanClass); applyPropertyValues(bean, beanDefinition.getPropertyValues()); beans.put(beanName, bean); return bean; } private Object createInstance(Class<?> beanClass) { try { return beanClass.newInstance(); } catch (InstantiationException | IllegalAccessException e) { throw new RuntimeException(e); } } private void applyPropertyValues(Object bean, List<PropertyValue> propertyValues) { for (PropertyValue propertyValue : propertyValues) { String propertyName = propertyValue.getName(); Object value = propertyValue.getValue(); setPropertyValue(bean, propertyName, value); } } private void setPropertyValue(Object bean, String propertyName, Object value) { try { BeanUtils.setProperty(bean, propertyName, value); } catch (IllegalAccessException | InvocationTargetException e) { throw new RuntimeException(e); } } @Override public Object getBean(String name) { return beans.get(name); } } ``` 最后,我们需要实现一个简单的测试类来验证我们的实现是否正确。 ```java public class SimpleBeanFactoryTest { @Test public void testGetBean() { BeanFactory beanFactory = new SimpleBeanFactory("classpath:beans.xml"); TestBean testBean = (TestBean) beanFactory.getBean("testBean"); assertNotNull(testBean); assertNotNull(testBean.getDependency()); } } ``` 这只是一个简单的Spring源码实现示例,实际上Spring源码实现要复杂得多,涉及到很多高级特性和设计模式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值