java与java ee_Java EE6装饰器:在注入时装饰类
java與java ee
軟件中常見的設(shè)計(jì)模式是裝飾器模式 。 我們上一堂課,然后在它周圍包裝另一堂課。 這樣,當(dāng)我們調(diào)用類時(shí),我們總是在到達(dá)內(nèi)部類之前通過周圍的類。Java EE 6允許我們通過CDI創(chuàng)建裝飾器,作為其AOP功能的一部分。 如果我們想實(shí)現(xiàn)仍然與業(yè)務(wù)足夠接近的跨領(lǐng)域關(guān)注點(diǎn) ,則可以使用Java EE 6的此功能。
假設(shè)您有一項(xiàng)票務(wù)服務(wù),可讓您訂購特定事件的票務(wù)。 TicketService處理注冊等,但是我們要添加餐飲。 我們不認(rèn)為這是門票訂購邏輯的一部分,因此我們創(chuàng)建了一個(gè)裝飾器。 裝飾者將調(diào)用TicketService并添加門票數(shù)量。
界面:
public interface TicketService {Ticket orderTicket(String name); }接口的實(shí)現(xiàn),創(chuàng)建票證并將其保留。
@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;} }當(dāng)我們不能使用裝飾器時(shí),我們可以創(chuàng)建相同接口的新實(shí)現(xiàn)。
@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;} }請注意,我們在此處應(yīng)用了2個(gè)CDI特定注釋。 @Decorator將實(shí)現(xiàn)標(biāo)記為裝飾器。 裝飾器應(yīng)始終具有一個(gè)委托(我們要裝飾的類),該委托帶有@Delegate批注(在注入點(diǎn)處)標(biāo)記。 還請注意我們使用接口而不是實(shí)現(xiàn)的事實(shí)。
就像其他示例一樣 ,當(dāng)您注入此接口時(shí),將使用常規(guī)實(shí)現(xiàn)。
@Inject private TicketService ticketService;不必使用限定符,我們只需要調(diào)整beans.xml即可將TicketServiceDecorator標(biāo)記為“ 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>作為更高級的用法,我們可以組合多個(gè)裝飾器并選擇我們希望它們執(zhí)行的順序。
如果您有用例,則可以像這樣在beans.xml文件中輕松定義兩個(gè)裝飾器。
<decorators><class>be.styledideas.blog.decorator.HighDecorator</class><class>be.styledideas.blog.decorator.LowDecorator</class> </decorators>因此,當(dāng)我們調(diào)用裝飾類時(shí),我們得到了高級裝飾器入口,低裝飾器入口,實(shí)際裝飾器類,低裝飾器出口,高裝飾器出口。 因此,文件中的裝飾器順序確實(shí)很重要。
第二個(gè)功能比第一個(gè)功能更具吸引力,它揭示了Java EE6中Decorator功能的真正威力。 這是將其與CDI批注結(jié)合在一起的能力。 作為示例,我將使用社交媒體供稿處理器。
所以我創(chuàng)建了一個(gè)接口:
public interface SocialFeedProcessor {Feed process(String feed); }并提供了2種實(shí)現(xiàn),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個(gè)bean進(jìn)行注釋
@javax.inject.Qualifier @java.lang.annotation.Retention(RUNTIME) @java.lang.annotation.Target({FIELD, PARAMETER, TYPE}) @java.lang.annotation.Documented public @interface FeedProcessor { }然后用它注釋我的兩個(gè)處理器。
@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);}}沒什么特別的,但是現(xiàn)在當(dāng)我們編寫裝飾器時(shí),我們使用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>通過使用注釋,我們可以使用此裝飾器自動(dòng)裝飾我們的SocialfeedProcessor的所有實(shí)現(xiàn)。 當(dāng)我們添加不帶注釋的SocialFeedProcessor的額外實(shí)現(xiàn)時(shí),將不裝飾Bean。
參考: Java EE6裝飾器,在注入時(shí)裝飾類, Java EE6裝飾器,來自Styled Ideas Blog的 JCG合作伙伴 Jelle Victoor的 高級用法 。
相關(guān)文章 :- JDK中的設(shè)計(jì)模式
- 在域驅(qū)動(dòng)設(shè)計(jì)中使用狀態(tài)模式
- 基本的EJB參考,注入和查找
- 使用Spring AOP進(jìn)行面向方面的編程
- 使用Spring AspectJ和Maven進(jìn)行面向方面的編程
翻譯自: https://www.javacodegeeks.com/2011/10/java-ee6-decorators-decorating-classes.html
java與java ee
總結(jié)
以上是生活随笔為你收集整理的java与java ee_Java EE6装饰器:在注入时装饰类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Spring整合基础
- 下一篇: Android允许后台活动管理,安卓基础
