предисловие
Текст был включен в мой репозиторий GitHub, добро пожаловать, звезда:GitHub.com/bin39232820…
Лучшее время для посадки дерева было десять лет назад, затем сейчас
Я знаю, что многие люди не играютqqТеперь, но с ностальгией, добро пожаловать в группу Six Meridian Excalibur по изучению Java для новичков, номер группового чата:549684836Поощряйте всех вести блог на пути к технологиям
болтовня
Некоторые реальные события, с которыми недавно столкнулся Сяо Люлю в проекте, и записал некоторые записи об aop
AOP
Аспектно-ориентированное программирование, Spring АОП существует для разделения, АОП позволяет группе классов использовать одно и то же поведение, В ООП связанность кода может быть увеличена только за счет наследования классов и реализации интерфейсов, а интеграция классов может быть только одним Наследованием , предотвращая добавление дополнительных вариантов поведения в один и тот же класс, АОП компенсирует отсутствие ООП.
Spring поддерживает аннотированное аспектное программирование AspectJ.
- Объявите аспект, используя @AspectJ
- Используйте @After, @Before, @Around для определения совета (advice), можно напрямую использовать правило перехвата (pointcut) в качестве параметра.
- Среди них правила перехвата параметров @After, @Before, @Around — это pointcuts (PointCut).Чтобы повторно использовать pointcuts, вы можете использовать @PointCut для определения правил перехвата, а затем вызывать их в параметрах @After, @До и @Вокруг.
- Каждое из перехватываемых мест, соответствующих условиям, является точкой соединения (JoinPoint)
На самом деле, конкретное использование также очень просто.Ниже приведен код, написанный самим Сяо Люлю.
Но когда я начал его использовать, у меня возникли некоторые проблемы,
- Сначала я использовал эту пользовательскую аннотацию в FeignClient, как на следующем рисунке.
Но я обнаружил проблему. Таким образом, хотя мы можем успешно принять наш аспект, когда параметр пользовательской аннотации получается в аспекте, он всегда равен нулю. Это очень раздражает, как следует
Почему он пустой? Получается, что аннотация @FeignClient была расширена Spring, поэтому, когда вы разрезаете аспект, это уже прокси-класс, поэтому вы не можете получить этот контент? У меня еще есть такой геймплей, ладно, тогда давайте изменим геймплей,
Сяо Люлю придумал решение, я выбрал один метод, а затем перешел к другому методу, чтобы вырезать поверхность, чтобы ее можно было завершить, ха-ха, я хочу быть идеальным. Однако этого не произошло, и в итоге даже поверхность среза не могла попасть внутрь. блять, в чем причина?
Анализ причин
На самом деле указанная выше причина на самом деле очень проста, потому что метод, который я извлек, использует это, и это представляет текущий объект, поэтому давайте посмотрим, что представляет собой текущий объект. Контроллер
ServiceImp
Очевидно, что текущий объект является Java-объектом, и когда он вызывается, это объект с пружинным расширением Только объект с пружинным расширением имеет возможность обращения.
Таким образом, можно сделать вывод, что вызывающая сторона метода, iPaperService, является экземпляром объекта, который не был улучшен с помощью Spring AOP. Итак, идея решения проблемы есть, найти способ использовать расширенный экземпляр HelloService для вызова!
Решение
Способ 1: внедрить экземпляр самого себя с помощью Autowired
Во-первых, Spring поддерживает циклические зависимости, так что инжектить можно и самому.
Способ 2: получить ссылку на расширенный экземпляр из контекста Spring
конец
Запись небольшой проблемы здесь. Надеюсь поможет тем, кто столкнется
ежедневные комплименты
Хорошо всем, вышеизложенное является полным содержанием этой статьи. Люди, которые могут видеть это здесь, всенастоящий порошок.
Творить нелегко. Ваша поддержка и признание — самая большая мотивация для моего творчества. Увидимся в следующей статье.
Six Meridians Excalibur | Text [Original] Если в этом блоге есть какие-то ошибки, прошу покритиковать и посоветовать, буду очень признателен!