《Java注解机制之Spring自动装配实现原理详解》由会员分享,可在线阅读,更多相关《Java注解机制之Spring自动装配实现原理详解(2页珍藏版)》请在金锄头文库上搜索。
1、Java注解机制之Spring动装配实现原理详解Ja中使用注解的情况主要在Spring(Spring等),注解实际上相当于一种标记语言,它允许你在运行时动态地对拥有该标记的成员进行操作。注意:prin框架默认不支持自动装配的,要想使用自动装配需要修改prin配置文件中an标签的a属性。自动装配属性有6个值可选,分别代表不同的含义:a从Spring不境中获取目标对象时,目标对象中的属性会根据名称在整个Spring不境中查找a标签的i属性值。如果有相同的,那么获取这个对象,实现关联。整个Spring不境:表示所有的prin配置文件中查找,那么i不能有重复的。p从Spring不境中获取目标对象时,目
2、标对象中的属性会根据类型在整个priri不境中查找a标签的属性值。如果有相同的,那么获取这个对象,实现关联。缺点:如果存在多个相同类型的对象,会出错;如果属性为单一类型的数据,那么查找到多个关联对象会发生错误;如果属性为数组或集合泛型类型,那么查找到多个关联对象不会发生异常。nr使用构造方法完成对象注入,其实也是根据构造方法的参数类型进行对象查找,相当于釆用的e式。a自动选择:如果对象没有无参数的构造方法,那么自动选择nr的自动装配方式进行构造注入。如果对象含有无参数的构造方法,那么自动选择的自动装配方式进行注入。rn不支持自动装配功能a表示默认釆用上一级标签的自动装配的取值。如果存在多个配置
3、文件的话,那么每一个配置文件的自动装配方式都是独立的。注解使用需要三个条件包括注解声明,使用注解的元素,操作使用注解元素的代码。第一步注解声明,注解是一种类型,自定义注解编写代码如下:paagannotation;imprava.lang.annotatinmentType;import:java.lang.annotatinninimport:java.lang.annotation.RetentionPolicy;import:java.lang.annotainargRetention(entionPiTargetmentTypep:blic:intrfacannain:String:p
4、aramVal河北省参数名为paraa默认值为河北省使用自定义注解元素,代码如下:ring:napaagannain使/用/注:解并使用默认参数AttachAnnotavoid:At归属:p:b:SnachAnnp+ri:ntnalmnSringnapilass:AttachEmlement:普/通/:pivitachDefa:lt(String:na:Sys归属:.:p+ri:ntnalmne();a路人宅r使/用/注:解并传入参数annain河北省aapiviannaS归属:prinnan测试操作执行main函数,具体代码如下:packageannotation;importjava.la
5、ng.reflect.InvocationTargetException;importjava.lang.reflect.Method;publicclassAnnotionOperatorpublicstaticvoidmain(Stringargs)throwsIllegalAccessException,IllegalArgumentException,InvocationTargetException,ClassNotFoundExceptionAttachEmlementelement=newAttachEmlement();/初始化一个实例,用于方法调用Methodmethods=
6、AttachEmlement.class.getDeclaredMethods();/获得所有方法for(Methodmethod:methods)AttachAnnotationannotationTmp=null;if(annotationTmp=method.getAnnotation(AttachAnnotation.class)!=null)method.invoke(element,annotationTmp.paramValue();elsemethod.invoke(element,河南省);执行结果:归属:河南省归属:河北省归属:河北省Spring为了方便自动装配进行操作有两
7、种方式:继承org.springframework.web.context.support.SpringBeanAutowiringSupport类或者添加Component/Controller等注解并在Spring配置文件里声明context:component-scan元素配置。1) 继承方式实现自动装配,查看Spring3.1.1源代码会发现SpringBeanAutowiringSupport类中有如下代码:/* Thisconstructorperformsinjectiononthisinstance,* basedonthecurrentwebapplicationcontex
8、t.* Intendedforuseasabaseclass.* see#processInjectionBasedOnCurrentContext*/publicSpringBeanAutowiringSupport()processInjectionBasedOnCurrentContext(this);分析:Java在实例化构造时会调用默认父类无参构造方法,而Spring就是通过这一点,让操作元素代码执行的。2) 通过注解方式的也和上述理论相似,值得注意的是注解自动装配无需完成注/setter*,查看Spring3.1.1源码注解调用顺序得出:org.springframework.we
9、b.context.support.SpringBeanAutowiringSupport#SpringBeanAutowiringSupport=org.springframework.web.context.support.SpringBeanAutowiringSupport#processInjectionBasedOnCurrentContext=org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#processInjection=org.springframework.b
10、eans.factory.annotation.lnjectionMetadata#lnjection查看inject方法源代码如下:/* Eitherthisorlink#getResourceTolnjectneedstobeoverridden.*/protectedvoidinject(Objecttarget,StringrequestingBeanName,PropertyValuespvs)throwsThrowableif(this.isField)Fieldfield=(Field)this.member;ReflectionUtils.makeAccessible(fiel
11、d);field.set(target,getResourceTolnject(target,requestingBeanName);elseif(checkPropertySkipping(pvs)return;tryMethodmethod=(Method)this.member;ReflectionUtils.makeAccessible(method);method.invoke(target,getResourceTolnject(target,requestingBeanName);catch(InvocationTargetExceptionex)throwex.getTargetException();分析:通过上述源码Spring自动装配是通过反射机制来实现的。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。