Spring Aop使用(xml配置方式)
1.applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--目标对象(切点)-->
<bean id="mycalculator" class="com.zdb.aop.springxmlaop.MycalculatorImpl"></bean>
<!--增强对象(通知)-->
<bean id="myAspect" class="com.zdb.aop.springxmlaop.MyAspect"></bean>
<!--配置织入(切面):告诉Spring哪些方法(切点)需要进行哪些增强(前置、后置)-->
<aop:config>
<!--声明切面 myAspect-->
<aop:aspect ref="myAspect">
<!--配置目标方法的前置方法-->
<aop:before method="before" pointcut="execution(public Integer com.zdb.aop.springxmlaop.MycalculatorImpl.add(int,int))"></aop:before>
<!--配置目标方法的后置方法-->
<aop:after-returning method="after" pointcut="execution( Integer com.zdb.aop.springxmlaop.MycalculatorImpl.add(int,int))"></aop:after-returning>
<!--配置目标方法的环绕方法-->
<aop:around method="around" pointcut="execution(public Integer com.zdb.aop.springxmlaop.MycalculatorImpl.add(int,int))"></aop:around>
<!--配置异常检查的增强方法-->
<aop:after-throwing method="throwing" pointcut="execution(public Integer com.zdb.aop.springxmlaop.MycalculatorImpl.add(int,int))"></aop:after-throwing>
<!--配置目标方法的最终方法-->
<aop:after method="end" pointcut="execution(public Integer com.zdb.aop.springxmlaop.MycalculatorImpl.add(int,int))"></aop:after>
</aop:aspect>
</aop:config>
</beans>
2.通知(增强)代码
public class MyAspect {
public void before() {
System.out.println("前置增强器执行了");
}
public void after() {
System.out.println("后置增强器执行了");
}
public void end() {
System.out.println("最终方法执行了");
}
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("环绕增强前");
//切点方法
Object proceed = proceedingJoinPoint.proceed();
System.out.println("环绕增强后");
return proceed;
}
public void throwing(){
System.out.println("异常检查增强执行了");
}
}
3.切点方法
public class MycalculatorImpl implements Mycalculator {
public Integer add(int a, int b) {
System.out.println("add()执行了!");
//测试异常增强时使用
//a=a/0;
return a+b;
}
}
4.测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class XmlAopTest {
@Autowired
private Mycalculator mycalculator;
@Test
public void test01(){
int add=mycalculator.add(1,2);
System.out.println(add);
}
}
5.结果
Spring Aop使用(注解方式)
1.Spring主配置类上需添加
//定义该类为Spring配置类
@Configuration
//开启切面
@EnableAspectJAutoProxy
//读取包下定义的Bean
@ComponentScan("com.zdb")
public class SpringConfig {
}
2.切面代码
@Component("myAspect")
@Aspect //标注这个bean是一个切面
public class MyAspect {
//配置切点(需要增强的方法(com包下所有的以ServSice结尾的类下的所有以getBy开头的参数任意的方法))
@Pointcut("execution(public Integer com.zdb.aop.springxmlaop.MycalculatorImpl.add(int,int))")
public void pointcut(){}
//配置前置通知
@Before("pointcut()")
public void before() {
System.out.println("前置增强器执行了");
}
//配置后置通知
@AfterReturning("pointcut()")
public void after() {
System.out.println("后置增强器执行了");
}
//配置最终通知
@After("pointcut()")
public void end() {
System.out.println("最终方法执行了");
}
//配置环绕通知(最常用需掌握 ProceedingJoinPoint 代表需增强的方法 ,执行 proceedingJoinPoint.proceed())
@Around("pointcut()")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("环绕增强前");
//切点方法
Object proceed = proceedingJoinPoint.proceed();
System.out.println("环绕增强后");
return proceed;
}
//配置异常通知
@AfterThrowing("pointcut()")
public void throwing() {
System.out.println("异常检查增强执行了");
}
}
3.切点方法
public class MycalculatorImpl implements Mycalculator {
public Integer add(int a, int b) {
System.out.println("add()执行了!");
//测试异常增强时使用
//a=a/0;
return a+b;
}
}
4.测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class AnnoAopTest {
@Autowired
private Mycalculator Mycalculator;
@Test
public void test01(){
int add=Mycalculator.add(1,2);
System.out.println(add);
}
}
5.结果