贵南县wap网站建设公司,做网站详情的图片,关于做暧暧的网站,中文版本wordpress一、你真的懂注解吗
你是否使用过Autowired却不知道是如何生效的#xff1f; 这几个注解你一定很熟悉#xff1a;
OverrideDeprecatedTransactional 那么你有进一步思考过怎么生效的吗#xff1f;注解到底是什么#xff1f;注解#xff0c;到底是信息#xff1f;还是指…一、你真的懂注解吗
你是否使用过Autowired却不知道是如何生效的 这几个注解你一定很熟悉
OverrideDeprecatedTransactional 那么你有进一步思考过怎么生效的吗注解到底是什么注解到底是信息还是指令是标签还是注释
二、注解是一封写给反射器的“情书”
注解 元数据 举个例子你在缅甸被嘎腰子了这时你想了一个办法偷偷张贴一张小纸条上面写着“救我”。那么路过的人看到这个纸条就会想着替你做点什么。 再来讲讲注解的生命周期
source写完就撕掉例如override只作用在源码时期。class 打包了但是JVM不看作用在class期间小纸条被翻译成class但是JVM不看。runtime这个小纸条可以在程序运行时期被读取。
三、实战一自定义一个注解实现“自动字段注入”
“太监宣旨”→ 注解写在类上反射器执行“圣旨”。
创建一个圣旨
import java.lang.annotation.*;Target(ElementType.TYPE)
Retention(RetentionPolicy.RUNTIME)
Inherited
public interface ShannonAnnotation {int age() default 1 ;String name() default ;
}宣读圣旨放在类上 ShannonAnnotation(name shannon,age 18)public static class People{int age;String name;public void sayHello(){System.out.println(hello i am shannon);}}执行圣旨反射器调用 public static void main(String[] args) {ClassPeople peopleClass People.class;Annotation[] annotations peopleClass.getAnnotations();// 遍历类上所有的注解找到我们的圣旨for (Annotation annotation : annotations) {if (annotation instanceof ShannonAnnotation){ShannonAnnotation annotation1 (ShannonAnnotation) annotation;System.out.println(age:annotation1.age());System.out.println(name:annotation1.name());}}
// invoketry {peopleClass.getMethod(sayHello).invoke(new People());} catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {throw new RuntimeException(e);}}结果
四、实战二解析 Spring 是如何将“尊贵妃”变“宠妃”
搭建Spring Debug环境 – 搭建方法见编译Spring创建一个项目如下
Service
public class HelloService {public void sayHi(){System.out.println(hello world);}
}Service
public class MyService {Autowiredpublic HelloService helloService;
}由上可知在MyService中使用Autowired注解将HelloService注入。
进入方法打断点 这里解释一下方法的作用scan方法主要是扫描basePackage的所有bean注册到BeanDefinitions当中refresh是真正启动整个容器。 在这个方法打断点org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean这个方法是注入bean属性的方法。
可以看到上图有一个AutoWiredAnnontationBeanPostProcessor类这个就是AutoWired的处理方法点进去看看 可以看到上图中metadata中包含一个injectedElements 包含了HelloService。spring 调用metadata的inject方法完成属性的注入
总结
注解只是一段信息注解不是具体的处理逻辑处理逻辑由其他代码实现