последовательность
AOP
даAspect-Oriented Programming
Аббревиатура в китайском переводе означает аспектно-ориентированное программирование. в видеSpring
Одна из характеристик — усердно учиться.
Во-первых, название аспектно-ориентированное программирование очень напоминает объектно-ориентированное программирование (OOP
)Приходить. Мы знаем, что объектно-ориентированное программирование заключается в разделении системы на несколько классов сверху вниз, напримерWeb
часто встречается в проектахController
,Service
,Dao
равные слои. Однако объектно-ориентированное программирование очень бессильно для горизонтальной абстракции слева направо, и код, похожий на функции системного уровня, такие как ведение журнала и разрешения, будет неоднократно появляться повсюду. Проще говоря, аспектно-ориентированное программирование является дополнением к объектно-ориентированному программированию, оно может собирать некоторые разрозненные и повторяющиеся коды в системе и абстрагировать их в аспект. Давайте сначала возьмем пример:
Существует система управления, используемая внутри компании,Controller
Каждый интерфейс в звонке должен записывать текущее имя пользователя, текущее время и другие параметры.
Очевидно, что код реализации этого требования дублируется в каждом интерфейсе. Даже если общедоступный метод извлекается в общедоступный класс, в каждом интерфейсе есть вызов общедоступного метода, что приводит к связыванию между классами.
Мы надеемся удалить код записи в исходном интерфейсе, чтобы эти интерфейсы сосредоточились только на своей собственной бизнес-логике. Затем используйте динамический прокси-сервер перед компиляцией или во время выполнения, чтобы добавить функцию ведения журнала в интерфейс без изменения кода интерфейса.Идея программирования динамического вплетения кода в указанный метод и позицию класса — это аспектно-ориентированное программирование.
концепция
Некоторые специфические концепции аспектно-ориентированного программирования.
Глава 8 "ЭКСПЕРТНАЯ РАЗРАБОТКА J2EE ОДИН НА ОДИН БЕЗ EJB", Глава 4 "Spring Combat":
-
Усилить(совет, также переводится как уведомление, но автор «Практики разработки корпоративных приложений Spring3.x» не согласен): Действия, выполняемые в конкретной точке подключения. Код реализации в примере является расширением.
-
Точка отсечки(pointcut): общий термин для набора точек соединения, указывающих, когда должно вызываться расширение. В примере указывается, какие интерфейсы и местоположения являются точками.
-
Соединение(точка соединения): точка, в которую аспект может быть вставлен во время выполнения приложения. Конкретная комбинация интерфейса и указанного местоположения в примере является точкой подключения.
-
раздел(аспект): комбинация советов (т. е. улучшений) и точечных сокращений.
AOP
существуетSpring
В основном реализуется через динамический прокси, а конкретная реализация тоже делится на два типа:JDK动态代理
а такжеCGLIB动态代理
. вJDK动态代理
основан на интерфейсном прокси,CGLIB动态代理
основан на прокси наследования.
Динамический прокси JDK
в видеJava
Поставляется с технологией динамического прокси,JDK动态代理
Преимущество заключается в том, что он использует технологию отражения для генерации прокси-классов, которая относительно эффективна при генерации. Недостатком является то, что его можно проксировать только динамически на основе интерфейса.Если целевой класс не реализует какой-либо интерфейс, его нельзя использовать.JDK动态代理
из.
см. использованиеJDK动态代理
пример.
public class DynamicProxy implements InvocationHandler {
/**
* 被代理类
*/
private Object target;
public DynamicProxy(Object target) {
this.target = target;
}
public static Object bind(Object target) {
InvocationHandler invocationHandler = new DynamicProxy(target);
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), invocationHandler);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName() + " 方法执行前");
//执行被代理类方法
Object ret = method.invoke(target, args);
System.out.println(method.getName() + " 方法执行后");
return ret;
}
public static void main(String[] args) {
Dao dao = new OrderDao();
dao.doSomeThing();
Dao daoProxy = (Dao) DynamicProxy.bind(dao);
daoProxy.doSomeThing();
}
}
public class OrderDao implements Dao {
@Override
public void doSomeThing() {
System.out.println("test");
}
}
public interface Dao {
void doSomeThing();
}
输出:
test
doSomeThing 方法执行前
test
doSomeThing 方法执行后
Process finished with exit code 0
постскриптум
На этот раз я просто разбираю концепции и записываю концепции АОП, которые я понимаю. Я также ссылался на многие статьи, и они в целом совпадают с некоторыми различиями в деталях.Я напишу, что я понял, и пусть все видят, если что-то не так. Кстати, устроив так, чтобы люди не знали, с чего начать, когда кто-то просит их помедлить в будущем. не понялSpring
в конкретныхAOP
Чтобы быть реализованным, заинтересованные студенты могут узнать больше об этом самостоятельно.
использованная литература
Что такое аспектно-ориентированное программирование АОП?
Хорошие книги для совместного чтения (115): повторное изучение аспектов весны