您现在的位置是:主页 > news > 岳阳做网站多少钱/长沙网站关键词排名

岳阳做网站多少钱/长沙网站关键词排名

admin2025/5/12 19:56:37news

简介岳阳做网站多少钱,长沙网站关键词排名,淇县网站建设,求个没封的w站2021不用下载Spring的AOP配置元素 Spring的AOP配置元素AOP配置元素用途<aop:advisor>定义AOP通知器<aop:after>定义AOP后置通知<aop:after-returning>返回通知<aop:after-throwing>异常通知<aop:around>环绕通知<aop:aspect>定义切面<aop:aspectj-a…

岳阳做网站多少钱,长沙网站关键词排名,淇县网站建设,求个没封的w站2021不用下载Spring的AOP配置元素 Spring的AOP配置元素AOP配置元素用途<aop:advisor>定义AOP通知器<aop:after>定义AOP后置通知<aop:after-returning>返回通知<aop:after-throwing>异常通知<aop:around>环绕通知<aop:aspect>定义切面<aop:aspectj-a…

Spring的AOP配置元素

 

Spring的AOP配置元素
AOP配置元素用途
<aop:advisor>定义AOP通知器
<aop:after>定义AOP后置通知
<aop:after-returning>返回通知
<aop:after-throwing>异常通知
<aop:around>环绕通知
<aop:aspect>定义切面
<aop:aspectj-autoproxy>启用注解@AspectJ定义的切面
<aop:before>前置通知
<aop:config>最顶层的AOP元素,其他<aop:*>必须包含在这个标签内部
<aop:declare-parents>为定义的对象引入接口
<aop:pointcut>定义切点

*切面类,和前面JavaConfig配置不同,将切点定义在xml中

public class Audience {public void performance(){}public void silencePhones(){System.out.println("silence cell phones .... ");}public void takeState(){System.out.println("take state  .... ");}public void appluase(){System.out.println("clap clap clap! ..");}public void round(ProceedingJoinPoint jp){try {System.out.println("silence cell phones .... ");System.out.println("take state  .... ");jp.proceed();System.out.println("clap clap clap! ..");} catch (Throwable e) {e.printStackTrace();}}
}

* 创建Aspect-xml.xm

 <!-- spring基于注解的配置 --><context:annotation-config/><!-- 扫包自动创建bean --><context:component-scan base-package="com.bing.proxy"></context:component-scan><!-- 创建切面类的bean --><bean id="audience" class="com.bing.proxy.Audience"></bean><aop:config><aop:pointcut expression="execution(* com.bing.proxy.UserService.*(..))" id="usPoint"/><aop:aspect ref="audience"><aop:before method="silencePhones" pointcut-ref="usPoint"/><aop:after method="appluase" pointcut-ref="usPoint"/></aop:aspect></aop:config>

* Junit测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value="classpath:aspectJ-xml.xml")
public class CDPlayerTest {@Autowiredprivate UserService us;@Testpublic void test(){us.sayAdd();}
}

注意到环绕通知,在aop:around元素的method属性里写的也是方法名

* xml中如何为通知传递参数

1. 定义切面类

public class TrackCounter {private Map<Integer, Integer> trackCounts = new HashMap<Integer, Integer>();public void countTrack(int i){int currentCount = getPlayCount(i);trackCounts.put(i, currentCount+1);}public int getPlayCount(int count){return trackCounts.containsKey(count)?trackCounts.get(count):0;}
}

2. 定义连接点

public interface CompactDisc {void play();void playTrack(int i);
}

每调用一次playTrack方法,将方法里面的参数传递到通知中,并记录

3. xml

 <!-- 创建切面类的bean --><bean id="tc" class="com.bing.proxy.TrackCounter"></bean><!-- 测试bean CompactDisc实现类 --><bean id="sp" class="com.erong.service.SgtPeppers"><constructor-arg index="0" value="十年"></constructor-arg><constructor-arg index="1" value="陈奕迅"></constructor-arg></bean><aop:config><!-- 给通知传递参数 -->   	<aop:aspect ref="tc"><aop:pointcut expression="execution(* com.bing.interface_.CompactDisc.playTrack(int)) and args(i)" id="pt"/><aop:before method="countTrack" pointcut-ref="pt"/>   	</aop:aspect></aop:config>

需要注意的是,AspectJ指示器和前面在JavaConfig中不用的是,&&换成了 and  其他的一致。

* 在xml中向对象引入新的接口

其实就是在定义的对象层次,定义它的父类型。在本例中对UserService的子类增加父类型接口Encoreable。

前面一节,使用@Declareparents实现的。这里xml中配置如下

<!-- 注入的接口的实现类 --><bean id="de" class="com.erong.service.DefaultEncoreable"></bean><aop:config><!-- 给现有的对象引入bean --><aop:aspect><aop:declare-parents types-matching="com.bing.proxy.UserService+" implement-interface="com.bing.interface_.Encoreable"delegate-ref="de"/></aop:aspect></aop:config>

属性说明:

* types-matching: 需要引入接口的类

* implement-interface:引入的接口

* delegate-ref:引入的接口默认实现类的Bean

* delegate-impl:引入的接口默认实现类