切面实现了横切关注点(跨多个应用对象的逻辑)的模块化,面向切面编程使得应用对象只用关注自己的业务逻辑实现,而不需要关注共通的例如,日志、事物、缓存等功能。
一、使用注解创建切面
1.定义切面
/**
* 观众类,定义为切面类
* @author shier
*
*/
@Aspect
public class Audience {
/*
* 定义命名的切点
*/
@Pointcut("execution(** concert.Performance.perform(..))")
public void performance(){}
/*
* 定义前置通知
*/
@Before("performance()")
public void silenceCellPhones(){
System.out.println("停止打电话");
}
/*
* 定义后置通知
*/
@AfterReturning("performance()")
public void takeSeats(){
System.out.println("鼓掌");
}
/*
* 定义异常通知
*/
@AfterThrowing("performance()")
public void demandRefund(){
System.out.println("退票");
}
/*
* 定义环绕通知
*/
@Around("performance()")
public void watchPerformance(ProceedingJoinPoint jp){
try {
System.out.println("停止打电话");
System.out.println("鼓掌");
jp.proceed();
System.out.println("clap!clap!clap!");
} catch (Throwable e) {
System.out.println("退票");
}
}
}
2.启用自动代理功能
(1)使用javaConfig方式@EnableAspectJAutoProxy注解启用自动代理功能
@Configuration
@EnableAspectJAutoProxy
@ComponentScan
public class AudienceConfig {
@Bean
public Audience audience(){
return new Audience();
}
}
(2)使用XML启用自动代理功能
<?xml version="1.1" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<aop:aspectj-autoproxy proxy-target-class="true"/>
</beans>
3.通过注解引入新功能
@Aspect
public class EncoreableIntroducer {
/**
* @DeclareParents注解指明了要引入的接口Encoreable,
* value表明哪种类型的bean要引入该接口Performmance的所有子类型,
* defaultImpl指定引入功能提供的实现类DefaultEncoreable
*/
@DeclareParents(value="concert.Performmance+",defaultImpl=DefaultEncoreable.class)
public static Encoreable encoreable;
}
二、在XML中声明切面
<bean id="showService" class="cn.com.ztz.spring.service.ShowServiceImpl"/>
<bean id="audienceAspect" class="cn.com.ztz.spring.service.AudienceAspect"/>
<aop:config>
<aop:aspect ref="audienceAspect" >
<aop:before pointcut="execution(* cn.com.ztz.spring.service.ShowServiceImpl.*(..)) and args(param)" method="taskSeats(java.lang.String)" arg-names="param"/>
</aop:aspect>
</aop:config>