1.Decorators装饰器综述

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

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

假设我们有一个接口,代表账户:

public interface Account {public BigDecimal getBalance();public User getOwner();public void withdraw(BigDecimal amount);public void deposit(BigDecimal amount);
}

几种不同的Bean在我们系统实现账户接口。

然而,我们有一个强制要求:任何类型的账户,交易必须由系统日志进行记录. 
这就是装饰器的一个工作.

用@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.Delegate object(委托对象)

decorator有特殊的注射点,称为委托注入点(delegate injection point), 
其必须有一个delegate injection point,可以是一个构造函数参数,初始化方法参数或injected field.

@Decorator
public abstract class LargeTransactionDecorator implements Account {@Inject @Delegate @Any Account account;...
}

像上面这段代码,装饰器将绑定到所有实现了Account的Bean上.

如果是下面这段代码,@Foreign是我们自定义. 
那么装饰器将绑定到实现了Account的Bean并且qualifiers是@Foreign的Bean上.

@Decorator
public abstract class LargeTransactionDecorator implements Account {@Inject @Delegate @Foreign Account account;...
}

decorator可能调用委托对象,和拦截器调用InvocationContext.proceed() 有大致有相同的结果.但主要的区别在于装饰可以委托对象上调用任何业务方法。

@Decorator
public abstract class LargeTransactionDecorator implements Account {@Inject @Delegate @Any Account account;@PersistenceContext EntityManager em;    public void withdraw(BigDecimal amount) {account.withdraw(amount);if ( amount.compareTo(LARGE_AMOUNT)>0 ) {em.persist( new LoggedWithdrawl(amount) );}}public void deposit(BigDecimal amount);account.deposit(amount);if ( amount.compareTo(LARGE_AMOUNT)>0 ) {em.persist( new LoggedDeposit(amount) );}}
}

3.Enabling decorators(启用装饰器)

默认情况下,所有装饰器都是禁用的.推荐用bean.xml进行开启.bean.xml是第一优先的.其次才是@Priority. 
CDI 1.1以后的decorator可以使用@Priority开启。@Priority定义了装饰器和拦截器的优先顺序,但还是没bean.xml里直观.

<beansxmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"><decorators><class>org.mycompany.myapp.LargeTransactionDecorator</class></decorators>
</beans>

注意:不要即在bean.xml配置又写@Priority.可能会出一些奇怪的问题.根本上,同时用这两种方式就是错误的.

转载于:https://www.cnblogs.com/April315/p/10706961.html

CDI services--Decorators(装饰器)相关推荐

  1. decorators 参数_Django中decorators装饰器的使用

    1.CBV实现的登录视图 classLoginView(View):defget(self, request):"""处理GET请求""" ...

  2. Decorators TypeScript 装饰器

    Decorators 装饰器(Decorator)用来增强 JavaScript 类(class)的功能,许多面向对象的语言都有这种语法,目前有一个提案将其引入了 ECMAScript. 装饰器是一种 ...

  3. CDI Services *Decoretions *Intercepters * Scope * EL\(Sp EL) *Eventmodel

    1.Decorators装饰器综述 拦截器是一种强大的方法在应用程序捕捉运行方法和解耦.拦截器可以拦截任何java类型的调用.  这使得拦截器适合解决事务管理,安全性,以及日记记录.  本质上说,拦截 ...

  4. Struts和Sitemesh整合,实现多个装饰器

    2019独角兽企业重金招聘Python工程师标准>>> web.xml配置 <filter><filter-name>struts-prepare</f ...

  5. java 设计模式 示例_Java示例中的装饰器设计模式

    java 设计模式 示例 Decorator design pattern is used to modify the functionality of an object at runtime. A ...

  6. python 装饰器(Decorators)原理说明

    本文目的是由浅入深地介绍python装饰器原理 装饰器(Decorators)是 Python 的一个重要部分 其功能是, 在不修改原函数(类)定义代码的情况下,增加新的功能 为了理解和实现装饰器,我 ...

  7. python 装饰器分类_Python 装饰器(Decorators) 超详细分类实例

    Python装饰器分类 Python 装饰器函数: 是指装饰器本身是函数风格的实现; 函数装饰器: 是指被装饰的目标对象是函数;(目标对象); 装饰器类 : 是指装饰器本身是类风格的实现; 类装饰器 ...

  8. 一文读懂 @Decorator 装饰器——理解 VS Code 源码的基础

    作者:easonruan,腾讯 CSIG 前端开发工程师 1. 装饰器的样子 我们先来看看 Decorator 装饰器长什么样子,大家可能没在项目中用过 Decorator 装饰器,但多多少少会看过下 ...

  9. java与java ee_Java EE6装饰器:在注入时装饰类

    java与java ee 软件中常见的设计模式是装饰器模式 . 我们上一堂课,然后在它周围包装另一堂课. 这样,当我们调用类时,我们总是在到达内部类之前通过周围的类. Java EE 6允许我们通过C ...

最新文章

  1. 如何在nuget上传自己的包+搭建自己公司的NuGet服务器(新方法)
  2. ubuntu 下非交互式执行远程shell命令
  3. wxWidgets:wxTreeCtrl 示例
  4. linux ldap客户端工具,OpenLDAP 客户端安装部署
  5. Quest Central for DataBase 5.0.1,6.1 (软件+注册)
  6. 记录 centos samba 安装
  7. mysql binary 查询_MYSQL的binary解决mysql数据大小写敏感问题 《转载》
  8. java jquery jsonp 跨域_Jquery跨域调用(JSONP)遇到error问题的解决
  9. python 功能代码是什么_Python功能代码
  10. debian添加快捷启动方式
  11. 检测代码运行时间(微秒级)
  12. idea常用图标总结
  13. 关于MyEclipse 10 破解程序打开的原因
  14. android手机脱网分析,网络营销-13款手机浏览器分析(Android).pptx
  15. linux离线安装netstat,在Ubuntu中安装netstat等网络工具
  16. python实现获取ip、网站备案信息、whois查询
  17. javaWeb通过servlet实现注册登陆
  18. VideoScribe--超好用的手绘动画制作软件
  19. python 词汇表_使用Counter构建词汇表
  20. App逆向学习--1

热门文章

  1. jumpserver(0.3.2版本)开源跳板机系统部署
  2. Spring集成activeMQ
  3. TPAMI 2022综述 | 视觉Transformer系统性测评及未来方向探讨
  4. 开年福利!OpenMMLab 全新企划,等你来
  5. 不用归一化,深度学习模型也可以很优秀!
  6. 小目标检测的福音:Stitcher,简单又有效
  7. 【新无人机数据集】从行人重识别 到 无人机目标定位
  8. CV Code | 计算机视觉开源周报20191002期
  9. 【TensorFlow】TensorFlow从浅入深系列之十三 -- 教你深入理解模型持久化(模型保存、模型加载)
  10. 收藏 | 各种Optimizer梯度下降优化算法回顾和总结