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

java与java ee

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

Java EE 6允许我们通过CDI创建装饰器,作为其AOP功能的一部分。 如果我们想实现仍然与业务足够接近的跨领域关注点 ,则可以使用Java EE 6的此功能。

假设您有一项票务服务,可让您订购特定事件的票务。 TicketService处理注册等,但是我们要添加餐饮。 我们不认为这是门票订购逻辑的一部分,因此我们创建了一个装饰器。 装饰者将调用TicketService并添加门票数量。

界面:

public interface TicketService {Ticket orderTicket(String name);
}

接口的实现,创建票证并将其保留。

@Stateless
public class TicketServiceImpl implements TicketService {@PersistenceContextprivate EntityManager entityManager;@TransactionAttribute@Overridepublic Ticket orderTicket(String name) {Ticket ticket = new Ticket(name);entityManager.persist(ticket);return ticket;}
}

当我们不能使用装饰器时,我们可以创建相同接口的新实现。

@Decorator
public class TicketServiceDecorator implements TicketService {@Inject@Delegateprivate TicketService ticketService;@Injectprivate CateringService cateringService;@Overridepublic Ticket orderTicket(String name) {Ticket ticket = ticketService.orderTicket(name);cateringService.orderCatering(ticket);return ticket;}
}

请注意,我们在此处应用了2个CDI特定注释。 @Decorator将实现标记为装饰器。 装饰器应始终具有一个委托(我们要装饰的类),该委托带有@Delegate批注(在注入点处)标记。 还请注意我们使用接口而不是实现的事实。

就像其他示例一样 ,当您注入此接口时,将使用常规实现。

@Inject private TicketService ticketService;

不必使用限定符,我们只需要调整beans.xml即可将TicketServiceDecorator标记为“ Decorator”。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"><decorators><class>be.styledideas.blog.decorator.TicketServiceDecorator</class></decorators>
</beans>

作为更高级的用法,我们可以组合多个装饰器并选择我们希望它们执行的顺序。

如果您有用例,则可以像这样在beans.xml文件中轻松定义两个装饰器。

<decorators><class>be.styledideas.blog.decorator.HighDecorator</class><class>be.styledideas.blog.decorator.LowDecorator</class>
</decorators>

因此,当我们调用装饰类时,我们得到了高级装饰器入口,低装饰器入口,实际装饰器类,低装饰器出口,高装饰器出口。 因此,文件中的装饰器顺序确实很重要。

第二个功能比第一个功能更具吸引力,它揭示了Java EE6中Decorator功能的真正威力。 这是将其与CDI批注结合在一起的能力。 作为示例,我将使用社交媒体供稿处理器。

所以我创建了一个接口:

public interface SocialFeedProcessor {Feed process(String feed);
}

并提供了2种实现,twitter和google +

