АОП-идея серии фреймворков Spring

задняя часть WeChat Spring SSH

Публичный аккаунт WeChat: compassblog

Добро пожаловать, чтобы следовать, двигаться вперед, учиться друг у друга и добиваться прогресса вместе!

Если у вас есть какие-либо вопросы, пожалуйста, оставьте сообщение в фоновом режиме!

1. Обзор АОП

(1), что такое АОП

АОП — это аббревиатура Аспектно-ориентированного программирования, что означает «Аспектно-ориентированное программирование». АОП является продолжением ООП (объектно-ориентированного), которое может изолировать различные части бизнеса, тем самым уменьшая связь между различными частями бизнес-логики и повышая возможность повторного использования и эффективность разработки программы.

(2), диаграмма идеи АОП: горизонтальное повторение, вертикальное вырезание

  • фильтр


  • перехватчик


  • управление транзакциями


(3) Функции, которые может выполнять АОП

  • АСД

  • протоколирование

  • контроль производительности

  • контроль транзакций

(4) Два прокси-механизма реализованы в нижней части АОП.

  • Динамический прокси JDK: создание прокси для классов, реализующих интерфейсы

  • Динамический прокси Cglib: создайте прокси для класса, который не реализует интерфейс, и примените базовую технологию улучшения байт-кода для создания объекта подкласса текущего класса.

2. Основной принцип реализации АОП Spring

(1) Динамический прокси JDK расширяет метод в классе: прокси-объект должен реализовывать интерфейс для создания прокси-объекта. При отсутствии интерфейса невозможно будет использовать технологию динамического прокси.

public class MyJDKProxy implements InvocationHandler { 

     private UserDao userDao; 

     public MyJDKProxy(UserDao userDao) {   
         this.userDao = userDao; 
     } 

    public UserDao createProxy(){
        UserDao  userDaoProxy  =  (UserDao)Proxy.newProxyInstance(userDao.getClass().getClassLoader(),userDao.getClass().getInterfaces(), this);
        return userDaoProxy;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
    {
        if("save".equals(method.getName())){
            System.out.println("权限校验=============
        } 
        return method.invoke(userDao, args); 
    } 
} 

(2) Динамический прокси Cglib расширяет методы класса: он может генерировать прокси для любого класса Принцип прокси заключается в том, чтобы наследовать прокси для целевого объекта. Если целевой объект является окончательным, класс не может быть проксирован cglib.

public class MyCglibProxy implements MethodInterceptor{ 

    private CustomerDao customerDao; 

    public MyCglibProxy(CustomerDao customerDao){   
        this.customerDao = customerDao; 
 } 

      // 生成代理的方法: 
    public CustomerDao createProxy(){ 
      // 创建Cglib的核心类: 
    Enhancer enhancer = new Enhancer(); 
      // 设置父类: 
      enhancer.setSuperclass(CustomerDao.class); 
      // 设置回调: 
      enhancer.setCallback(this); 
      // 生成代理: 
      CustomerDao customerDaoProxy = (CustomerDao) enhancer.create();   
      return customerDaoProxy; 
 } 

    @Override
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
    if("delete".equals(method.getName())){
        Object obj = methodProxy.invokeSuper(proxy, args);
        System.out.println("日志记录================");
        return obj;
        }
        return methodProxy.invokeSuper(proxy, args);
    }
}

3. Термины, относящиеся к Spring, основанные на разработке AspectJ AOP

  • Точка соединения (connection point): Так называемая точка соединения относится к тем точкам, которые перехватываются. В Spring эти точки относятся к методам, потому что Spring поддерживает только точки соединения типа method

  • Pointcut: так называемая точка входа относится к определению, какой JOINPOINT перехватывается?

  • Совет: так называемое уведомление заключается в том, что то, что вы хотите сделать после перехвата, для JoinPoint уведомляется, уведомляя о предварительном уведомлении, заднем уведомлении, уведомлении об аномалии, окончательном уведомлении, объемном уведомлении (функция должна быть завершена)

  • Введение: введение — это специальное уведомление. Без изменения кода класса введение может динамически добавлять некоторые методы или поля в класс во время выполнения.

  • Цель (целевой объект): целевой объект агента

  • Плетение: относится к процессу применения улучшений к целевым объектам для создания новых прокси-объектов. Spring использует динамическое прокси-переплетение, в то время как AspectJ использует переплетение во время компиляции и загрузку классов.

  • Прокси: после того, как класс расширен с помощью АОП, он создает результирующий прокси-класс.

  • Аспект (аспект): представляет собой сочетание pointcut и совета (введение)

Вы также можете понравиться:


Эта серия будет обновляться позже, пожалуйста, обратите внимание!


Если вы считаете эту статью полезной, поделитесь ею с друзьями!

Данная статья может быть воспроизведена по желанию, просьба указывать источник!


Отсканируйте и подпишитесь на общедоступную учетную запись WeChat, чтобы узнать больше.