1.Decorators装饰器综述

  拦截器是一种强大的方法在应用程序捕捉运行方法和解耦。拦截器可以拦截任何java类型的调用. 
  这使得拦截器适合解决事务管理,安全性,以及日记记录. 
  本质上说,拦截器并不知道他们截获的实际语义事件.因此,拦截器并不是很适合和系统的业务挂钩.

  而本章的装饰器,则又不一样. 
  装饰器只截取调用某个Java接口,因此获知这个接口的所有语义连接。 
  decorator直接实现与业务语义操作,这也意味着装饰没有拦截器的通用性。 
  拦截器和修饰符,尽管在很多方面相似,是互补的。但decorator无法解决技术问题,横跨许多不同的类型。

用@Decorator标注一个bean(甚至可能是一个抽象类),这样就表明此类是装饰器.

@Decorator
public abstract class LargeTransactionDecorator implements Account {
...
}

  装饰器的装修类型实现方法,可以让他拦截他想要拦截的.

@Decorator
public abstract class LargeTransactionDecorator implements Account { @Inject @Delegate @Any Account account; @PersistenceContext EntityManager em; public void withdraw(BigDecimal amount) {
...
} public void deposit(BigDecimal amount);
...
}
}

2.拦截器综述

  拦截器的功能是定义在Java拦截器规范。

  拦截器规范定义了三种拦截点:

  1. 业务方法拦截,
  2. 生命周期回调侦听,
  3. 超时拦截(EJB)方法。

  在容器的生命周期中进行拦截

public class DependencyInjectionInterceptor {
@PostConstruct
public void injectDependencies(InvocationContext ctx) { ... }
}

  EJB超时时使用的拦截器

public class TimeoutInterceptor {

   @AroundTimeout
public Object manageTransaction(InvocationContext ctx) throws Exception { ... }
}

  在业务上,对某一个Bean的方法进行拦截

public class TransactionInterceptor {

   @AroundInvoke
public Object manageTransaction(InvocationContext ctx) throws Exception { ... }
}

  @AroundInvoke注释指定了要用作拦截器的方法,拦截器方法与被拦截的业务方法执行同一个java调用堆栈、同一个事务和安全上下文中。用@AroundInvoke注释指定的方法必须遵守以下格式:public Object XXX(javax.interceptor.InvocationContext ctx) throws Exception

3.EL/SpEL

1、EL语言(CDI与表达式语言(EL)集成,允许在JavaServer Faces页面或JavaServer Pages页面中直接使用任何组件)

  1)概述;
    EL是JSP内置的表达式语言,用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作。EL在得到某个数据时,会自动进行数据类型的转换。使用EL表达式输出数据时,如果有则输出数据,如果为null则什么也不输出。

  2)语法:
    a.EL表达式总是放在{}中,而且前边有一个$作为前缀:${}
    b.获取对象的属性值可以直接通过“对象.属性名”:${user.name};注意:这里的属性名是get和set方法对应的属性值,并不是对象中的变量名。
    c.获取对象的属性也可以通过“对象[“属性名”]”:${user["name"]}
    d.获取Map中属性时可以以直接通过属性的key:${map.key},${map[key]}
    e.在指定域中获取属性:
  在EL表达式中如果我们直接使用属性名如:${user},它将会在四个域中由小到大依次查找。
  顺序:pageScope、requestScope、sessionScope、applicationScope。也可以指定从哪个域中获取:
    ${ pageScope .user }:当前页面
    ${requestScope.user}:当前请求
    ${sessionScope.user}:当前会话
    ${sessionScope.user}:当前应用

  3)EL中包含11个隐含对象,这些对象可以在EL表达式中直接使用:
    a.pageContext,和JSP中的pageContext功能一样
    b.请求域:pageScope/requestScope/sessionScope/applicationScope
    c.请求参数,参数对象主要用于获取get或post请求中的参数:
      param:获取指定的请求参数,${param.username}
      paramValues:获取请求参数数组,如:${paramValues.sport[1]}
    d.其他:header/headerValues/initParam/cookie

  4)EL支持数学运算和逻辑运算:
    a.加减乘除:${17+5} => 22
    b.取余%或mod:${17%5} => 2
    c.比较运算符>,<,==,!=,<=,>=,eq,ne,lt,gt,le,ge:${3>5}或${3 gt 5} =>false
    d.逻辑比较 &&或and,!或not,||或or,empty:${!true} => false

2.SpEL

  1)Spring框架的表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言。SpEL 为 bean 的属性进行动态赋值提供了便利.
  2)语法:SpEL 使用 #{…} 作为定界符,所有在大框号中的字符都将被认为是 SpEL  

  3)运用范围:

    a. 对 bean 进行引用,调用属性值:#{book.name}
    b.调用方法以及引用对象中的属性
      引用方法:#{dog.run()},引用静态方法:#{T(java.lang.Math).PI}
      引用对象的属性:#{user.name}
    c.计算表达式的值
      加减乘除:#{counter.total + 40},#{T(java.lang.Math).PI * 2}
      加号作为字符串连接符:#{user.name + ' ' + user.address}
      比较运算符(>,<,=,>=,<=,==,lt,gt,eq,le,ge):#{counter.total == 100},#{counter.total le 1000}
      if-else条件判断,三元运算符:#{user.name=='Tom' ? 'Jess'}
    d.正则表达式的匹配(matches)   #{user.name matches '^[a-zA-Z0-9_-]{4,16}$'}
    e.字面量的表示:#{5},#{89.7},#{1e4},#{false}

可使用单/双引号作为字符串表达符号:#{'Chuck'},#{"Chuck"}

4.Eventmodel

