学习spring必了解的三个知识点——注解、反射机制、三层架构

那年仲夏 提交于 2019-12-21 19:28:08

学习spring必了解的三个知识点——注解、反射机制、三层架构

注解、反射机制、三层架构

  1. 注解:注解的功能类似于代码中的注释,所不同的是注解不是提供代码功能的说明,而是实现程序功能的重要组成部分。注解大多都有自己的配置参数,而配置参数以名值对的方式出现,所以从某种角度来说,可以把注解看成是一个XML元素,该元素可以有不同的预定义的属性。在代码中使用注解,就相当于把一部分元数据从XML文件移到了代码本身之中,在一个地方管理和维护。简单的说,注解跟踪代码依赖性,实现替代配置文件功能。
  2. 反射机制:反射是框架的灵魂,它可以有效地降低类之间的耦合,很多框架都运用了反射原理。想要实现反射,就必须先拿到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息,每一个类对应着一个字节码文件也就对应着一个Class类型的对象,也就是字节码文件对象。
  3. 三层架构:
    UI(表现层): 主要是指与用户交互的界面。用于接收用户输入的数据和显示处理后用户需要的数据。
    BLL:(业务逻辑层): UI层和DAL层之间的桥梁。实现业务逻辑。业务逻辑具体包含:验证、计算、业务规则等等。
    DAL:(数据访问层): 与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。

注解案例

@Target(ElementType.TYPE)//注解的作用目标:接口、类、枚举
@Retention(RetentionPolicy.RUNTIME)//注解的保留位置:注解会在class字节码文件中存在,在运行时可以通过反射获取到

@Documented//说明该注解将被包含在javadoc中
public @interface school {
    //学校名称
    public String schoolName() default "";
    //学校编号
    public String schoolId() default "";
    //学校地址
    public String schoolAddress() default "";
}

@school(schoolName = "WUT",schoolId = "111111",schoolAddress = "WUHAN")
public class schoolDemo {
    private String WUTName;
    private String WUTId;
    private String WUTAddress;

    public schoolDemo(String WUTName, String WUTId, String WUTAddress) {
        this.WUTName = WUTName;
        this.WUTId = WUTId;
        this.WUTAddress = WUTAddress;
    }

    public String getWUTName() {
        return WUTName;
    }

    public void setWUTName(String WUTName) {
        this.WUTName = WUTName;
    }

    public String getWUTId() {
        return WUTId;
    }

    public void setWUTId(String WUTId) {
        this.WUTId = WUTId;
    }

    public String getWUTAddress() {
        return WUTAddress;
    }

    public void setWUTAddress(String WUTAddress) {
        this.WUTAddress = WUTAddress;
    }
}

public class WUTInfo {
    public static school getSchool(Class<?> clazz) throws Exception {
        school annotation = clazz.getAnnotation(com.springbean.school.class);//获取反射获取处理注释
        schoolDemo s1= (schoolDemo)clazz.newInstance();
        s1.setWUTName(annotation.schoolName());
        s1.setWUTAddress(annotation.schoolAddress());
        s1.setWUTId(annotation.schoolId());
        return (school) s1;
    }
}
public class Main {
    public static void main(String[] args) throws Exception {
        schoolDemo s = (schoolDemo) WUTInfo.getSchool(com.springbean.schoolDemo.class);
        System.out.println(s.getWUTAddress());
        System.out.println(s.getWUTId());
        System.out.println(s.getWUTName());
    }
}

通过案例在使用框架中都使用了这种方式来减少配置文件的数量。

反射机制案例

public class person {
    private String name;
    private Integer age;

    public person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class reflectPerson {
    public static void main(String[] args) throws Exception {
        //加载进内存,创建class对象
        Class clazz = Class.forName("com.springbean.person");
        //通过反射:class对象的getConstructor方法拿到构造器
        Constructor constructor = clazz.getConstructor(String.class, Integer.class);
        Object obj = constructor.newInstance("LFY", 20);
        System.out.println("反射:"+obj);
    }
}

Class类中有什么常用方法

获取公共构造器 getConstructors()
获取所有构造器 getDeclaredConstructors()
获取该类对象 newInstance()
获取类名包含包路径 getName()
获取类名不包含包路径 getSimpleName()
获取类公共类型的所有属性 getFields()
获取类的所有属性 getDeclaredFields()
获取类公共类型的指定属性 getField(String name)
获取类全部类型的指定属性 getDeclaredField(String name)
获取类公共类型的方法 getMethods()
获取类的所有方法 getDeclaredMethods()
获得类的特定公共类型方法: getMethod(String name, Class[] parameterTypes)
获取内部类 getDeclaredClasses()
获取外部类 getDeclaringClass()
获取修饰符 getModifiers()
获取所在包 getPackage()
获取所实现的接口 getInterfaces()

反射最重要的作用就是让程序耦合度降低

三层架构案例

在这里插入图片描述
三层架构的特点:
1.结构清晰、耦合度低
2.可维护性高,可扩展性高
3.利于开发任务同步进行, 容易适应需求变化

自己也是刚开始学习spring,在学习过程中发现的这个问题,希望能给大家帮助。有问题可以互相交流。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!