1.【Spring实战——面向切面的源码Spring】1.5使用注解创建切面
2.å
³äºCS1.5çå½ä»¤
【Spring实战——面向切面的Spring】1.5使用注解创建切面
使用注解创建切面是Spring实战中的重要技巧,它简化了AspectJ 5以前繁琐的源码Java语言扩展,使得任何类可以轻易转换为切面。源码通过定义切面,源码dovecot 源码安装我们可以将非核心关注点(如观众的源码行为)与核心功能分离,提高代码的源码可维护性。
在定义切面时,源码首先使用@AspectJ注解标记Audience类,源码其中的源码三个通知方法(takeSeats, silence CellPhones, applause, demandRefund)利用@Before, @AfterReturning, @AfterThrowing注解表明执行时机。这些注解都引用了一个切点表达式,源码但重复使用可能会显得冗余。源码wetv源码为了解决这个问题,源码@PointCut注解允许我们在切面内部定义可重用的源码切点,如performance()方法。源码
Audience作为注解切面,源码通过Spring自动代理功能,qqlevel源码当装配为bean时,其注解通知将自动应用到匹配的bean上。启用自动代理的方式可以是JavaConfig或XML配置。Spring的AspectJ自动代理实际上是一个基于代理的实现,尽管使用了注解,1001010011源码但它仍然局限于代理方法的调用。
要充分利用AspectJ的能力,需要在运行时启用AspectJ,而不是依赖Spring。环绕通知是ognl源码强大的,它可以包裹目标方法,实现前置和后置通知的组合。通过创建一个环绕通知,如watchPerformance(),我们可以在一个方法中统一处理前后行为。
切面处理参数的方法可以是通过参数化的通知,如记录磁道播放次数的TrackCounter切面。引入新功能可以通过AOP的引入概念,为Spring bean添加新的方法,即使这些方法在原始实现中不存在。
总的来说,注解创建切面提供了简洁的编程方式,但源码的可访问性是其使用的一个前提。在Spring中,注解和自动代理简化了切面声明,但也需要一定的条件。
å ³äºCS1.5çå½ä»¤
ããè¿æ¯æºæ件ï¼åæ¥æç 究æ件çæ¶åçæºä»£ç ã
ããè¿æ¯æºæ件å称 high_ping_kicker.sma å¯ä»¥ç¨è®°äºæ¬æå¼ç¼è¾ã
ããç¨ç½ä¸çç¼è¾è½¯ä»¶å¯ä»¥ç¼è¾æhigh_ping_kicker.amxæ件
ããè¿æ¯æ件ï¼ç½ä¸æå¾å¤ä½¿ç¨è¯´æï¼ä½ èªå·±å»çå§ï¼ä¸é¢æ¯ä»£ç ï¼å°±æ¯é«äºå¤å°ä¹å就踢ãä½ èªå·±ç¼è¾åçæhigh_ping_kicker.amxæ件ï¼ææï¼ä½æ¯æ²¡æ³ä¼ ä¸æ¥ï¼èªå·±åå§ãåæ¾å ¥CSä¸ï¼æ¸¸ææ¶ï¼æå¼æ§å¶å°ï¼æ²å ¥è¿ååï¼å°±å¥½äºï¼ä¸å¤è¯´äºï¼é½æ¯CS游æ人ï¼ä½ ççç»åã
ããä¸é¢æ¯æºä»£ç ï¼
ãã#include <amxmod>
ããnew HIGHPING_MAX = // set maximal acceptable ping
ããnew HIGHPING_TIME = // set in seconds frequency of ping checking
ããnew HIGHPING_TESTS = 5 // minimal number of checks before doing anything
ããnew g_Ping[]
ããnew g_Samples[]
ããpublic plugin_init()
ãã{
ããregister_plugin("High Ping Kicker","0.9.4","default")
ããif ( HIGHPING_TIME < 5 ) HIGHPING_TIME = 5
ããif ( HIGHPING_TESTS < 3 ) HIGHPING_TESTS = 3
ãã}
ããpublic client_disconnect(id)
ããremove_task( id )
ããpublic client_putinserver(id)
ãã{
ããg_Ping[id] = 0
ããg_Samples[id] = 0
ããif ( !is_user_bot(id) )
ãã{
ããnew param[1]
ããparam[0] = id
ããset_task( float(HIGHPING_TIME) , "checkPing" , id , param , 1 , "b" )
ããset_task( .0 , "showWarn" , id , param , 1 )
ãã}
ãã}
ããkickPlayer( id )
ãã{
ããnew name[]
ããget_user_name( id , name , )
ããclient_print(0,print_chat,"** Player %s disconnected due to high ping",name)
ããclient_cmd(id,"echo ^"** Sorry but you have too high ping, try later...^";disconnect")
ãã}
ããpublic checkPing(param[])
ãã{
ããnew id = param[ 0 ]
ããif ( get_user_flags(id) & ADMIN_IMMUNITY ) return // has immunity
ããnew p, l
ããget_user_ping( id , p , l )
ããg_Ping[ id ] += p
ãã++g_Samples[ id ]
ããif ( (g_Samples[ id ] > HIGHPING_TESTS) &&
ãã(g_Ping[id] / g_Samples[id] > HIGHPING_MAX) )
ããkickPlayer(id)
ãã}
ããpublic showWarn(param[])
ããclient_print( param[0] ,print_chat,"* Players with ping higher than %d will be kicked!", HIGHPING_MAX )
ããè¿æ¯å¤å½äººç¼çï¼å½åæCSç´è¿·ï¼èªå·±åèæ¬ï¼å»ç½ç«ä¸è¿+çæ件ï¼çä¸ç¥éæä¹å½¢å®¹ï¼é£å°±æ¯CSå°±æ¯æççå½ï¼ççï¼çå½ï¼ç°å¨èäºï¼æ²¡ç©ºæäºï¼ç°å¨ä¸æ¥ççï¼è¿æ人ç¨çä¸è¥¿ï¼çæ¯è¿½æ±CSï¼
ãã游ææå¿«ï¼