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 {@PostConstructpublic void injectDependencies(InvocationContext ctx) { ... }
}

  EJB超时时使用的拦截器

public class TimeoutInterceptor {@AroundTimeoutpublic Object manageTransaction(InvocationContext ctx) throws Exception { ... }
}

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

public class TransactionInterceptor {@AroundInvokepublic 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 标注订阅处理事件。

转载于:https://www.cnblogs.com/luv-letter/p/11038831.html

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. java el jstl_java -EL技术JSTL技术

    EL技术 EL 表达式概述 EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要替代jsp页面中脚本(java代码)的编写. EL从域中取出数 ...

  3. JSP→JSTL标准标签库简介与环境搭建、JSTL助手EL表达式EL隐式对象、标签→out、set、if、多选择配合、foreach、redirect、格式化、JSTL函数标签、自定义标签、标签类架构

    JSTL标准标签库简介与环境搭建 EL表达式与EL隐式对象 out标签 set标签 remove标签 catch标签 if标签 choose.when.otherwise配合标签 foreach标签 ...

  4. EL表达式和标准标签库

    EL表达式(expression language): !!!!自定义标签!!!! 语法 ${expression} jsp中page指令有一个属性叫isELIgnored <%@ page i ...

  5. MySQL、JDBC、HTML、CSS、JavaScript、jQuery、tomcat、Http、Servlet、JSP、EL、JSTL、Maven、Cookie、Session(框架第一部分)

    第一章 MySQL 一 .数据库 1.什么是数据库? 所谓的数据库就是指存储和管理数据的仓库 2.数据库有哪些分类? 3.什么是关系型数据库? 底层以二维表的形式保存数据的库就是关系型数据库 stu- ...

  6. EL表达式和JSTL

    EL相关概念 JSTL一般要配合EL表达式一起使用,来实现在jsp中不出现java代码段.所以我们先来学习EL表达式 EL主要用于查找作用域中的数据,然后对它们执行简单操作:它不是编程语言,甚至不是脚 ...

  7. jsp基础、el技术、jstl标签、javaEE的开发模式

    一.jsp技术基础 1.jsp脚本和注释 jsp脚本: 1)<%java代码%> ----- 内部的java代码翻译到service方法的内部 2)<%=java变量或表达式> ...

  8. Spring 在 xml配置文件 或 annotation 注解中 运用Spring EL表达式

    Spring  EL 一:在Spring xml 配置文件中运用   Spring EL Spring EL 采用 #{Sp Expression  Language} 即 #{spring表达式} ...

  9. JSP第四篇【EL表达式介绍、获取各类数据、11个内置对象、执行运算、回显数据、自定义函数、fn方法库】...

    什么是EL表达式? 表达式语言(Expression Language,EL),EL表达式是用"${}"括起来的脚本,用来更方便的读取对象! EL表达式主要用来读取数据,进行内容的 ...

最新文章

  1. Spring Boot:自定义starter
  2. java什么叫内部对象,java – 函数对象的内部类中的变量/对象会发生什么?
  3. java 核桃的数量,[Java教程]【蓝桥杯】历届试题 核桃的数量
  4. Photoshop脚本指南——Hello World
  5. 【HDU - 5500】 Reorder the Books (思维)
  6. MyBatis : Example 条件查询 in 用法
  7. Visual Studio 2010 调试 C 语言程序
  8. 剑指Offer07题解-重建二叉树
  9. 503.下一个更大元素II(力扣leetcode) 博主可答疑该问题
  10. 雅可比矩阵与海森矩阵
  11. Chrome浏览器清除cookies方法
  12. Docker进阶篇教程 docker swarm弹性、动态扩缩容
  13. CSI笔记【3】:多进多出/MIMO技术
  14. C++面向对象程序设计
  15. 条件if语句的多种写法
  16. 让人拍案叫绝的创意是如何产生的
  17. PDF转jpg工具(含注册码)
  18. 2008-2020年各省地方债务余额数据(wind)
  19. Redis 学习 - 05 Node.js 客户端操作 Redis、Pipeline 流水线
  20. MathJax中那些挺难找到的符号表示汇总

热门文章

  1. 《这世间,唯有青春与梦想不可辜负》
  2. 【MySQL】外键约束
  3. 十四、windows窗体高级控件
  4. [转]深度学习调参技巧
  5. 本体技术视点 | 聊聊Ontology上三种合约“交相辉映”的故事
  6. IE选项注册表控制大全(转)
  7. stack - es - 官方文档 - 内部命中inner_hits
  8. P1914 小书童 密码(模拟)
  9. linux京东签到脚本错误,从2020-10-22日起签到脚本无法运行完成
  10. C# 代码编辑器实现篇-语法高亮