通知(Advice): 除了目标方法以外的操作都称之为通知
切入点(PointCut): 要为哪些类中的哪些方法加入通知
切面(Aspect): 通知 + 切入点

1.通知分类

    1. 前置通知
          MethodBeforeAdvice      前置通知接口
    2. 后置通知
	  MethodInterceptor       环绕通知接口
    3. 环绕通知
	  AfterReturningAdvice    返回后通知接口
    4. 异常通知
	  ThrowsAdvice		  异常通知接口

2.编程步骤

# 1.引入依赖
	 spring-aop
	 spring-expression
	 spring-aspects

# 2.开发通知类
     MyAdvice implements  通知接口{.....}
	  
    //自定义通知类:用来完成额外功能
    public class MyAdvice  implements MethodBeforeAdvice {
        @Override//参数1:当前调用的方法对象    //参数2:当前调用方法对象的参数  //参数3:目标对象
        public void before(Method method, Object[] objects, Object o) throws Throwable {
            System.out.println("目标方法名: "+method.getName());
            System.out.println("目标方法的参数: "+objects);
            System.out.println("目标对象: "+o.getClass());
        }
    }

# 3.配置切面
	a.引入aop命名空间
       <?xml version="1.0" encoding="UTF-8"?>
       <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:aop="http://www.springframework.org/schema/aop"
       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">
	b.管理通知
	  <!--管理通知类-->
    	 <bean id="myAdvice" class="com.codegzy.before.MyAdvice"/>
   	c.配置切面
   	<aop:config>
          <aop:pointcut id="pc" expression="execution(* com.codegzy.before.UserServiceImpl.*(..))"/>
          <aop:advisor advice-ref="myAdvice" pointcut-ref="pc"/>
    	</aop:config>

# 4.启动工厂测试
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        UserService userSerivce = (UserService) context.getBean("userService");
        System.out.println(userSerivce.getClass());
        userSerivce.save("gzy");

3.切点表达式

1.execution方法级别的切入点表达式

Spring的AOP介绍_spring

2.within类级别的切入点表达式

# 1.语法
	within(包.类)

# 2.示例
	within(com.codegzy.service.*) 
			包: com.codegzy.service
			类: 所有类中所有方法不关心返回值和参数
	
	within(com.codegzy.service.UserServiceImpl)
			包: com.codegzy.service
			类: UserServiceImpl类中所有方法不关心返回值和参数