Spring6注解式开发如何实现高效策略?
摘要:spring框架创建bean就是利用反射机制 反射机制的代码如下: public static void main(String[] args) throws Exception { System.out.println(&
spring框架创建bean就是利用反射机制
反射机制的代码如下:
public static void main(String[] args) throws Exception {
System.out.println("Hello, World!");
// 使用反射机制调用方法
// 获取类
Class<?> clazz = Class.forName("com.ali.bean2.SomeService");
// 获取方法
Method method = clazz.getMethod("doSomething", String.class, int.class);
// 获取对象
Object obj = clazz.newInstance();
// 方法调用
// obj: 哪个对象调用这个方法
// "hello", 42: 方法参数
// hello: 方法的返回值
Object hello = method.invoke(obj, "hello", 42);
}
spring IoC注解式开发
注解主要是为了简化xml配置。
注解怎么定义
新建Java Class 时选择Annoation 类型的文件,这样就创建了一个新的注解
// 自定义注解
// @Target 标注注解的注解,叫做元注解
// ElementType.TYPE: 表示可以标注在类上
// ElementType.FIELD: 表示可以标注在属性上
// 使用某个注解的时候,如果注解的属性名是value,可以省略属性名
// 使用某个注解的时候,如果注解的属性值是数组,并且数组中只有一个值,可以省略大括号
@Target(value = {ElementType.TYPE,ElementType.FIELD})
// @Retention 标注注解的生命周期,叫做元注解,表示最终保留在class文件中,并且可以被反射机制读取
// RetentionPolicy.SOURCE: 注解只在源码中存在,编译成字节码后就不存在了
// RetentionPolicy.CLASS: 注解在源码和字节码中都存在,运行时不存在(默认值),也就是不能被反射机制读取
// RetentionPolicy.RUNTIME: 注解在源码、字节码和运行时都存在
@Retention(RetentionPolicy.RUNTIME)
public @interface Component {
String value();
}
怎么通过反射机制读取注解
假设user类被注解@Component修饰
@Component("userBean")
public class User {
}
public static void main(String[] args) throws Exception {
// 使用反射机制读取注解
// 获取类
Class<?> userClazz = Class.forName("com.ali.component.User");
// 判断类上是否有某个注解
boolean hasAnnotation = userClazz.isAnnotationPresent(Component.class);
if (hasAnnotation) {
// 获取类上的注解对象
Component component = userClazz.getAnnotation(Component.class);
// 访问注解的属性
System.out.println("component value: " + component.value());
}
}
组件扫描原理
主要是通过反射机制实例化注解标记的类的对象。
public static void main(String[] args) {
// 根据一个包名,扫描这个包下面的所有类,当这个类有@Component注解时,实例化这个类,key是@Component注解的value,value是实例化的对象
String packageName = "com.ali.component";
// 将包名中的“.”替换成“/”
String path = packageName.replaceAll("\\.", "/");
// 包是在系统恨路径下的一个目录。
