AOP与OOP的区别

AOP为Aspect OrientedProgramming的缩写,意为面向切面编程。那什么又是面向切面?它与仅有一字之差的OOP又有着什么样的区别与联系?所谓的面向 切面编程实际上是对业务逻辑又进行了进一步的抽取,将多种业务逻辑中的公用部分抽取出来作成一种服务(好比日志记录,性能统计,安全验证等),从而实现代码 复用。另外这种服务经过配置能够动态的给程序添加统一控制,利用AOP能够对业务逻辑的各个部分进行分离,从而使得业务逻辑各部分之间的耦合度下降。要进 一步了解AOP咱们首先要弄清楚这几个概念指的是什么:java

1. Cross Cutting Concern:是一种独立服务,它会遍及在系统的处理流程之中编程

2. Aspect 对横切行关注点的模块化安全

3. Advice对横切行关注点的具体实现(有分类的概念,以前,以后,throw)app

4. Pointcut 它定义了Advice应用到哪些JoinPoint上,对Spring来讲是方法调用ide

5. Weave 将Advice应用target Object上的过程叫织入,Spring支持的是动态织入模块化

6. Target Object  Advice被应用的对象函数

7. Proxy:Spring AOP默认使用JDK的动态代理,它的代理是运行时建立,也可使用CGLIB代理性能

8.Introduction 能够动态的为类添加方法   spa

9.JoinPoint:Advice在应用程序上执行的点或时机,Spring只支持方法的JointPoint.net

这些概念听上去仍是比较抽象的,下面咱们经过AOP的原理图和实例来具体看一下这些概念具体指的是什么。

原理图:

代码:

Client类:

[java] view plaincopy

  1. public class Client {  

  2.   

  3.     /** 

  4.      * @param args 

  5.      */  

  6.     public static void main(String[] args) {  

  7.         BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext-beans.xml");  

  8.         UserManager userManager = (UserManager)factory.getBean("userManager");  

  9.         //userManager.addUser("张三", "123");  

  10.           userManager.delUser(123);  

  11.             //String name = userManager.findUserById(100);  

  12.            //System.out.println(name);  

  13.     }  

  14. }  


SecurityHandler类:

[java] view plaincopy

  1. public class SecurityHandler {  

  2.       

  3.     public void checkSecurity(){  

  4.         System.out.println("-----------checkSecurity()------------");  

  5.     }  

  6. }  


UserManager接口:

[java] view plaincopy

  1. public interface UserManager {  

  2.   

  3.     public void addUser(String username,String password);  

  4.       

  5.     public void delUser(int userId);  

  6.       

  7.     public String findUserById(int userId);  

  8.       

  9.     public void  modifyUser(int userId,String username,String password);  

  10.       

  11. }  


UserManagerImpl类:

[java] view plaincopy

  1. public class UserManagerImpl implements UserManager {  

  2.   

  3.     @Override  

  4.     public void addUser(String username, String password) {  

  5.         System.out.println("-----------UserManagerImpl.addUser()-------------");  

  6.   

  7.     }  

  8.   

  9.     @Override  

  10.     public void delUser(int userId) {  

  11.         System.out.println("-----------UserManagerImpl.delUser()-------------");  

  12.   

  13.     }  

  14.   

  15.     @Override  

  16.     public String findUserById(int userId) {  

  17.         System.out.println("-----------UserManagerImpl.findUserById()-------------");  

  18.         return "张三";  

  19.     }  

  20.   

  21.     @Override  

  22.     public void modifyUser(int userId, String username, String password) {  

  23.         System.out.println("-----------UserManagerImpl.modifyUser()-------------");  

  24.   

  25.     }  

  26. }  


Cross cutting concern:从图中能够看出AOP所提供的是一个安全验证服务,这种安全验证服务就是图中Cross cutting  concern(横切关注点)。

SecurityHandler是对横切关注点的模块化。

SecurityHandler代码中的checkDelSecurity()方法,checkAddSecurity()方法等是对横切关注点的具体实现称为Advice,有三种状况分别为After,Before,Throw。

Pointcut, SecurityHandler类中的以@Pointcut注解进行描述的addAddMethod()等方法成为切入点。

Join Point,当调用以某种规则命名的函数时执行Advice。在代码中的体现就是当执行UserManager中以“add”开头的函数addUser()后,紧接着执行checkAddSecurity()。

 

AOP与OOP的区别:

AOP、OOP在字面上虽然很是相似,但倒是面向不一样领域的两种设计思想。OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以得到更加清晰高效的逻辑单元划分。

而AOP则是针对业务处理过程当中的切面进行提取,它所面对的是处理过程当中的某个步骤或阶段,以得到逻辑过程当中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差别。

举 个简单的例子,对于“雇员”这样一个业务实体进行封装,天然是OOP/OOD的任务,咱们能够为其创建一个“Employee”类,并将“雇员”相关的属 性和行为封装其中。而用AOP设计思想对“雇员”进行封装将无从谈起。一样,对于“权限检查”这一动做片段进行划分,则是AOP的目标领域。而经过 OOD/OOP对一个动做进行封装,则有点不三不四。

相关文章
相关标签/搜索