




已阅读5页,还剩78页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
_Annotation学习这里annotation学习包括 j2se 5.0里的注解学习和spring 注解配置详解和hibernate 注解配置详解,目的是使项目实现零配置.J2se 5.0 annotationAnnotation究竟是什么?Annotation提供了一条与程序元素关联任何信息或者任何元数据(metadate)的途径.从某些方面看,annotation就像修饰符一样被使用,并应用于包、类型、构造方法、方法、成员变量、参数、本地变量的声明中.这些信息被存储在annotation的”name=value”结构对中.annotation类型是一种接口,能够通过java反射API的方式提供对其信息的访问。Annotation能被用来为某个程序元素(类、方法、成员变量等)关联任何的信息。需要注意的是,这里存在着一个基本的潜规则:annotation不能影响程序代码的执行,无论增加、删除annotation,代码都始终如一的执行.另外,尽管一些annotation通过java的反射API方法在运行时被访问,而java语言解释器在工作时忽略了这些annotation.正是由于java虚拟机忽略了annotation,导致了annotation类型在代码中是不起作用的.本文将会涵盖标准的 annotation和meta-annotation类型,陪伴这些annotation类型的工具是jav a编译器(当然要以某种特殊的方式处理它们)。由于上述原因,annotation在使用时十分简单。一个本地变量可以被一个以NonNull命名的annotation类型所标注, 来作为对这个本地变量不能被赋予null值的断言。而我们可以编写与之配套的一个annotation代码分析工具,使用它来对具有前面变量的代码进行解析,并且尝试验证这个断言。当然这些代码并不必自己编写。在JDK安装后,在JDK/bin目录中可以找到名为“apt”的工具,它提供了处理annotation的框架:它启动后扫描源代码中的annotation,并调用我们定义好的annotation处理器完成我们所要完成的工作(比如验证前面例子中的断言)。说到这里,annotation的强大功能似乎可以替代XDoclet这类的工具了,随着我们的深入,大家会更加坚信这一点。注:详细描述请参看jsr250规范:/aboutJava/communityprocess/pfd/jsr250/Annotation的定义这段文字开始介绍annotation相关技术。将会看到 java5.0的标准annotation类型,这种标准类型就是前文中所说的“内建”类型,它们可以直接被javac支持。可喜的是,在java6.0beta版中的javac已经加入了对自定义annotation的支持。Annotation的概念和语法首先,关键的概念是理解annotation是与一个程序元素相关联信息或者元数据的标注。它从不影响java程序的执行,但是对例如编译器警告或者像文档生成器等辅助工具产生影响。下面是常用的annotation列表,我们应该注意在annotation和annotation类型之间的不同:A. annotation:annotation使用了在java5.0所带来的新语法,它的行为十分类似public、final这样的修饰符。每个annotation具有一个名字和成员个数=0。每个annotation的成员具有被称为name=value对的名字和值(就像javabean一样),name=value装载了annotation的信息。B. annotation类型:annotation类型定义了annotation的名字、类型、成员默认值。一个annotation类型可以说是一个特殊的java接口,它的成员变量是受限制的,而声明annotation类型时需要使用新语法。当我们通过java反射api访问annotation时,返回值将是一个实现了该annotation类型接口的对象,通过访问这个对象我们能方便的访问到其annotation成员。后面的章节将提到在java5.0的java.lang包里包含的3个标准annotation类型。C. annotation成员:annotation的成员在annotation类型中以无参数的方法的形式被声明。其方法名和返回值定义了该成员的名字和类型。在此有一个特定的默认语法:允许声明任何annotation成员的默认值:一个annotation可以将name=value对作为没有定义默认值的annotation成员的值,当然也可以使用name=value对来覆盖其它成员默认值。这一点有些近似类的继承特性,父类的构造函数可以作为子类的默认构造函数,但是也可以被子类覆盖D. marker annotation类型:一个没有成员定义的annotation类型被称为marker annotation。这种annotation类型仅使用自身的存在与否来为我们提供信息。如后面要说的OverrideE. meta-annotation:meta-annotation也称为元annotation,它是被用来声明annotation类型的annotation。Java5.0提供了一些标准的元-annotation类型。下面介绍的target、retention就是meta-annotation。F. target:annotation的target是一个被标注的程序元素。target说明了annotation所修饰的对象范围:annotation可被用于packages、types(类、接口、枚举、annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在annotation类型的声明中使用了target可更加明晰其修饰的目标。G. retention:annotation的retention定义了该annotation被保留的时间长短:某些annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为annotation与class在使用上是被分离的)。使用这个meta-annotation可以对annotation的“生命周期”限制。H. metadata:由于metadata被广泛使用于各种计算机开发过程中,所以当我们在这里谈论的metadata即元数据通常指被annotation装载的信息或者annotation本身。使用标准Annotation:java5.0在java.lang包中定义了3种标准的annotation类型:A. Override:Java.lang.Override是一个marker annotation类型,它被用作标注方法.它说明了标注的方法重载了父类的方法,起到了断言的作用.如果我们使用了这种annotation 在一个没有覆盖父类的方法时,java 编译器将以一个编译错误警示。这个annotation 常常在我们试图覆盖父类方法而又写错了方法名时发挥威力.使用方法极其简单,在使用此 annotation时只要在被修饰的方法前面加上override。下面的代码是一个使用Override修饰的企图重载父类的 toString方法, 而又存在拼写错误的例子Overridepublic String toSting() / 注意方法名拼写错了return + super.toString() + ;B. Deprecated:同样Deprecated也是一个marker annotation.当一个类型或者类型成员使用Deprecated修饰的话,编译器将不鼓励使用这个被标注的程序元素.而且这种修饰符具有一定的延续性;如果我们在代码中通过继承或者覆盖的方式使用了这个过时的类型或者成员,虽然继承或者覆盖后的类型或者成员并不是被声明为Deprecated,但编译器仍然要报警。值的注意,Deprecated这个annotation类型和javadoc中的deprecated这个tag 是有区别的:前者是java编译器识别的,而后者是被javadoc工具所识别用来生成文档。在java5.0,我们应该用Deprecated修饰过时的方法.下面是一段使用Deprecated的代码/*这里是javadoc的deprecated声明deprecated no one has players for this format any more .*/Deprecated public class Betamax(.)C. SuppressWarnings:SuppressWarnings 被用于有选择的关闭编译器,对类、方法、成员变量、变量初始化的警告。在java5.0,sun提供的javac编译器为我们提供了-Xlint选项来使编译器对合法的程序代码提出警告,此种警告从某种程度上代表了程序错误。例如当我们使用一个generic collection类而又没有提供它的类型时,编译器将提示出 unchecked warning的警告.通常当这种情况发生时,我们就需要查找引起警告的代码。如果它真的表示错误,我们就需要矫正它。例如如果警告信息表明我们代码中的switch语句没有覆盖所有可能的case,那么我们就应增加一个默认的case来避免这种警告.相仿,有时我们无法避免这种警告,例如,我们使用必须和非generic的旧代码交互的generic collection类时,我们不能避免这个unchecked warning。此时SuppressWarning就要派上用场了,在调用的方法前增加SuppressWarnings修饰,告诉编译器停止对此方法的警告。SuppressWarning不是一个marker annotation。它有一个类型为String的成员,这个成员的值为被禁止的警告名。对于javac编译器来讲,被-Xlint选项有效的警告名也同样对SuppressWarings有效,同时编译器忽略掉无法识别的警告名。annotation语法允许在annotation名后跟括号,括号中是使用逗号分割的name=value对用于为annotation的成员赋值:SuppressWarnings(value=unchecked,fallthrough)public void lintTrap() /* sloppy method body omitted */ 在这个例子中SuppressWarnings annotation类型只定义了一个单一的成员,所以只有一个简单的value=.作为name=value对。又由于成员值是一个数组,故使用大括号来声明数组值。注意:我们可以在下面的情况中缩写annotation:当annotation只有单一成员,并成员命名为value=。这时可以省去value=。比如将上面的SuppressWarnings annotation进行缩写SuppressWarnings(unchecked,fallthrough)如果SuppressWarnings所声明的被禁止警告个数为一个时,可以省去大括号:SuppressWarnings(unchecked)Annotation语法:Annotation由+annotation类型名称+(.逗号分割的name-value对.)组成。其中成员可以按照任何的顺序.如果annotation类型定义了某个成员的默认值,则这个成员可以被省略。成员值必须为编译时常量、内嵌的annotation或者数组。下面我们将定义一个 annotation类型名为Reviews,它有一个由Review annotation 数组构成的成员。这个Review annotation类型有三个成员:reviewer是一个字符串,comment是一个具有默认值的可选的字符串,grade是一个review.Grade枚举类型值。Reviews( Review(grade=Review.Grade.Excellent,reviewer=”df”), Review(grade=Review.Grade.Unsatisfactory,reviewer=”eg”,comment=” this method needs an annotation ”)annotation语法的另一个重要规则是没有程序成员可以有多于一个的同一annotation实例。例如在一个类中简单的放置多个Review annotation。这也是在上面代码中定义Reviews annotation类型数组的原因Annotation成员类型和值Annotation成员必须是非空的编译时常量表达式.可用的成员类型有:primtive类型、string,Class,enumerated类型,annotation 类型,和前面类型的数组.下面我们定义了一个名为UncheckedExceptions 的annotation类型,它的成员是一个扩展了RuntimeException类的类数组。UncheckedExceptons(IllegalArgumentException.class,StringIndexOutOfBoundsException.class)Annotation的目标:Annotation通常被放在类型定义和成员定义的前面。然而它也出现在package、方法参数、本地变量的前面。下面,我们来讨论一下这些不大常用的写法:Package annotation出现在package 声明的前面。下面的例子package-info.java中不包含任何的公共类型定义,却包含一个可选的javadoc 注释./*This package holds my custom annotation types*/com.davidflanagan.annotations.Author(“David Flanagan”)Package com.davidflanagan.annotations当package-info.java文件被编译时,它将产生名为包含annotation(特殊的接口)声明的package-info.class的类。这个接口没有成员,它的名字package-info不是一个合法的java标识,所以它不能用在java源代码中。这个接口的存在只是简单的被看作一个为package annotation准备的占位符。用于修饰方法参数、catch参数、本地变量的annotation只是简单的出现在这些程序成员的修饰符位置。java类文件格式没有为本地变量或者catch参数存储annotation作准备,所以这些annotation总是保留在源代码级别(source retention);方法参数annotation能够保存在类文件中,也可以在保留到运行时。最后,请注意,枚举类型定义中不允许任何的修饰符修饰其枚举值。Annotation和默认值在Annotation中,没有默认值的成员必须有一个成员值。而如何理解默认值是如果被处理就是一个很重要的细节:annotation类型所定义的成员默认值被存储在class文件中,不被编译到annotation里面.如果我们修改一个annotation类型使其成员的默认值发生了改变,这个改变对于所有此类型的annotation中没有明确提供成员值的成员产生影响。即使在annotation类型使其成员的默认值被改变后annotation 从没有被重新编译过,该类型的annotation也受到影响。Annotation工作原理Annotation与反射在java5.0 中java.lang.reflect提供的反射API被扩充了读取运行时annotation的能力。我们知道一个annotation类型被定义为runtime retention后,它才是在运行时可见,当class文件被装载时,被保存在class文件中的 annotation才会被虚拟机读取。那么reflect 是如何帮助我们访问class中的annotation呢?下文将在java.lang.reflect用于annotation的新特性,其中java.lang.reflet.AnnotatedElement是重要的接口,它代表了提供查询annotation能力的程序成员。这个接口被java.lang.package、java.lang.Class实现,并间接地被Method类、Constructor类、java.lang.reflect的Field类实现。而annotation中的方法参数可以通过Method类、Constructor类的getParameterAnnotations()方法获得。下面的代码使用了AnnotatedElement类的isAnnotationPresent()方法判断某个方法是否具有Unstable annotation,从而断言此方法是否稳定Import java.lang.reflect.*;Class c = WhizzBangClass.class;Method m = c.getMethod(“whizzy”,int.class,int.class);Boolean unstable = m.isAnnotationPresent(Unstable.class);isAnnotationPresent()方法对于检查marker annotation是十分有用的,因为marker annotation没有成员变量,所以我们只要知道class的方法是否使用了annotation修饰就可以了。而当处理具有成员的annotation时,我们通过使用getAnnotation()方法来获得annotation的成员信息(成员名称、成员值)。这里我们看到了一套优美的java annotation系统:如果annotation存在,那么实现了相应的annotation类型接口的对象将被getAnnotation()方法返回,接着调用定义在annotation类型中的成员方法可以方便地获得任何成员值。回想一下,前面介绍的Reviews annotation,如果这个annotation类型被声明为runtime retention的话,我们通过下面的代码来访问Reviews annotation的成员值:AnnotatedElement target = WhizzBangClass.class;/查询 AnnotatedElement的Reviews annotation信息Reviews annotation = target.getAnnotation(Reviews.class);/因为Reviews annotation类型的成员为Review annotation类型的数组/所以下面声明了Review reviews保存Reviews annotation类型的value成员值Review reviews = annotation.value();/查询每个Review annotation 的成员信息For(Review r:reviews)Review.Grade grade = r.grade();String reviewer = r.reviewer();String comment = ment();System.out.printf();如何自定义Annotation?详解annotation与接口的异同:因为annotation类型是一个非凡的接口,所以两者之间存在着某些差异:A:Annotation类型使用关键字interface而不是interface.这个关键字声明隐含了一个信息;它是继承了java.lang.annotation.Annotation接口,并发声明了一个interface.B:Annotation类型、方法定义是独特、受限制的。 Annotation类型的方法必须声明为无参数、无异常抛出的。这些方法定义了annotation的成员:方法名成为了成员名,而方法返回值成为了成员的类型。而方法返回值类型必须为primitive类型、class类型、枚举类型、annotation类型或者由前面类型之一作为元素的一维数组。方法的后面可以使用default和一个默认值来声明成员的默认值,null不能作为成员默认值,这与我们在非annotation类型中定义方法有很大的不同。Annotation 类型和它的方法不能使用annotation类型的参数、成员不能是generic.之一返回值类型是Class的方法可以再annotation类型中使用generic,因为此方法能够用类转换将各种类型转换为Class。C.Annotation类型又与接口有着近似之处。它们可以定义常量、静态成员类型(比如枚举类型定义)。Annotation类型也可以如接口一般被实现或者继承。下面,我们将看到如何定义annotation类型的example。它展示了annotation类型声明以及interface与interface之间的不同:Package com.wyjun.annotationsImport java.lang.annotation.*;/*使用annotation来描述那些被标注的成员是不稳定的,需要更改*/Retention(RetentionPolicy.RUNTIME)Public interface Unstable下面的另一个example只定义了一个成员。并通过将这个成员命名为value,使我们可以方便的使用这种annotation的快捷声明方式:/* * 使用Author这个annotation定义在程序中指出代码的作者 */public interface Author /* 返回作者名 */String value();以下的example更加复杂。Reviews annotation类型只有一个成员,但是这个成员的类型是复杂的:由Review annotation组成的数组。Review annotation类型有3个成员:枚举类型成员grade、表示Review名称的字符串类型成员Reviewer、具有默认值的字符串类型成员Comment。import java.lang.annotation.*;/* * Reviews annotation类型只有一个成员, * 但是这个成员的类型是复杂的:由Review annotation组成的数组 */Retention(RetentionPolicy.RUNTIME)public interface Reviews Review value();/* Review annotation类型有3个成员: * 枚举类型成员grade、* 表示Review名称的字符串类型成员Reviewer、* 具有默认值的字符串类型成员Comment。 */public interface Review / 内嵌的枚举类型public static enum Grade EXCELLENT, SATISFACTORY, UNSATISFACTORY ;/ 下面的方法定义了annotation的成员Grade grade();String reviewer();String comment() default ;最后,我们来定义一个annotation方法用于罗列出类运行中所有的unchecked异常(上文已经提到这种情况不一定是错误)。这个annotation类型将一个数组作为了唯一的成员。数组中的每个元素都是异常类。为了加强对未检查的异常(此类异常都是在运行时抛出)进行报告,我们可以在代码中对异常的类型进行限制:public interface UncheckedExceptions Class value();Meta-AnnotationAnnotation类型可以被它们自己所标注。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它annotation类型作说明。这些类型和它们所支持的类在java.lang.annotation包中可以找到。如果需要更详细的信息可以参考jdk5.0手册1 再谈Target作为meta-annotation类型的Target,它描述了annotation所修饰的程序成员的类型。当一个annotation类型没有Target时,它将被作为普通的annotation看待。当将它修饰一个特定的程序成员时,它将发挥其应用的作用,例如:Override用于修饰方法时,增加了Target这个meta-annotation就使编译器对annotation作检查,从而去掉修饰错误类型的Override。Target meta-annotation类型有唯一的value作为成员。这个成员的类型是java.lang.annotation.ElementType类型的,ElementType类型是可以被标注的程序成员的枚举类型。2 Retention的用法我们在文章的开头曾经提到过Retention,但是没有详细讲解。Retention描述了annotation是否被编译器丢弃或者保留在class文件;如果保留在class文件中,是否在class文件被装载时被虚拟机读取。默认情况下,annotation被保存在class文件中,但在运行时并不能被反射访问。Retention具有三个取值:source、class、runtime,这些取值来自java.lang.annotation.RetentionPolicy的枚举类型值。Retention meta-annotation类型有唯一的value作为成员,它的取值来自java.lang.annotation.RetentionPolicy的枚举类型值。3 DocumentedDocumented是一个meta-annotation类型,用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个marker annotation,没有成员。4 InheritedInherited meta-annotation也是一个marker annotation,它阐述了某个被标注的类型是被继承的。如果一个使用了Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。注意:Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。值得思考的是,当Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。J2se 泛型详解泛型是从javase5.0开始引入的一个新特性,目的:在开发中使用泛型技术可以减少出错的机会、及早发现错误、降低代码量,使程序具有更好的安全性和可读性。泛型类或接口的声明泛型类声明时与普通类没有太大的区别,只是在类声明中加入了一个或多个类型变量的声明,下面是基本语法。Public class 类名类体注意:类型变量可以使用任何符合java命名规则的标识符,但为了方便通常都采用单个的大写字母。例如:用E表示集合元素的类型,用K与V分别表示键值对中的键类型与值类型,而用T,U,S 表示任意类型。泛型类的类型变量同时可以有多个,类型变量之间使用逗号分割,如同方法参数一样。类体中声明的方法可以使用这些类型变量作为类型,这样在调用泛型类时类型就是可以动态指点了。如下例子:/自定义泛型类Class Myvalue/定义两个由类型变量指定类型的成员变量Private T value1;Private U value2;/定义两个成员变量的set方法,其参数类型由类型变量确定Public void setValue(T newvalue1,U newValue2)this.value1 = newvalue1;This.value2=newvalue2;/value1成员变量的get方法Public T getValue1()return this.value1;使用 :MyValue mav = new Myvalue();注意:这里定义了一个泛型类,其具体类型只有在使用时指定。而不必像原来在开发时就确定。同时也避免了使用Object类型来代替所有类型时很多的强制类型转换。简化了开发,提高了效率。泛型方法的开发泛型方法的基本语法:Public static 返回类型 方法名(参数列表)方法体对于泛型方法来说,即可以在普通类中定义,也可以再泛型类中定义。可以看出,比泛型类的使用更加灵活。声明在返回类型之前。下面是简单案例:Public class Sampel/自定义泛型方法Public static T getLast(T a)/返回指定类型数组的最后一个元素Return aa.length-1;使用:String laststr = Sampel.getlast(str);注意:在实际开发中,泛型方法一般以静态方法居多,因为静态方法属于类,不能在创建对象时再通过类型参数指定类型。类型变量的限制这个主要是解决对类型变量的限制.类型变量的类型有一定的范围而不是任意类型,这就需要使用类型变量的限制。基本语法:类型变量 extends 限定类型序列注意:限定类型序列 表示类型变量实际可以指定的类型范围.限定类型序列 中可以有多个类型,这些类型可以是类也可以是接口,多个类型之间使用“&”分隔.表示同时满足的意思。限定类型序列 中只能有一个类,但可以有多个接口,因为一个特定的类型只能继承自一个类但可以实现多个接口。另外,如果限定类型序列中有类则类必须放在第一个。如:/定义泛型类,并对类型参数进行限定Class MyValue 泛型参数的继承以及通配符泛型参数的继承问题ArrayList as = new arrayList();ArrayList ao = null;Ao = as;上面的程序会报 “不兼容的类型”错误,这是因为,直观的感觉ArrayList 可以看做ArrayList ,其实不行。由于ArrayList 列表可以放入任何的对象,而ArrayList中只能放入字符串.ArrayList 不能当做ArrayList使用.因此总结出,若A是B的子类,则G 可以当做G使用并不成立,如果达到这样的效果则需要使用泛型通配符。泛型通配符要解决上面的问题就可以使用泛型通配符?例:Public static void printMyValue(ArrayList mv)表示可以接收任何具体类型的泛型。泛型通配符使用的特殊注意:泛型通配符只能用于引用的声明中,不可以在创建对象时使用。不可以使用采用了泛型通配符的引用调用使用了泛型参数的方法。MyValue mvs = new MyValue();上面会报错有限制的通配符 语法:? extends 类名或接口名上述的语法表示通配符能够匹配的类型必须是指定类及其子类或指定接口及其子接口。泛型的擦除为了保证源代码的兼容性,也就是原来没有使用泛型的源代码一样可以在新版的java中编译与运行。系统提供了泛型自动擦除的能力。擦除的基本概念与规则所谓泛型的自动擦除是指:如果在调用一个声明了泛型参数的类时不给出泛型参数的类型,系统会自动按照一定的规则来设置泛型参数的类型,这就称为泛型的擦除。具体的擦除规则如下:若泛型参数没有限定范围,则系统自动使用Object类设置泛型参数的类型。若泛型参数有限定范围,则使用限定的最宽类型来设置泛型参数的类型。擦除引出的约束与局限性下面是擦除引起的一些限制1:基本类型需要特别注意,类型参数可以指定的类型中不包括基本类型,因此没有My Value 只有 My Value .这是由于当实施擦除后,MyValue类的成员将具有Ojbect类型的成员变量,而Object不能直接存储 double值,对于其它几种基本类型同样如此,在使用时需要通过封装来进行处理。2:静态类型不能在静态成员中使用类型变量,例如下面的代码将无法编译Public class MyClasspublic static T getValue()这是由于类型变量实际代表的类型要到创建对象时才会给出,而静态方法只要类加载之后就可以调用了。3:数组不能在数组声明中使用泛型,例如下面的代码是不能通过编译的Myvalue mv = new Myvalue10;4:泛型的 instanceof检查请特别注意,对泛型类型进行的 instanceof 检查实际上只对不包括泛型的部分进行检查。Spring配置详解Spring 支持两种方式来描述bean和bean间的依赖关系,这两种方式是:xml,annotation.Xml配置Xml配置元数据的结构将xml配置文件拆分成多个部分是非常有用的。为了加载多个xml文件生成一个ApplicationContext实例,可以将文件路径作为字符串数组传给ApplicationContext 构造器。而BeanFactory将通过调用bean definition reader从多个文件中读取bean 定义。通常情况下,spring团队倾向于上述做法,因为这样各个配置并不会察觉到它们与其它配置文件的组合。另一种方法是使用一个或多个的元素来从另外一个或多个文件加载bean 定义。所有的 元素必须在元素之前完成bean 定义的导入Bean的命名Bean命名约定:Bean的命名采用标准的java命名约定,即小写字母开头,首字母大写间隔的命名方式。对bean 采用统一的命名约定将会使配置更加简单易懂。而且在使用spring aop 时,如果要发通知给与一组名称相关的bean时,这种简单的命名方式将会令你受益匪浅。当使用基于xml的配置元数据时,将通过id或name属性来指定bean标识符。Id属性具有唯一性。值的注意的是:为一个bean提供一个name 并不是必须的,如果没有指定,那么容器将为其生成一个唯一的name.对于不指定name属性的原因我们在后面介绍(比如 内部bean就不需要)。Bean的别名定义fromName bean的别名为toName.用构造器来实例化当采用构造器来创建bean实例时,Spring对class并没有特殊的要求,我们通常使用的class都适用。也就是说,被创建的类并不需要实现任何特定的接口,或以特定的方式编码,只要指定bean的class属性即可。不过根据采用的Ioc类型,class可能需要一个默认的空构造器。此外,IOC容器不仅限于管理javabean,它可以管理任意的类。不过大多数使用spring 的人喜欢使用时间的javaBean构造器及setter和getter方法.如:给构造函数指定参数以及为bean实例设置属性将在后面部分谈到。使用静态工厂方法实例化当采用静态工厂方法创建bean时,除了需要指定class属性外,还需要通过factory-method属性来指定创建bean实例的工厂方法.spring将调用此方法(其可选参数接下来介绍)返回实例对象,就此而言,跟通过普通构造器创建类实例没有什么两样。下面的bean定义展示了如何通过工厂方法来创建bean实例。注意,此定义并未指定返回对象的类型,仅指定该类包含的工厂方法。在此实例中,createInstance()必须是一个static方法。给工厂方法指定参数已经为bean实例设置属性将在随后的部分谈及。使用实例工厂实例化 与使用静态工厂方法实例化类似,用来进行实例化的非静态实例工厂方法位于另外的一个bean中,容器将调用该bean的工厂方法来创建一个新的bean实例.为使用此机制,class属性必须为空,而factory-bean属性必须指定为当前容器中包含工厂方法的bean名称,而该工厂bean的工厂方法本身必须通过factory-method 属性来设定。!inject any dependencies required by this locator bean !the bean to be created via the factory bean -注入依赖依赖注入(DI)背后的基本原理是对象之间的依赖关系只会通过以下几种方式来实现:构造器的参数、工厂方法的参数、或给由构造函数或者工厂方法创建的对象设置属性。因此,容器的工作就是创建bean时注入那些依赖关系。相对于由be
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年服装行业虚拟试衣技术应用前景研究报告
- 2025年科技创新行业人工智能技术应用前景分析研究报告
- 2025年通信行业5G网络应用前景研究报告
- 2025年医疗器械行业创新医疗器械产品市场前景预测报告
- 2025年文化娱乐行业虚拟现实技术应用前景探讨报告
- 2025年云计算行业云计算技术与应用前景展望报告
- 2025年战略咨询行业全球经济形势与发展前景展望研究报告
- 商场全体安全培训内容课件
- 国家事业单位招聘2025中国农业科学院生物技术研究所第一批招聘笔试笔试历年参考题库附带答案详解
- 预定租房合同(新标准版)5篇
- 2025心肺复苏课件
- 2025年资源共享授权合同
- 信息安全管理制度
- 社交心理在网络营销中的实战运用
- 2025年少先队应知应会知识考试题库
- 2025年宁波农商发展集团限公司招聘高频重点提升(共500题)附带答案详解
- 蜀道集团招聘笔试
- 历年全国普通话考试真题50套
- 2024年社区警务规范考试题库
- 农业测绘技术服务方案
- 2025年上海市高考语文专项复习:识记背诵默写
评论
0/150
提交评论