package com.service;
public interface EmpService {
void add();
String find();
void delete();
}
package com.service.impl;
import com.service.EmpService;
public class EmpServiceImpl implements EmpService {
@Override
public void add() {
System.out.println("添加员工");
}
@Override
public String find() {
System.out.println("查询员工");
return "xxx员工";
}
@Override
public void delete() {
/*事务不能try...catch 报错一定要回滚.不报错就应该提交事务*/
System.out.println(1/0);
}
}
<dependency>
<groupId>org.aspectjgroupId>
<artifactId>aspectjweaverartifactId>
<version>1.9.7version>
dependency>
package com.aop;
import org.aspectj.lang.JoinPoint;
//切面类(增强类) 每个方法中重复要做的事情 重复的代码写这里
public class Aop {
}
<bean id="aop" class="com.aop.Aop">bean>
<bean id="es" class="com.service.impl.EmpServiceImpl">bean>
<aop:config>
<aop:pointcut id="ppp" expression="execution(* com.service.impl.*.*(..))"/>
aop:config>
切面类aop中
public void b(){
//拿不到返回值,业务执行之后
System.out.println("---- --执行了后置方法--------");
}
aop:aspect标签中,其中ref属性是切面类(组件)的id
<aop:aspect ref="aop">
<aop:after method="b" pointcut-ref="ppp">aop:after>
aop:aspect>
其中after代表后置,method是后置通知时需要执行的方法的的方法名,pointcut-ref为切入点
import com.service.EmpService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("spring.xml");
EmpService es = ac.getBean(EmpService.class);
es.add();
System.out.println("------");
}
}
切面类aop中
public void c(ProceedingJoinPoint pjp) throws Throwable {
/*调用目标方法,拿到返回值 包含前置和后置*/
//可以得到方法的运行时间
System.out.println("环绕前");
Object obj = pjp.proceed();
//在proceed方法执行之后的都是原方法执行完成之后的逻辑
String name = pjp.getSignature().getName();
System.out.println("环绕后"+name+"方法返回值: "+obj);
}
aop:aspect标签中,其中ref属性是切面类(组件)的id
<aop:aspect ref="aop">
<aop:around method="c" pointcut-ref="ppp">aop:around>
aop:aspect>
其中around代表环绕,method是环绕通知时需要执行的方法的的方法名,pointcut-ref为切入点
import com.service.EmpService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("spring.xml");
EmpService es = ac.getBean(EmpService.class);
es.add();
System.out.println("------");
}
}
切面类aop中
public void d(JoinPoint jp,Object obj){
//目标方法不报错就进入,多个形式参数时obj必须是最后一个参数
String name = jp.getSignature().getName();
System.out.println(name+"方法未报错 返回值为:"+obj);
}
aop:aspect标签中,其中ref属性是切面类(组件)的id
<aop:aspect ref="aop">
<aop:after-returning method="d" pointcut-ref="ppp" returning="obj">aop:after-returning>
aop:aspect>
其中after-returning代表正常返回,method是配置正常返回通知时需要执行的方法的的方法名,returning是方法执行后的返回值
import com.service.EmpService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("spring.xml");
EmpService es = ac.getBean(EmpService.class);
es.find();
System.out.println("------");
}
}
切面类aop中
//目标方法错误就进入
public void e(JoinPoint jp,Exception ex){
//目标方法不报错就进入,多个新参obj必须最后一个参数
String name = jp.getSignature().getName();
System.out.println(name+"方法报错异常信息为:"+ex.getMessage());
}
aop:aspect标签中,其中ref属性是切面类(组件)的id
<aop:aspect ref="aop">
<aop:after-throwing method="e" pointcut-ref="ppp" throwing="ex">aop:after-throwing>
aop:aspect>
其中after-throwing代表异常返回,method是配置异常返回通知时需要执行的方法的的方法名,throwing是方法报错时的返回信息
import com.service.EmpService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("spring.xml");
EmpService es = ac.getBean(EmpService.class);
es.delete();
System.out.println("------");
}
}