1、前提配置
<!-- 添加如下配置,启用aop注解 -->
<aop:aspectj-autoproxy/>
<!--扫描注解-->
<context:component-scan base-package="service"/>
2、定义原始类
@Service
public class UserServiceImpl implements UserService {
@Override
public void add() {
System.out.println("添加了");
}
@Override
public void delete() {
System.out.println("删除了");
}
@Override
public String getAll() {
System.out.println("查到了所有");
return "";
}
@Override
public void getOne() {
System.out.println("查到一个");
}
@Override
public void update() {
System.out.println("更新了");
}
}
3、创建切面类MyAspect
@Component//将类注入到ioc容器中
@Aspect//声明当前类是一个切面类
public class MyAspect {
@Pointcut("execution(* service.UserService.add())")
public void m1(){}
@Pointcut("execution(* service.UserService.delete())")
public void m2(){}
@Pointcut("execution(* service.UserService.getAll())")
public void m3(){}
@Pointcut("execution(* service.UserService.getOne())")
public void m4(){}
@Pointcut("execution(* service.UserService.update())")
public void m5(){}
@Before("m1()")
public void before(){
System.out.println("前置");
}
@After("m2()")
public void after(){
System.out.println("后置");
}
@AfterReturning("m3()")
public void afterRetruning(){
System.out.println("有返回值执行");
}
@AfterThrowing("m4()")
public void afterThrowing(){
System.out.println("异常后执行");
}
@Around("m5()")
public void around(ProceedingJoinPoint pjp) throws Throwable {
long start = System.currentTimeMillis();
pjp.proceed();//目标方法的调用
long end = System.currentTimeMillis();
System.out.println("环绕通知" +
(end - start) +
"毫秒");
}
}
4、测试
@RunWith(SpringJUnit4ClassRunner.class) //由SpringJUnit4ClassRunner启动测试
@ContextConfiguration("classpath:spring-config.xml") //spring的配置文件位置
//本测试类是在test包下所以要导入上面注解
//作用:1、可以免去工厂的创建过程;2、可以直接将要测试的组件注入到测试类。
public class user {
@Autowired
UserService userService;
@Test
public void test1() {
userService.add();
}
@Test//这种调用方法和上面效果一样
public void test2(){
ApplicationContext ac = new ClassPathXmlApplicationContext("spring-config.xml");
UserService bean = ac.getBean(UserService.class);
bean.add();
}
}