1.AOP:Aspect Oriented Programming-面向切面编程
2.AOP的目的:提供另外一种编程思想来弥补OOP(面向对象编程)的不足
3.在OOP中的关键单元是模块,而在AOP中的关键单元是切面
4.AOP是对IOC的补充
5.AOP在spring中的作用:
1.声明式服务(声明式事物)
2.允许用户自定义切面
6.AOP的编程模式:原始的编程模式是从上而下的纵向编程模式,而AOP则是横向的编程模式
7.AOP是基于动态代理模式实现的
8.AOP的好处:
1.使真实角色处理的业务更加纯粹,不关心公共的业务
2.公共的业务由代理类来完成,实现了业务的分工
3.公共业务扩展的时候更加集中和方便
8.名词简介:
1.关注点:在原来的程序上新增的业务
2.切面(Aspect):一个关注点的模块
3.连接点:在程序执行过程中某个特定的点,在SpringAOP中,一个连接点代表了一个方法的执行
4.通知:在切面中的特定的连接点上执行的动作
1.通知类型:
1.前置通知
2.后置通知
3.最终通知
4.环绕通知
5.异常通知
9.SpringAOP的根本就是把领域业务和公共业务相结合,我们在执行领域业务的时候也要执行公共的业务,把公共的业务分离出来,封装成一个单独的模块,可以使公共的业务重用,使领域业务更加纯粹,其本质就是动态代理,但是spring中的AOP已经把动态代理进行了封装,我们只需要调用spring提供给我们的接口来实现动态代理
10,spring中实现AOP的应用:spring根据AOP给我们提供的五中通知方式,相应的给我们提供了五个接口来实现AOP的应用
1.前置通知:实现MethodBeforeAdvice接口,重写接口中的before方法
1.代码实现:public class Log implements MethodBeforeAdvice {
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println(method+"方法被执行,打印一条日志");
}
}
2.xml文件的配置:
<bean id="userService" class="com.user.demo.service.UserServiceImpl"></bean>
<bean id="log" class="com.user.demo.service.Log.Log"></bean>
使用<aop:config>标签来表示这是一个AOP的配置
<aop:config>
使用<aop:proutcut>标签来定义一个横切点
expression="execution(* com.user.demo.service.*.*(..))"中的execution是固定格式,后面是我们定义的横切点所在的具体位置
第一个*表示所有返回值,第二个*表示包下的所有类,第三个*表示类中的所有方法,..表示方法中的所有参数
<aop:pointcut id="user" expression="execution(* com.user.demo.service.*.*(..))"></aop:pointcut>
使用<aop:advisor>标签来定义具体横切点要切入的连接点
<aop:advisor advice-ref="log" pointcut-ref="user"></aop:advisor>
</aop:config>
3.重写方法参数的详解:moethod:调用方法的对象 args:调用方法的参数 target:调用方法的目标对象
2.后置通知:实现AfterReturningAdvice接口,重写接口中的afterReturning方法
1.代码实现:
public class Safeware implements AfterReturningAdvice {
public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
System.out.println(o1.getClass().getName()+"方法被执行,"+"返回值是"+o);
}
}
2.xml文件配置:
<bean id="safeware" class="com.user.demo.service.safe.Safeware"></bean><bean id="userService" class="com.user.demo.service.UserServiceImpl"></bean>
<bean id="log" class="com.user.demo.service.Log.Log"></bean>
<aop:config>
<aop:pointcut id="user" expression="execution(* com.user.demo.service.UserServiceImpl.*(..))"></aop:pointcut>
<aop:advisor advice-ref="log" pointcut-ref="user"></aop:advisor>
<aop:advisor advice-ref="safeware" pointcut-ref="user"></aop:advisor>
</aop:config>
3.重写方法的参数详解:o表示我们方法要返回的类型,其他参数同前置通知
3.自定义类实现AOP:
1.代码实现:
public class Commos {
public void Log(){
System.out.println("打印日志");
}
public void Safeware(){
System.out.println("环境安全");
}
}
2.xml文件配置:
<bean id="userService" class="com.user.demo.service.UserServiceImpl"></bean><bean id="log" class="com.user.demo.service.Log.Commos"></bean><aop:config><aop:aspect ref="log"><aop:pointcut id="user" expression="execution(* com.user.demo.service.*.*(..))"></aop:pointcut><aop:before method="Log" pointcut-ref="user"></aop:before><aop:after method="Safeware" pointcut-ref="user"></aop:after></aop:aspect></aop:config>
使用注解来实现AOP:
1.代码实现:
@Aspect
public class Commos {
@Before("execution(* com.user.demo.service.*.*(..))")
public void Log(){
System.out.println("打印日志");
}
@After("execution(* com.user.demo.service.*.*(..))")
public void Safeware(){
System.out.println("环境安全");
}
@Around("execution(* com.user.demo.service.*.*(..))")
public Object sayHello(ProceedingJoinPoint point) throws Throwable {
System.out.println("环绕前");
System.out.println("方法签名:"+point.getSignature());
Object result = point.proceed();
System.out.println("环绕后");
return result;
}
}
2.xml文件配置:
<bean id="userService" class="com.user.demo.service.UserServiceImpl"></bean> <bean id="log" class="com.user.demo.service.Log.Commos"></bean> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>3.环绕通知中的环绕前和环绕后都在前置通知和后置通知之前执行4.方法:point.getSignature()来返回我们的方法签名,也就是包名和类名point.procced()执行方法