Spring配置类里面配置:
@Import({JdbcConfig.class,MybatisConfig.class})//手动导入 @EnableAspectJAutoProxy//启动AOP
通知类配置:
@Component
@Aspect
//匹配业务层的所有方法 @Pointcut("execution(* com.itheima.service.*Service.*(..))") private void ServicePt(){} @Around("ServicePt()") public void runSpeed(ProceedingJoinPoint pjp) throws Throwable { Signature signature=pjp.getSignature();//签名信息 //通过签名获取执行的类型(接口名) String ClassName=signature.getDeclaringTypeName(); //通过签名获取执行操作的名称(方法名) String menthod=signature.getName(); long start=System.currentTimeMillis(); for (int i=0;i<10000;i++) { pjp.proceed(); } long end=System.currentTimeMillis(); System.out.println("业务层接口万次执行:"+ClassName+"."+menthod+"时间:"+(end-start)+"ms"); }
测试类配置:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = SpringConfig.class)
然后自动装配,需要的类对象,然后测试:
public class AccountServiceTestCase { @Autowired private AccountService accountService; @Test public void testFindById(){ Account ac = accountService.findById(1); //System.out.println(ac); } @Test public void testFindAll(){ List<Account> a=accountService.findAll(); //System.out.println(a); }
作用:在原有的基础上,做到功能的增强。
核心概念:代理:SpringAOP的核心本质是采用代理模式实现的。
连接点(JoinPoint):在SpringAOP中,理解为任意方法的执行。
切入点(Pointcut):匹配连接点的式子,也是共性功能的方法描述。
通知(Advice):若干个方法的共性功能,在切入点出执行,最终体现为一个方法。
切面(Aspect):描述通知与切入点的关系。
目标对象(Target):被代理的原始对象成为目标对象。
通知类型:
前置通知
后置通知
环绕通知(重点):
*环绕通知依赖形参ProceedingJoinPoint才能实现对原始方法的调用
*环绕通知可以隔离原始方法的调用执行
*环绕通知返回值设置Object类型
*环绕通知中可以对原始方法中出现的异常进行处理
返回后通知
抛出异常后通知