AOP概念理解

  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!

 

  

 

 

你可能感兴趣的:(spring,AOP,sql,编程,oop)