学习spring必了解的三个知识点——注解、反射机制、三层架构
注解、反射机制、三层架构
- 注解:注解的功能类似于代码中的注释,所不同的是注解不是提供代码功能的说明,而是实现程序功能的重要组成部分。注解大多都有自己的配置参数,而配置参数以名值对的方式出现,所以从某种角度来说,可以把注解看成是一个XML元素,该元素可以有不同的预定义的属性。在代码中使用注解,就相当于把一部分元数据从XML文件移到了代码本身之中,在一个地方管理和维护。简单的说,注解跟踪代码依赖性,实现替代配置文件功能。
- 反射机制:反射是框架的灵魂,它可以有效地降低类之间的耦合,很多框架都运用了反射原理。想要实现反射,就必须先拿到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息,每一个类对应着一个字节码文件也就对应着一个Class类型的对象,也就是字节码文件对象。
- 三层架构:
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,在学习过程中发现的这个问题,希望能给大家帮助。有问题可以互相交流。
来源:CSDN
作者:速度~70迈
链接:https://blog.csdn.net/qq_44706044/article/details/103644859