Java Annotation/Scope
1.在计算机编程语言Java中,什么是注释(Annotation)?
注释是一种可以添加到Java源代码的语法元数据或描述(注释不影响程序执行)
2.注释(Annotation)有什么作用?
(1)传递编译器指令
java(@Deprecated
,@Override
&@SuppressWarnings
)中有三个可用的内置注释,可用于向编译 器 提供某些指令。例如,@ override注释用于指示编译器注释方法是否覆盖该方法。
(2)传递构建时指令
注释可以为编译器提供编译时指令,软件构建工具可以进一步使用它来生成代码,XML文件等。
(3)传递运行时指令
我们可以定义在运行时可用的注释,我们可以使用java反射访问这些注释,并可用于在运行时向 程序提供指令。
Annotation可以用来注释类、方法、变量、参数和包,Java注释也可以嵌入和读取编译器生成的类文件,编辑器可以利用注释来检测错误和抑制警告。
3.内置注释(Built-in Annotations in Java)
@Override - 检查方法是否为覆盖。如果在其中一个父类或已实现的接口中找不到该方法,则会导致编译错误。
@Deprecated - 将方法标记为过时。如果使用该方法,则会发出编译警告。
@SuppressWarnings - 指示编译器禁止在注释参数中指定的编译时警告。
应用于其他注释的注释(Meta Annotation)
@Retention - 指定标记注释的存储方式 - 无论是仅代码,编译到类中,还是通过反射在运行时可用。
@Documented - 标记另一个注释以包含在文档中。
@Target - 标记另一个注释以限制可以应用注释的Java元素类型。
@Inherited - 标记要继承到带注释类的子类的另一个注释(默认情况下,注释不会继承到子类)
@SafeVarargs -使用泛型varargs参数抑制方法或构造函数的所有调用者的警告。@FunctionalInterface - 指定类型声明旨在成为Java 8以来的功能接口。
@Repeatable - 指定注释可以多次应用于同一声明。
4.自定义注释C
注释是使用@interface创建的,后跟注释名称。每个方法声明都定义了注释类型的元素。方法声明不能包含任何参数或throws子句。返回类型仅限于基元,字符串,类,枚举,注释和前面类型的数组。方法可以具有默认值。
1 // @Twizzle是方法toggle()的注释 2 @Twizzle 3 public void toggle() { 4 } 5 6 // 声明注释Twizzle 7 public @interface Twizzle { 8 }
注释可能包含键值对的可选列表
1 // Same as: @Edible(value = true) 2 @Edible(true) 3 Item item = new Carrot(); 4 5 public @interface Edible { 6 boolean value() default false; 7 } 8 9 @Author(first = "Oompah", last = "Loompah") 10 Book book = new Book(); 11 12 public @interface Author { 13 String first(); 14 String last(); 15 }
注释本身可以注释以指示它们可以在何时何地使用
@Retention(RetentionPolicy.RUNTIME) // 这个注解在通过反射运行时访问。 @Target({ElementType.METHOD}) // 此注解可以只适用于类的方法。 public @interface Tweezable { }
框架经常使用注释作为方便地将行为应用于用户定义的类和方法的方式,否则必须在外部源(例如XML配置文件)中或以编程方式(使用API调用)声明这些类和方法。
5.java中的Scope
(scope)范围是指变量的生命周期和可访问性,范围定义应用程序数据如何保持和共享,范围的大小取决于声明变量的位置。例如,如果变量在类的顶部声明,那么所有类方法都可以访问它。如果它在方法中声明,那么它只能在该方法中使用。
JavaServer Faces应用程序中最常用的范围如下:
-
Request(
@RequestScoped
):请求范围在Web应用程序中的单个HTTP请求期间保持不变。在类似的应用程序hello1
中,应用程序由单个请求和响应组成,bean使用请求范围。 -
Session(
@SessionScoped
):会话范围在Web应用程序中的多个HTTP请求中保持不变。当应用程序由需要维护数据的多个请求和响应组成时,bean使用会话范围。 -
Application(
@ApplicationScoped
):应用程序范围在所有用户与Web应用程序的交互中持续存在。
6.使用Managed Bean Scopes
您可以使用注释来定义bean的存储范围。您可以为bean类指定以下范围之一。
-
Application(
javax.enterprise.context.ApplicationScoped
):应用程序范围在所有用户与Web应用程序的交互中持续存在。 -
Session(
javax.enterprise.context.SessionScoped
):会话范围在Web应用程序中的多个HTTP请求中保持不变。 -
Flow(
javax.faces.flows.FlowScoped
):在用户与Web应用程序的特定流程交互期间,流程范围仍然存在。 -
Request(
javax.enterprise.context.RequestScoped
):请求范围在Web应用程序中的单个HTTP请求期间保持不变。 -
Dependent(
javax.enterprise.context.Dependent
):表示bean依赖于其他bean。
您可能希望@Dependent
在托管bean引用另一个托管bean时使用。@Dependent
如果应该仅在引用它时创建它,则第二个bean不应该在scope()中。如果将bean定义为@Dependent
,则每次引用bean时都会重新实例化bean,因此不会将其保存在任何范围内。
如果托管bean由binding
组件标记的属性引用,则应该使用请求范围定义bean。如果将bean放在会话或应用程序范围中,则bean需要采取预防措施以确保线程安全,因为 javax.faces.component.UIComponent
每个实例都依赖于在单个线程内部运行。
如果要配置允许将属性与视图关联的bean,则可以使用视图范围。在用户导航到下一个视图之前,属性将一直存在。