告知spring,在创建容器时要扫描的包-->
<context:component-scan base-package="com.baidu"></context:component-scan>
3.2 配置步骤
3.2.1第一步:把通知类也使用注解配置
/**
* 一个记录日志的工具类
*/
@Component("logger")
public class Logger {
/**
* 期望:此方法在业务核心方法执行之前,就记录日志
* 前置通知
*/
public void beforePrintLog(){
System.out.println("前置通知:Logger类中的printLog方法开始记录日志了");
}
}
3.2.2第二步:在通知类上使用@Aspect注解声明为切面
/**
* 一个记录日志的工具类
*/
@Component("logger")
@Aspect//表明当前类是一个切面类
public class Logger {
/**
* 期望:此方法在业务核心方法执行之前,就记录日志
* 前置通知
*/
public void beforePrintLog(){
System.out.println("前置通知:Logger类中的printLog方法开始记录日志了");
}
}
3.2.3第三步:在增强的方法上使用@Before注解配置前置通知
/**
* 期望:此方法在业务核心方法执行之前,就记录日志
* 前置通知
*/
@Before("execution(* com.baidu.service.impl.*.*(..))")//表示前置通知
public void beforePrintLog(){
System.out.println("前置通知:Logger类中的printLog方法开始记录日志了");
}
3.2.4第四步:在spring配置文件中开启spring对注解AOP的支持
<!-- 开启spring对注解AOP的支持 -->
<aop:aspectj-autoproxy/>
3.3常用注解
3.3.1@Aspect:
作用:
把当前类声明为切面类。
3.3.2@Before:
作用:
把当前方法看成是前置通知。
属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用。
3.3.3@AfterReturning
作用:
把当前方法看成是后置通知。
属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用。
3.3.4@AfterThrowing
作用:
把当前方法看成是异常通知。
属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用。
3.3.5@After
作用:
把当前方法看成是最终通知。
属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用。
3.3.6@Around
作用:
把当前方法看成是环绕通知。
属性:
value:用于指定切入点表达式,还可以指定切入点表达式的引用。
3.3.7@Pointcut
作用:
指定切入点表达式
属性:
value:指定表达式的内容
3.4不使用XML的配置方式
@Configuration
@ComponentScan(basePackages="com.baidu")
@EnableAspectJAutoProxy
public class SpringConfiguration {
}
总结 :
方法称为连接点.
切入点 : 具体对那个方法做增强.切入点的表达式.
Advice(通知/增强) : 对save方法做增强,编写程序增强要做的事情.
通知类型 : 前置通知,后置通知,最终通知,异常通知和环绕通知.
Target(目标对象) : UserServiceImpl对象
Proxy (代理) : 生成的代理对象
Aspect(切面) : 抽象的概念
切面 = 切入点 + 通知.
Weaving(织入) : 是指把增强应用到目标对象来创建新的代理对象的过程.
AOP配置文件开发步骤 :
1 : 导入jar包
2 : 编写切面类,编写通知的方法(自己来编写的)
3 : 配置切面类,进行IOC的管理
4 : 编写AOP的增强.
<aop:config>
<!--配置切面 = 切入点(表达式) + 通知 -->
<aop:aspect ref="myXmlAspect">
<!--选择通知的类型,前置通知-->
<aop:before method="log" pointcut="execution(public void com.baidu.demo1.UserServiceImpl.save())"/>
</aop:aspect>
</aop:config>
<!-- 开启注解扫描 -->
<context:component-scan base-package="com.baidu.demo1"/>
<!-- 开启注解AOP -->
<aop:aspectj-autoproxy/>
package com.baidu.demo1;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
/**
* 注解方式的切面类
* 声明当前类是切面类
* @author Administrator
*/
@Component("myAnnoAspect")
@Aspect // 声明当前类是切面类 = 切入点表达式 + 通知类型
public class MyAnnoAspect {
/**
* 通知方法
* 配置通知类型,注解的属性编写的是切入点的表达式
* |