java与java ee
历史
我认为重要的是要看一下Java EE中Interceptor的发展,因为它是从EJB特定的项目开始的,后来又演变成一个单独的规范,现在可供其他Java EE规范扩展,这一事实很简单。
版本1.0
拦截器最初是在EJB 3.0 ( Java EE 5的一部分)中引入的。 拦截器没有专门的规范,但是它们的版本为1.0,并通过简单的注释向托管Bean(POJO)购买了与AOP相关的基本功能:
- @AroundInvoke –注释包含目标类方法的拦截逻辑的方法
- @Intercerptors –将拦截器类与其目标类/方法绑定在一起
- 通过部署描述符为整个模块(EJB JAR)配置拦截器的能力
- @ExcludeDefaultInterceptors –使部署描述符中定义的默认拦截器静音
- @ExcludeClassInterceptors –使类的特定方法/构造函数的全局定义(类级别)拦截器静音
拦截器1.1
随之而来的是带有EJB 3.1的 Java EE 6 –拦截器1.1仍包含在EJB规范文档中:
- @InterceptorBinding –一种指定类或方法的拦截器的类型安全方法。 请注意,此注释由CDI 1.0 (Java EE 6中引入的另一个规范)所利用,并且其详细信息位于CDI 1.0规范文档中,而不是EJB 3.1中 (至少对我来说是灯泡时刻)。
- @Interceptor –用于在特定方法中显式声明一个包含拦截逻辑的类(用@AroundInvoke注释)作为拦截器以及适当的Interceptor Binding。 仅在CDI 1.0文档中也提到了这一点。
- @AroundTimeout –用于拦截EJB计时器的超时以及获得被拦截的Timer实例的方式(通过javax.interceptor.InvocationContext.getTimer() )
拦截器1.2
拦截器在Java EE 7中被拆分成单独的规范,因此拦截器1.2应运而生:
- 拦截器1.2是1.1的维护版本,因此JSR编号仍然与EJB 3.1( JSR 318 )相同。
- Interceptor.Priority (静态类)–提供定义拦截器需要被调用的顺序(优先级)的能力。
- @AroundConstruct –用于拦截目标类的构造,即在调用目标类的构造函数之前先调用逻辑
重要的是要记住,拦截器通常适用于托管bean。 托管Bean本身是简单的POJO,容器已将其授予基本服务–拦截器是其中之一,包括生命周期回调,资源注入。
记忆辅助
将Interceptor视为可以在其整个生命周期中插入到bean的组件是有帮助的:
- 在构建它们之前– @AroundConstruct
- 构造之后– @PostConstruct
- 在他们的生命中(方法调用)– @AroundInvoke
- 销毁之前– @PreDestroy
- EJB超时– @AroundTimeout
让我们更详细地了解拦截器的一些特征,并尝试回答以下问题:
- 它们在哪里应用,它们拦截了什么?
- 如何将拦截器绑定到应该拦截的目标(类)?
拦截器类型(基于拦截的组件)
方法拦截器
- 由@AroundInvoke实现
- 包含逻辑的方法可以是单独类的一部分,也可以是目标类(要拦截的类)本身的一部分。
生命周期回调拦截器
- 用@AroundConstruct装饰方法,以拦截类的构造函数调用
- 用@AroundConstruct注释的方法不能是所拦截类的一部分。 必须使用单独的Interceptor类定义它
- 在方法上使用@PostConstruct批注,以拦截托管bean上的回调方法。 再次说明一下-拦截器规范并未这样定义新的注释。 需要在拦截器方法上重用@PostConstruct( 公共注释规范的一部分 )。
- @PreDestroy (在Common Annotations规范中定义的另一个回调注解)注解以类似的方式使用
超时拦截器
- 如上所述, @ AroundTimeout用于拦截EJB计时器的超时以及获取被拦截的Timer实例的方式(通过javax.interceptor.InvocationContext.getTimer() )
应用/绑定拦截器
使用@Interceptors
- 如以上示例所示–只需使用@Interceptors批注指定拦截器类
- @Interceptor可以在类级别上应用(自动适用于类的所有方法),如果使用@AroundConstruct进行特定于构造函数的拦截器,则可以应用于特定方法或多个方法和构造函数
使用@IntercerptorBinding
- 拦截器绑定(如上所述)–使用@IntercerptorBinding批注定义一个绑定批注,该批注在侦听器类和目标类中将进一步使用(需要拦截其方法,构造函数等)
部署描述符
人们还可以使用部署描述符以明确的方式以及以覆盖模式将注释器和目标类绑定到注释。
这是Java EE拦截器的快速概述。 希望您找到更深层次的正确触发!
翻译自: https://www.javacodegeeks.com/2015/01/java-ee-interceptors.html
java与java ee