2-4 AOP的概念


什么是AOP

Spring是用来解决实际开发中的一些问题的,AOP解决了OOP中遇到的一些问题,是OOP的延续和扩展。我们可从以下三个方面来理解AOP:

  1. 扩展功能不是通过修改源代码而实现的。 
    可通过Struts2框架中的拦截器来理解。
  2. AOP采用横向抽取机制实现。 
    要理解横向抽取机制,就必须认识纵向抽取机制。例如有如下的一个类:

    public class User {
        public void add() {
            添加的逻辑...
        }
    }

    现在我们在add()方法中要扩展一个功能,即日志添加功能,添加完该功能之后,可记录在什么时候添加了哪个用户。想到的最原始的方法就是直接修改源代码。

    public class User {
        public void add() {
            添加的逻辑...
            直接写添加日志记录的代码以实现...
        }
    }

    很显然这是一种愚蠢的做法,并且这儿还有一个原则——修改功能一般不是直接修改源代码来实现的。顺其自然地就要来讲纵向抽取机制了,这时我们可编写一个BaseUser类。

    public class BaseUser {
        public void wirtelog() {
            记录日志的逻辑...
        }
    }

    接下来让User类继承BaseUser类,如下:

    public class User extends BaseUser  {
        public void add() {
            添加的逻辑...
            // 记录日志
            super.wirtelog();
        }
    }

    这样是不是就万事大吉了呢?你懂的!因为当父类的方法名称变化时,子类调用的方法也必然要进行修改。最后终于要讲横向抽取机制了,横向抽取机制分为两种情况,下面分别加以简单阐述。 
    有接口情况的横向抽取机制: 
    例如有一个如下接口:

    public interface UserDao {
        public void add();
    }

    接口的一个实现类如下:

    public class UserDaoImpl implements UserDao {
        public void add() {
            ...
        }
    }

    我们现在即可使用动态代理技术增强类里面的方法,即创建接口的实现类代理对象,并增强UserDaoImpl类里面的add()方法。 
    无接口情况的横向抽取机制: 
    例如有一个如下User类:

    public class User {
        public void add() {
            ...
        }
    }

    我们也可使用动态代理技术增强类里面的方法,即创建被增强方法所在类的子类代理对象,并增强User类里面的add()方法。

  3. AOP底层使用动态代理实现 
    • 有接口情况:创建接口实现类代理对象,jdk动态代理  (创建一个与 增强方法所在类 平级的对象,不是真正的对象,代理对象,实现和daoImpl相同的功能)
    • 没有接口情况:创建增强方法所在类的子类代理对象,使用cglib动态代理

猜你喜欢

转载自blog.csdn.net/qq_38793958/article/details/80326063
2-4