public class TwitterFeedProcessor implements SocialFeedProcessor{@Overridepublic Feed process(String feed) {System.out.println("processing this twitter feed");// processing logicsreturn new Feed(feed);}}
public class GooglePlusFeedProcessor implements SocialFeedProcessor {@Overridepublic Feed process(String feed) {System.out.println("processing this google+ feed");// processing logicsreturn new Feed(feed);}}

我将通过此处所述的自定义限定符对这2个bean进行注释

@javax.inject.Qualifier
@java.lang.annotation.Retention(RUNTIME)
@java.lang.annotation.Target({FIELD, PARAMETER, TYPE})
@java.lang.annotation.Documented
public @interface FeedProcessor {
}

然后用它注释我的两个处理器。

@FeedProcessor
public class TwitterFeedProcessor implements SocialFeedProcessor{@Overridepublic Feed process(String feed) {System.out.println("processing this twitter feed");// processing logicsreturn new Feed(feed);}}
@FeedProcessor
public class GooglePlusFeedProcessor implements SocialFeedProcessor {@Overridepublic Feed process(String feed) {System.out.println("processing this google+ feed");// processing logicsreturn new Feed(feed);}}

没什么特别的,但是现在当我们编写装饰器时,我们使用CDI的功能仅使用@FeedProcessor批注装饰类。

@Decorator
public class SocialFeedDecorator implements SocialFeedProcessor {@Delegateprivate @FeedProcessor SocialFeedProcessor processor;@Overridepublic Feed process(String feed) {System.out.println("our decorator is decorating");return processor.process(feed);}
}

剩下的唯一事情就是在beans.xml中注册装饰器

<decorators><class>be.styledideas.blog.decorator.SocialFeedDecorator</class>
</decorators>

通过使用注释,我们可以使用此装饰器自动装饰我们的SocialfeedProcessor的所有实现。 当我们添加不带注释的SocialFeedProcessor的额外实现时,将不装饰Bean。

参考: Java EE6装饰器,在注入时装饰类, Java EE6装饰器,来自Styled Ideas Blog的 JCG合作伙伴 Jelle Victoor的 高级用法 。

相关文章 :
  • JDK中的设计模式
  • 在域驱动设计中使用状态模式
  • 基本的EJB参考,注入和查找
  • 使用Spring AOP进行面向方面的编程
  • 使用Spring AspectJ和Maven进行面向方面的编程

翻译自: https://www.javacodegeeks.com/2011/10/java-ee6-decorators-decorating-classes.html

java与java ee

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kail利用msf工具对ms10-087漏洞入侵渗透WinXP

1.实验环境: Kali2020:10.20.29.129 Windows 2003:10.20.29.137 两台虚拟机能够相互ping通 2.实验步骤 1&#xff0c; 启动Metasploit 2&#xff0c;查找和MS10-087相关的模块search ms10_087 3&#xff0c;使用exploit/windows/fileformat/ms10_087_rtf_pfragments_bof模…

java gif_使用Java来处理GIF图片

一个2个类&#xff0c;一个是读图片的类GifDecoder&#xff0c;一个是写图片的类AnimatedGifEncoder使用还是挺方便的&#xff0c;下面举个栗子public static void main(String[] args) throws IOException {GifDecoder decoder new GifDecoder();int status decoder.read(&q…

C++ operator 知识点

[转]C隐式类型转换 operator T http://m.blog.csdn.net/blog/micx0124/12389973# 对于operator关健字用于运算符重载这我们都知道&#xff0c;其实operator还有另外一种作用&#xff1a;强制类型转换。上一周为了对应项目中一个问题&#xff0c;同事帮助写了一个类&#xff0c;…

2020年前端招聘技术概览(包含常见的打包工具,框架及前端技术简介)

学习当下前端技术最好的方法就是从求职网站上找出前端的招聘要求,因为前端技术每年变化都很快,每个阶段都会不一样,这里简单从网站招聘要求罗列,仅供参考。更有针对性的是针对每个公司的招聘要求写简历,学习相关技术(除非那个公司特别好) 1.熟悉html,javaScript,css,aja…

java.util.concurrent包

本文是我们学院课程中名为Java Concurrency Essentials的一部分 。 在本课程中&#xff0c;您将深入探讨并发的魔力。 将向您介绍并发和并发代码的基础知识&#xff0c;并学习诸如原子性&#xff0c;同步和线程安全之类的概念。 在这里查看 &#xff01; 目录 1.简介 2. jav…

DVWA通关教程(下)

XSS&#xff08;DOM&#xff09; XSS(DOM)是一种基于DOM树的一种代码注入攻击方式&#xff0c;可以是反射型的&#xff0c;也可以是存储型的&#xff0c;所以它一直被划分第三种XSS 与前两种XSS相比&#xff0c;它最大的特点就是不与后台服务器交互&#xff0c;只是通过浏览器…

Python模拟ICMP包

主要使用Scapy来完成 基础环境 VM1&#xff08;192.168.1.226&#xff09; | | VM2&#xff08;192.168.1.125&#xff09; vm1封装icmp包发给vm2 vm1脚本&#xff1a; #! /usr/bin/env pythonfrom scapy.all import *target "192.168.1.125" ip IP() icmp ICMP()…

SSH暴力破解实战

一.hydra【海德拉】 海德拉&#xff08;Hydra&#xff09;&#xff1a;希腊神话中的九头蛇&#xff0c;是西方的神话生物&#xff0c;在古希腊神话中出现最为频繁。传说它拥有九颗头&#xff0c;其中一颗头要是被斩断&#xff0c;立刻又会生出两颗头来。 Hydra是世界顶级密码暴…

前端工程师必备谷歌浏览器F12下的调试知识点

chrome浏览器版本(所有的操作都是基于我电脑上目前这个版本。) 进入开发者工具的方式:F12 (所有浏览器都可以用F12进入开发者工具),ChromeDev(开发者工具简称)按照类别可以分为下面几种 审查元素 ctrl+shift+c 在页面上选择一个HTML元素并审查它 切换浏览设备 ctrl+…

java createjpeg4_在linux下用java的JPEGCodec.createJPEGEncoder(bos)生成jpg图片问题

在rh8 linux 下用java的JPEGCodec.createJPEGEncoder(bos)生成jpg图片&#xff0c;XServer已启动。出现如下问题错误提示如下java.lang.InternalError: Cant connect to X11 window server using :0.0 as the value of the DISPLAY variable…

ASP.Net string 类的扩展方法 [转]

string 类的扩展方法列表(基本相同于 IEnumerable<T> 接口的成员列表): Aggregate<> //累加 All<> //是否都满足条件 Any<> //是否有一个满足条件 AsEnumerable<> // AsParallel<> …

Netflix Archaius用于物业管理–基础知识

Netflix Archaius提供了一组精巧的功能&#xff0c;可将动态属性加载到应用程序中。 这篇博客文章只是我所了解的Archaius范围的文档&#xff0c;比我在这里所记录的内容要多得多&#xff0c;但这应该提供一个很好的开始&#xff1a; 默认行为 考虑一个简单的属性文件&#x…

程序员应该如何提问?

提问是软件开发的一个不可避免的环节&#xff0c;各种思想火花地碰撞往往能产生奇妙的结果&#xff0c;但是作为一名傲娇霸气君临天下人见人爱花见花开炒鸡屌的程序员&#xff0c;你是否真的思考和总结过自己的提问方式呢&#xff1f;如何去问一个让双方都满意的好问题并最大程…

Kali利用msf对MS10_061漏洞进行渗透测试

注意事项&#xff1a; kail首次打开metasploit&#xff0c;会初始化数据&#xff0c;可能会有点慢&#xff0c;请耐心等待&#xff01;本文仅供学习漏洞渗透测试&#xff0c;不得用于其他非法用途&#xff0c;否则造成的任何后果自负&#xff01;&#xff01;&#xff01; 1.…

如何判断ios设备中是否安装了某款应用

URL Schemes关键字研究一下即可 常见得URL Schemes见http://www.cnblogs.com/huangzs/p/4491286.html if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:"alipay://"]]) { NSLog(" installed"); NSURL *url [NSURL URLWithStr…

java初始化数组的时候给多少长度_java二维数组的初始化及使用其长度

二维数组的初始化1.静态初始化int intArray[ ][ ]{{1,2},{2,3},{3,4,5}};Java语言中&#xff0c;由于把二维数组看作是数组的数组&#xff0c;数组空间不是连续分配的&#xff0c;所以不要求二维数组每一维的大小相同。2.动态初始化1) 直接为每一维分配空间&#xff0c;格式如下…

前端大牛都在看的书

目录结构 HTMLCSSJavaScript正则表达式jQueryNodejsReactVueAngular通信方式数据存储服务端架构与安防算法设计模式开发辅助客户端开发 HTML Head First HTML 与 CSS

Metaspliot 控制终端利用Samba漏洞渗透

Samba简介 Samba是linux和unix系统上实现smb协议的一个免费软件&#xff0c;由服务器及客户端程序构成&#xff0c;Samba是面向Linux和Unix环境的Windows互操作性套件。它适用于在可能包括Linux、Unix、Windows、macOS及其他操作系统的异构环境下工作的那些人。Samba使用服务器…

群里分享的react的收藏一下!今日周末,改了个表单验证然后无所事事了!

今日周末&#xff0c;改了个表单验证然后无所事事了&#xff0c;然后把昨天群里分享的react的收藏一下尽管现在还在研究angular和nodeJs毕竟刚刚开始用有点不熟...没准以后会研究一下react毕竟看着下面这张图还是觉得有点欢乐的 现在最热门的前端框架&#xff0c;毫无疑问是 Re…

java的设计模式用的什么软件_《图解Java多线程设计模式》UML用什么软件画?

eclipse插件 AmaterasUML (下载地址&#xff1a;https://zh.osdn.net/projects/amateras/releases/#21568)解压放到plugins文件夹下在安装AmaterasUML之前要先安装GEF(eclipse在线安装&#xff0c;参考&#xff1a;http://www.cnblogs.com/xiluhua/p/6667935.html)eclipse-File…