Cdi中的event事件,是整个CDI的精华所在之一.其有点类似设计模式中的观察者模式.但也有不同的地方.如下3点:

  1. 不仅是生产者(producers)从观察者(observers)解耦.观察者也从生产者解耦.
  2. 观察者可以指定“选择器”的组合来缩小的事件通知
  3. 观察者可以立即通知,或者可以指定交付的事件应该推迟到当前事务的结束。

即用一种维护生产者和观察者之间的分离代码的方式,来产生和订阅(即观察)在应用程序中发生的事件。使用 javax.enterprise.event.Event 类创建事件,并使用 CDI 的 @Observes 标注订阅处理事件。

CDI Services *Decoretions *Intercepters * Scope * EL\(Sp EL) *Eventmodel的更多相关文章

  1. CDI services--Scope(生命周期)&&EL.(Sp El)

    一.EL/SpEL 1.EL语言(CDI与表达式语言(EL)集成,允许在JavaServer Faces页面或JavaServer Pages页面中直接使用任何组件) 1)概述:EL是JSP内置的表达 ...

  2. Spring Boot实战笔记(二)-- Spring常用配置(Scope、Spring EL和资源调用)

    一.Bean的Scope Scope描述的是Spring容器如何新建Bean实例的.Spring的Scope有以下几种,通过@Scope注解来实现. (1)Singleton:一个Spring容器中只 ...

  3. 11 JSP/EL表达式/EL函数

    JSP      * 概述: JSP(Java Server Pages)与Java Servlet一样,是在服务器端执行的不同的是先由服务器编译部署成Servlet执行      * JSP的运行原 ...

  4. jsp web JavaBean MVC 架构 EL表达式 EL函数 JSTL

     一.JavaBean概念(非常重要) 1.JavaBean就是遵循一定书写规范的Java类型(开发中:封装数据) a.必须有默认的构造方法,类必须是public的   public class  ...

  5. 【JSP EL】EL表达式获取当前时间(两种方式)

    第一种方式: //先在代码段定义<% long date = new Date().getTime(); request.setAttribute("date", date) ...

  6. EL表达式 EL函数 自定义el函数 《黑马程序员_超全面的JavaWeb视频教程vedio》

    \JavaWeb视频教程_day12_自定义标签JSTL标签库,java web之设计模式\day12_avi\12.EL入门.avi; EL表达式 1. EL是JSP内置的表达式语言! * jsp2 ...

  7. 【JSP EL】EL表达式里日期按照格式显示

    转:http://blog.csdn.net/kaishuaige/article/details/8505174 JSP页面用EL表达式 输出date格式     1.头上引入标签 <%@ t ...

  8. 【JSP EL】el表达式判断是否为null

    后台程序放入Model中,从前台el表达式取出来非常方便,但是如果需要处理 当数据为null的时候,怎么办,不为null的时候,怎么办:这个怎么处理呢? <span class="us ...

  9. CDI Features(EL(SPEL),Decorator,Interceptor,Producer)

    一.EL(SPEL) EL 1.概述:EL是JSP内置的表达式语言,用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作.EL在得到某个数据时,会自动进行数据类型 ...

随机推荐

  1. BZOJ 2157: 旅游 (2017.7.21 6:30-2017.7.21 15:38 今日第一题。。)

    Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1754  Solved: 765 Description Ray 乐忠于旅游,这次他来到了T 城.T ...

  2. 介绍三款大前端UI框架

    一.蚂蚁金服团队推出的基于React antd (全名:ant.design) 友情跳链:https://ant.design/index-cn:使用antd模板:https://pro.ant.de ...

  3. python笔记_magic变量和函数

    前言 先扯一点背景知识 PEP8(Python Enhancement Proposal)是一份python的编码规范,链接:http://www.python.org/dev/peps/pep-00 ...

  4. H5里div多行显示省略号

    display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: ; overflow: hidden; -webkit- ...

  5. ideal取消按下两次shift弹出搜索框 修改idea,webstrom,phpstrom 快捷键double shift 弹出search everywhere

    因为经常需要在中英文之间切换,所以时常使用shift键,一不小心就把这个Searchwhere 对话框调出来了,很是麻烦. 因此痛定思痛, 我决定将这个按两下shift键就弹出搜索框的快捷键禁用了! ...

  6. 雷林鹏分享:Lua 基本语法

    Lua 学习起来非常简单,我们可以创建第一个 Lua 程序! 第一个 Lua 程序 交互式编程 Lua 提供了交互式编程模式.我们可以在命令行中输入程序并立即查看效果. Lua 交互式编程模式可以通过 ...

  7. 安装Yii2提示Failed to decode response: zlib_decode(): data error错误解决方法

    如果是根据官方文档来安装(composer create-project --prefer-dist yiisoft/yii2-app-basic basic),并提示此错误的话,那么请做: 1. 请 ...

  8. java读取配置文件的推荐方法getResource、getResourceAsStream

    在java开发中经常会读取配置文件,如果把文件路径写死,就太LOW了,也不符合编码规范. 在网上找了一些资料后,发现有两种方法:xxx.class.getResource("")  ...

  9. kvm客户机存储方式

    前面介绍了存储的配置和qemu-img工具来管理镜像,在QEMU/KVM中,客户机镜像文件可以由很多种方式来构建,其中几种如下: 1) 本地存储的客户机镜像文件. 2) 物理磁盘或磁盘分区. 3) L ...

  10. 比特币 3角对冲python代码

    3角对冲原理 基础货币 base, 兑换货币 quote, 中间货币 mid. 市场分为3个市场 p3: base_quote p2: quote_mid p1: quote_mid 代码逻辑 1, ...