AOP: (Aspect Oriented Programming) 面向切面编程。是目前软件开发中的一个热点,也是Spring框架中容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。
AOP、OOP在字面上虽然非常类似,但却是面向不同领域的两种设计思想。OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。 而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差异。
举个简单的例子,对于“雇员”这样一个业务实体进行封装,自然是OOP的任务,我们可以为其建立一个“Employee”类,并将“雇员”相关的属性和行为封装其中。而用AOP设计思想对“雇员”进行封装将无从谈起。同样,对于“权限检查”这一动作片断进行划分,则是AOP的目标领域。而通过OOP对一个动作进行封装,则有点不伦不类。 换而言之,OOP面向名词领域,AOP面向动词领域。
总之,AOP可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
这篇代码可能对于AOP稍微有些理解的同学看的会有助于加深理解。如果没去了解过可能看代码会有些吃力。
接口:Service.java
两个接口实现类:serviceImpl.java serviceImpl2.java
切面(增强代码):MyAspect.java
配置文件:springaop.xml
测试文件:Test.java
接口
package spring.aop;
public interface Service {
//一个接口
void add();
void update();
void delete();
}
两个接口实现类
1.
package spring.aop;
public class ServiceImpl implements Service {
//第一个特实现类
public void add() {
System.out.println("add");
}
public void update() {
System.out.println("udpate");
}
public void delete() {
System.out.println("delete");
}
}
2.
package spring.aop;
public class ServiceImpl2 implements Service {
//第二个实现类
public void add() {
System.out.println("add22");
}
public void update() {
System.out.println("update222");
}
public void delete() {
System.out.println("delete222");
}
}
切面(增强代码)
package aopxml; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; //切面 也就是增强的代码 public class MyAspect implements MethodInterceptor{ @Override public Object invoke(MethodInvocation mi) throws Throwable { System.out.print("----------前代码");//增强的代码 Object obj = mi.proceed(); System.out.println("----------后代码"); return obj; } }
配置文件
<?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" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <!-- 目标类 --> <bean id="service1" class="spring.aop.ServiceImpl"></bean> <bean id="service2" class="spring.aop.ServiceImpl2"></bean> <!-- 切面 --> <bean id="MyAspectId" class="aopxml.MyAspect"></bean> <aop:config> <aop:pointcut expression="execution(* spring.aop.Service*.add*(..))" <!-- 这里就是筛选过滤的地方,切入点表达式,具体请看上一篇 http://blog.csdn.net/qq_39654446/article/details/77886120 --> id="myPointCut"/> <aop:advisor advice-ref="MyAspectId" pointcut-ref="myPointCut"/> </aop:config> </beans>
package aopxml;import org.aopalliance.intercept.MethodInterceptor;import org.aopalliance.intercept.MethodInvocation;//切面 也就是增强的代码public class MyAspect implements MethodInterceptor{@Overridepublic Object invoke(MethodInvocation mi) throws Throwable {System.out.print("----------前代码");//增强的代码Object obj = mi.proceed();System.out.println("----------后代码");return obj;}}测试代码package aopxml; import org.springframework.context.support.ClassPathXmlApplicationContext; import spring.aop.Service; public class Teat { public static void main(String[] args) { ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("aopxml/springaop.xml"); Service service = (Service) ac.getBean("service2"); service.add(); System.out.println("-----------"); service.delete(); System.out.println("--------------"); service.update(); System.out.println("---------------"); Service service1 = (Service) ac.getBean("service1"); service1.add(); System.out.println("-------------------"); service1.delete(); System.out.println("------------------"); service1.update(); } }
最后输出的结果是这样的![]()