一、AOP简介
AOP:Aspect Oreinted Programming:面向切面编程
OOP:Object Oreinted Programming:面向对象编程
AOP含义:AOP是在不改变原来OOP类代码的基础上,对原来类功能进行拓展
AOP作用:解决了软件工程中的关注点分离问题。可以让系统变得高内聚,低耦合,便于项目的后期维护和拓展
AOP底层:动态代理
二、案例
第一步:创建动态web工程,导入jar包
com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
commons-logging-1.1.3.jar
spring-aop-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
第二步:需要将被拓展的类和拓展的类加到容器中:扫描包+注解
applicationContext.xml文件
<context:component-scan base-package="com.atguigu"></context:component-scan> <!--开启基于注解的切面支持--> <aop:aspectj-autoproxy/>
caculator接口:
package com.atguigu.caculator; public interface Caculator { public int add(int i, int j); public int sub(int i, int j); public int mul(int i, int j); public int div(int i, int j); }
实现类:
package com.atguigu.caculator.Impl; import com.atguigu.caculator.Caculator; import org.springframework.stereotype.Component; @Component public class CaculatorImpl implements Caculator { @Override public int add(int i, int j) { System.out.println(i + j); return i + j; } @Override public int sub(int i, int j) { return i - j; } @Override public int mul(int i, int j) { return i * j; } @Override public int div(int i, int j) { return i / j; } }
切面类:
package com.atguigu.aspect; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Component @Aspect //注解切面类 public class LogAscept { @Before(value = "execution(public int com.atguigu.caculator.Impl.CaculatorImpl.add(int,int))") public void beforeLog() { System.out.println("目标方法执行之前打印"); } @After(value = "execution(public int com.atguigu.caculator.Impl.CaculatorImpl.add(int,int))") public void afterLog() { System.out.println("目标方法执行之后打印"); } }
测试类:
public class Test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Caculator bean = context.getBean(Caculator.class); bean.add(2,5); } }
运行结果:
三、代理模式
静态代理:指的是只能代理某一个接口的实现类对象
模拟支付宝代理支付:
Payment支付接口
public interface Payment { public void pay(double money); }
PaymentImpl实现接口(相当于用户)
public class PaymentImpl implements Payment { @Override public void pay(double money) { System.out.println("用户确认支付" + money + "元钱"); } }
Alipay代理类(为用户代理支付)
public class Alipay implements Payment { private Payment payment; public Alipay(Payment payment) { this.payment = payment; } public void beforePay() { System.out.println("支付宝代理真实用户把钱从银行取出"); } @Override public void pay(double money) { beforePay(); this.payment.pay(money); afterPay(); } public void afterPay() { System.out.println("支付宝代理真实用户把钱付给商家"); } }
测试类:
public class Test { public static void main(String[] args) { Alipay alipay = new Alipay(new PaymentImpl()); alipay.pay(100.0); } }
运行结果: