AOP?什么东西?OK,Follow me,你将发现这没想象中的难!
先来理理这玩意儿的概念
AOP,即Aspect-Oriented Programming的简写,也就是面向切面编程,也有人说成面向方面编程,不过个人觉得还是第一种叫法更值得推崇。实际上呢,AOP也不是什么新技术,早在1997年就由Gregor Kiczales在Palo Alto研究中心领导的一个研究小组提出,他是一种编程思想,我们Java呢,是一种面向对象的语言(Object-Oriented Progr amming,OOP),而AOP则是对OOP的一种强有力的补充。
刚学Java的时候,像Spring、Hibernate、Struts等等之类的框架根本没有涉及,所以呢,在写系统对数据库操作的时候,通常都是JDBC,自己写SQL,自己在DAO中管理数据库事务,形如这样:
Connection conn = null; Statement stmt = null; try { Monitor.start();//性能监测开始 Logger.info("...");//日志信息打印 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/HourseSystem"); conn.setAutoCommit(false);//将自动提交设为false stmt = conn.createStatement(); stmt.executeUpdate(" update userinfo_tbl set ..");//诸如此类的SQL语句 conn.commit();//事务提交 Monitor.end();//性能监测结束 } catch (SQLException e) { e.printStackTrace(); try { conn.rollback();//异常,回滚事务,取消更新操作 } catch (SQLException ex) { ex.printStackTrace(); } } finally { try{ //资源清理 if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } }catch(SQLException e){ e.printStackTrace(); } }
看看这段代码,你可能会发现这几个问题:1、这么多的try{}catch{}块;2、每个操作都要获取数据库连接;3、手动的控制事务和资源清理工作;4、写了这么多,实际上,真正核心的就只有
stmt.executeUpdate(" update userinfo_tbl set ..");//诸如此类的SQL语句
这句是核心业务功能,5、与业务无关的性能监测和日志代码也放在这里。你也许还好列出一些等等诸如此类的问题。
好吧,我承认,这段代码确实在扩展性上、解耦性上、可维护性上存在重要的问题,写了太多的无关业务逻辑的语句了,看起来相当的累赘,看起来也不那么的雅观,像数据库事务、资源管理、异常处理等等之类的问题,Spring自有提供不错的解决方案,而性能监测和日志这类非业务功能,在OOP没有提供很好的解耦方案的前提下,我们都可以运用AOP来进行解决。
我只想把我的集中点放在我的业务实现上,性能检测、日志输出与我何干,OK,所以,必须得寻找最佳的解决方案。AOP的实现者,为我们做好了这一系列的工作,如:AspectJ、Spring AOP...,太棒了,有存在的框架可以用。
接下来,来说说AOP中的一些比较新颖的名词吧:
Joinpoint(连接点):程序执行过程中能够插入切面的特定位置,从而添加新的行为;
Advice(通知、增强):织入连接点上的一段功能代码,也就是要完成的工作,通知定义了切面是什么以及何时使用,如上段代码中的Monitor.start()、Logger.info("...")等方法;
Pointcut(切点):定位到连接点,如果说,通知定义了切面的“什么”和“何时”,那么,切点就定义了切面的“何地”;
Aspect(切面):Pointcut和Advice组成,他们共同定义了切面的全部内容——他的功能,在何时以及何地完成。
Target(目标对象):要被织入切面的类,如果没有AOP,则这个对象里的方法就会像我上面的那样,里面会放入很多无关业务逻辑的方法;
Proxy(代理):被织入切面后的类;
Introduction(引介):特殊的Advice,可以动态地为目标类添加接口的逻辑实现,相当的棒;
Weaving(织入):把切面应用到Target对象,创建Proxy对象的过程,织入生成目标对象的方式有这么几种:
1)编译时:切面在目标类编译时被织入;
2)类加载时:切面在目标类加载到JVM时被织入;
3)运行时:切面在程序运行的某个时刻被织入。
还真多,现在让我们来总结一下:
通知包含要应用于程序对象的交叉行为,连接点是程序执行过程中能够应用通知的全部点,切入点定义了应用通知的地点(在哪个连接点),切入点定义了哪些连接点会得到通知。
这些概念先消化消化,所以,AOP,See you later!