Публичный аккаунт 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, чтобы узнать больше.