Теоретическая основа Spring — аспектно-ориентированное программирование

Java задняя часть Spring Шаблоны проектирования

последовательность

AOPдаAspect-Oriented ProgrammingАббревиатура в китайском переводе означает аспектно-ориентированное программирование. в видеSpringОдна из характеристик — усердно учиться.

Во-первых, название аспектно-ориентированное программирование очень напоминает объектно-ориентированное программирование (OOP)Приходить. Мы знаем, что объектно-ориентированное программирование заключается в разделении системы на несколько классов сверху вниз, напримерWebчасто встречается в проектахController,Service,Daoравные слои. Однако объектно-ориентированное программирование очень бессильно для горизонтальной абстракции слева направо, и код, похожий на функции системного уровня, такие как ведение журнала и разрешения, будет неоднократно появляться повсюду. Проще говоря, аспектно-ориентированное программирование является дополнением к объектно-ориентированному программированию, оно может собирать некоторые разрозненные и повторяющиеся коды в системе и абстрагировать их в аспект. Давайте сначала возьмем пример:

Существует система управления, используемая внутри компании,ControllerКаждый интерфейс в звонке должен записывать текущее имя пользователя, текущее время и другие параметры.

Очевидно, что код реализации этого требования дублируется в каждом интерфейсе. Даже если общедоступный метод извлекается в общедоступный класс, в каждом интерфейсе есть вызов общедоступного метода, что приводит к связыванию между классами.

接口流程图

Мы надеемся удалить код записи в исходном интерфейсе, чтобы эти интерфейсы сосредоточились только на своей собственной бизнес-логике. Затем используйте динамический прокси-сервер перед компиляцией или во время выполнения, чтобы добавить функцию ведения журнала в интерфейс без изменения кода интерфейса.Идея программирования динамического вплетения кода в указанный метод и позицию класса — это аспектно-ориентированное программирование.

接口流程图(添加AOP)

концепция

Некоторые специфические концепции аспектно-ориентированного программирования.

Глава 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): повторное изучение аспектов весны