浅析AOP与OOP
2015-07-23 10:10
585 查看
原文链接:http://blog.csdn.net/a1314517love/article/details/11847087
AOP为Aspect OrientedProgramming的缩写,意为面向切面编程。那什么又是面向切面?它与仅有一字之差的OOP又有着什么样的区别与联系?所谓的面向切面编程其实是对业务逻辑又进行了进一步的抽取,将多种业务逻辑中的公用部分抽取出来做成一种服务(比如日志记录,性能统计,安全验证等),从而实现代码复用。另外这种服务通过配置可以动态的给程序添加统一控制,利用AOP可以对业务逻辑的各个部分进行分离,从而使得业务逻辑各部分之间的耦合度降低。要进一步了解AOP我们首先要弄清楚这几个概念指的是什么:
1. Cross Cutting Concern:是一种独立服务,它会遍布在系统的处理流程之中
2. Aspect 对横切行关注点的模块化
3. Advice对横切行关注点的具体实现(有分类的概念,之前,之后,throw)
4. Pointcut 它定义了Advice应用到哪些JoinPoint上,对Spring来说是方法调用
5. Weave 将Advice应用target Object上的过程叫织入,Spring支持的是动态织入
6. Target Object Advice被应用的对象
7. Proxy:Spring AOP默认使用JDK的动态代理,它的代理是运行时创建,也可以使用CGLIB代理
8.Introduction 可以动态的为类添加方法
9.JoinPoint:Advice在应用程序上执行的点或时机,Spring只支持方法的JointPoint
这些概念听上去还是比较抽象的,下面我们通过AOP的原理图和实例来具体看一下这些概念具体指的是什么。
原理图:
代码:
Client类:
[java] view
plaincopy
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext-beans.xml");
UserManager userManager = (UserManager)factory.getBean("userManager");
//userManager.addUser("张三", "123");
userManager.delUser(123);
//String name = userManager.findUserById(100);
//System.out.println(name);
}
}
SecurityHandler类:
[java] view
plaincopy
public class SecurityHandler {
public void checkSecurity(){
System.out.println("-----------checkSecurity()------------");
}
}
UserManager接口:
[java] view
plaincopy
public interface UserManager {
public void addUser(String username,String password);
public void delUser(int userId);
public String findUserById(int userId);
public void modifyUser(int userId,String username,String password);
}
UserManagerImpl类:
[java] view
plaincopy
public class UserManagerImpl implements UserManager {
@Override
public void addUser(String username, String password) {
System.out.println("-----------UserManagerImpl.addUser()-------------");
}
@Override
public void delUser(int userId) {
System.out.println("-----------UserManagerImpl.delUser()-------------");
}
@Override
public String findUserById(int userId) {
System.out.println("-----------UserManagerImpl.findUserById()-------------");
return "张三";
}
@Override
public void modifyUser(int userId, String username, String password) {
System.out.println("-----------UserManagerImpl.modifyUser()-------------");
}
}
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对一个动作进行封装,则有点不伦不类。
AOP为Aspect OrientedProgramming的缩写,意为面向切面编程。那什么又是面向切面?它与仅有一字之差的OOP又有着什么样的区别与联系?所谓的面向切面编程其实是对业务逻辑又进行了进一步的抽取,将多种业务逻辑中的公用部分抽取出来做成一种服务(比如日志记录,性能统计,安全验证等),从而实现代码复用。另外这种服务通过配置可以动态的给程序添加统一控制,利用AOP可以对业务逻辑的各个部分进行分离,从而使得业务逻辑各部分之间的耦合度降低。要进一步了解AOP我们首先要弄清楚这几个概念指的是什么:
1. Cross Cutting Concern:是一种独立服务,它会遍布在系统的处理流程之中
2. Aspect 对横切行关注点的模块化
3. Advice对横切行关注点的具体实现(有分类的概念,之前,之后,throw)
4. Pointcut 它定义了Advice应用到哪些JoinPoint上,对Spring来说是方法调用
5. Weave 将Advice应用target Object上的过程叫织入,Spring支持的是动态织入
6. Target Object Advice被应用的对象
7. Proxy:Spring AOP默认使用JDK的动态代理,它的代理是运行时创建,也可以使用CGLIB代理
8.Introduction 可以动态的为类添加方法
9.JoinPoint:Advice在应用程序上执行的点或时机,Spring只支持方法的JointPoint
这些概念听上去还是比较抽象的,下面我们通过AOP的原理图和实例来具体看一下这些概念具体指的是什么。
原理图:
代码:
Client类:
[java] view
plaincopy
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext-beans.xml");
UserManager userManager = (UserManager)factory.getBean("userManager");
//userManager.addUser("张三", "123");
userManager.delUser(123);
//String name = userManager.findUserById(100);
//System.out.println(name);
}
}
SecurityHandler类:
[java] view
plaincopy
public class SecurityHandler {
public void checkSecurity(){
System.out.println("-----------checkSecurity()------------");
}
}
UserManager接口:
[java] view
plaincopy
public interface UserManager {
public void addUser(String username,String password);
public void delUser(int userId);
public String findUserById(int userId);
public void modifyUser(int userId,String username,String password);
}
UserManagerImpl类:
[java] view
plaincopy
public class UserManagerImpl implements UserManager {
@Override
public void addUser(String username, String password) {
System.out.println("-----------UserManagerImpl.addUser()-------------");
}
@Override
public void delUser(int userId) {
System.out.println("-----------UserManagerImpl.delUser()-------------");
}
@Override
public String findUserById(int userId) {
System.out.println("-----------UserManagerImpl.findUserById()-------------");
return "张三";
}
@Override
public void modifyUser(int userId, String username, String password) {
System.out.println("-----------UserManagerImpl.modifyUser()-------------");
}
}
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对一个动作进行封装,则有点不伦不类。
相关文章推荐
- yui3的AOP(面向切面编程)和OOP(面向对象编程)
- JavaScript AOP编程实例
- JavaScript OOP面向对象介绍
- 使用AOP改善javascript代码
- 初识SmartJS - AOP三剑客
- PHP高级OOP技术演示
- java使用动态代理来实现AOP(日志记录)的实例代码
- JavaScript之AOP编程实例
- Javascript aop(面向切面编程)之around(环绕)分析
- php笔记之:AOP的应用
- 实例讲解Java的Spring框架中的AOP实现
- autoload-cache-1.7 发布
- Spring3 AOP配置异常。执行时间记录
- AOP切面编程
- spring 切面memcached的环绕通知
- 关于HouseMD
- Spring AOP介绍及源码分析
- 基于 Java 语言的极速 WEB + ORM 框架 JFinal 1.6 发布
- SpringAOP实现自动生成日志
- Spring Aspect Oriented Programming