spring boot autowired注解的作用,springboot autowired注解
目录
Java Annotation spring Annotation(1)配置文件表单(2)注释表单@Autowired Analysis @Autowired有效流程
java注解
在解释spring的注释之前,java的注释是什么?Java annotation,也称为Java Annotation,是JDK5.0引入的一种注释机制。
Java类、变量、参数、包等。可以注释。可以反射Java注释以获得注释的内容。当编译器生成字节码文件时,还会添加注释信息。在运行时,JVM可以根据注释信息获取相应的信息。
下面我给大家介绍一下java中七个常见的注释,这也是spring中注释的基础!前三条注释用来注释代码,剩下的四条用来修饰注释!
@ Override-检查该方法是否是重写方法。如果找到了它的父类,或者引用的接口没有此方法,将报告编译错误。@ Deprecated-标记过时的方法。如果使用此方法,将会报告编译警告。@ suppress warnings-指示编译器忽略注释中声明的警告。@ Retention-标识该注释是如何保存的,是仅保存在代码中,还是编译到类文件中,或者可以在运行时通过反射访问。@ Documented-标记这些注释是否包含在用户文档javadoc中。@Target-Mark这个注释应该是哪种Java成员。@ Inherited-标记该批注从哪个批注类继承(默认批注不从任何子类继承)
spring注解
接下来我们来说说注释在spring中的作用。
spring的重要特性是控制反转和依赖注入。在spring中,将一些需要创建和生成的类的控制权交给spring容器进行管理,这就是所谓的控制权倒置。依赖注入是将属性和类信息注入到相应的类中。这和我们将要使用的注释有什么关系呢?
00-1010我们知道在注释出现之前,spring实现bean的管理是通过配置文件来实现的,所以我们先设计一个简答bean来实现,如下图:结构图如下。请对比一下结构图,方便我把代码拼起来!
包com . example . school;导入com . example . studuent . *;公共课初中{私理思理思;列兵张三张三;public void set Lisi(com . example . studuent . Lisi Lisi){ this。Lisi=Lisi} public void set Zhang San(com . example . studuent . Zhang San Zhang San){ this。张三=张三;} public com . example . studuent . Lisi getLisi(){ return Lisi;} public com . example . studuent . Zhang San getzhang San(){ return Zhang San;}公共字符串toString(){ return Lisi . name;} }包com . example . studuent;class Lisi { public string name= Lisi ;public void set name(String name){ this . name=name;} public String getName(){ return name;} public String student name(){ return name;} }包com . example . studuent;类张三{public string name=张三;public void set name(String name){ this . name=name;} public String getName(){ return name;} public string student name(){ return 这个学生是: name} }导入com . example . school . *;导入com . example . studuent . Lisi;导入org . spring framework . context . application con
text;import org.springframework.context.support.ClassPathXmlApplicationContext;public class annotationExample { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); chuzhong cz = (chuzhong) context.getBean("chuzhong"); String name = cz.getLisi().studentname(); System.out.println(name); }}配置文件如下:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <bean id="chuzhong" class="com.example.school.chuzhong" > <property name="lisi" ref="lisi" /> <property name="zhangsan" ref="zhangsan" /> </bean> <bean id="lisi" class="com.example.studuent.lisi" /> <bean id="zhangsan" class="com.example.studuent.zhangsan" /></beans>
运行结果:
可以看到,加载了相应的配置文件,然后spring容器依次创建了相应的实例对象。并成功输出的lisi实例对象的姓名。
这就是未使用注解时候,bean的使用方法。
(2)注解形式
加入了注解之后,我们会省下配置很多不必要信息的时间。最常用的自动装配的注解@Autowired,用于放置在类上用来修饰。
可以了解一下@Autowired的源码中的注解信息,咱们简单看一个重要的信息
这个说,构造函数、字段、setter方法或config方法标记为由Spring的依赖项注入工具自动连接。
而@Autowired这个注解对应的,就是我们在chuzhong类中,写的set和get方法,以及配置文件中的property标签的内容,它可以帮我们自动关联bean对象,实现自动装配功能。
所以我们使用@Autowired注解之后的类文件和配置文件就变成了如下图,关联的zhangsan和lisi类对象的set和get方法省略,并且配置文件中property中内容省略,但是需要加上component-scan组件扫描配置,因为当出现@Autowired注解之后,会从base-package下查找相应的关联bean对象:
@Autowired的解析
我们来分析一下@Autowired中都是什么东西:
1,首先注解是使用@interface修饰的,意味着它实现了 java.lang.annotation.Annotation 接口,使用@interface修饰才可以生成注解的形式
2,绿色字体的意思,注解依赖是否是必须的,也就是你使用了@Autowired这个注解,那么可以手动配置required,是否使用,默认是写了该注解就是使用
3,我们在文章第一段说明了,有四个注解是用来修饰注解的。我用一段来解释一下其中字段的意思。
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE}) 表示这个注解是用来修改哪种成员的,如果没有写这个@Target则表示,它可以用在任何地方。然后我们了解一下ElementType这个枚举类中中各个字段的意思。从下面我们可以看出,它可以修饰构造器、方法、参数、成员变量以及注解。所以多个ElementType对应一个注解。
TYPE: 能修饰类、接口或枚举类型FIELD: 能修饰成员变量METHOD: 能修饰方法PARAMETER: 能修饰参数CONSTRUCTOR: 能修饰构造器LOCAL_VARIABLE: 能修饰局部变量ANNOTATION_TYPE: 能修饰注解PACKAGE: 能修饰包TYPE_PARAMETER: 能修饰类型参数TYPE_USE: 所有类型都可以修饰(不包括类)
@Retention(RetentionPolicy.RUNTIME)用于指定该注解的生命周期,存活到什么时候,RUNTIME表明存活到运行时,可以反射获取相应的信息。
SOURCE:该注解存在于源码中,当编译成字节码时,就消失了。CLASS: 该注解在java文件生成字节码文件后,存在于字节中,但是在jvm运行中就没了。@Retention的默认值,即当没有显式指定@Retention的时候,就会是这种类型。RUNTIME: 该标注信息存在字节码中,jvm运行该字节码时,可以通过标注获取相应的信息
@Documented文中第一段有说明。
@Autowired的生效流程
而@Autowired是如何生效的呢?我引用一下别人的文章:SpringBoot中@Autowired是如何生效的,希望大家也可以看一看,我摘重点说一下。下图就是spring启动之后的流程。
首先是AutowiredPorcessor的BeanDefinition的注册
1, 创建ApplicationContext
2, 创建AnnotatedBeanDefinitionReader
3, 注册BeanDefinition registerAnnotationConfigProcessors
然后是AutowiredProcessor注册为bean
1,registerBeanPostProcessors
最后是注入
1,获取bean getBean()
2,创建bean doCreateBean()
3,生成bean populateBean()
4,应用AutowiredProcessor ibp.postProcessProperties()
5,找到可注入的字段 buildAutowiringMetadata
6,注入 metadata.inject
spring的其余注解也可以参考这种形式,逐一进行分析,个人的注解放到(二)中实现。
到此这篇关于spring详细讲解@Autowired注解的解析的文章就介绍到这了,更多相关spring @Autowired内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。