2013-03-16 5 views
61

Я изучаю концепции ориентированного на перспективу программирования и Spring AOP. Я не понимаю разницу между Pointcut и Joinpoint - оба они кажутся одинаковыми для меня. Pointcut - это то, где вы применяете свой совет, а Joinpoint - это также место, где мы можем применять наши рекомендации, тогда в чем разница?Spring AOP: В чем разница между JoinPoint и PointCut?

Пример среза точек может быть:

@Pointcut("execution(* * getName()") 

Что может быть примером Joinpoint?

ответ

96

Joinpoint: joinpoint является кандидат точка в Выполнение программы приложения, где аспект может быть подключен в этой точке может быть метод вызывается, исключение бросают, или даже. поле изменяется. Это те точки, где код вашего аспекта можно вставить в обычный поток вашего приложения, чтобы добавить новое поведение.

Совет: Это объект, который включает в себя API-вызовы для всей системы, представляющие действие, выполняемое в точке соединения, заданной точкой.

Pointcut: Точечный указатель определяет, на каких точках соединения следует применять соответствующий совет. Совет может применяться в любой точке соединения, поддерживаемой инфраструктурой AOP. Конечно, вы не хотите применять все свои аспекты во всех возможных точках соединения. Pointcuts позволяют указать, где вы хотите, чтобы ваш совет применялся.Часто вы указываете эти pointcut, используя явные имена классов и методов или регулярные выражения, которые определяют соответствующие шаблоны имен классов и методов. Некоторые рамки AOP позволяют создавать динамические точки, которые определяют, следует ли применять рекомендации, основанные на решениях времени выполнения, например значение параметров метода.

Данное изображение может помочь вам понять советы, PointCut, Joinpoints. enter image description here

Source

Explaination используя ресторан Аналогия:Source by @Victor

Когда вы идете в ресторан, вы смотрите на меню и увидеть несколько вариантов на выбор. Вы можете заказать один или несколько элементов в меню. Но пока вы на самом деле их не заказываете, это просто «возможность поужинать». Как только вы разместите заказ, и официант приносит его к вашему столу, это еда.

Соединительные точки - это опции в меню, а точки-точки - это элементы, которые вы выбираете. Точка соединения - это возможность в коде для вас, чтобы применить аспект ... просто возможность. После того, как вы воспользуетесь этой возможностью и выберите одну или несколько точек подключения и примените к ним аспект, у вас есть pointcut.

+0

Awesome. Спасибо, что разделили статью. – Atul

+3

Это должно быть отмечено как правильный ответ. Просто чтобы добавить дополнительную информацию, посмотрите на ответ Криги Уоллс ... http://www.coderanch.com/t/485525/Spring/Difference-Joint-Point-Point-Cut. – Victor

+2

nice link @Victor, я добавляю эту ссылку к своему ответу – Premraj

6

Оба относятся к «где» аспектно-ориентированного программирования.

Точка соединения - это отдельное место, где вы можете выполнить код с помощью АОП. Например. «когда метод выдает исключение».

Точечный набор представляет собой совокупность точек соединения. Например. «когда метод класса Foo вызывает исключение».

+0

Правильно. пожалуйста, уточните меня? – Krishna

9

Сравнивая язык AOP, такой как AspectJ, на язык запросов данных, такой как SQL, вы можете думать о точках соединения (т. Е. Все места в коде, где вы можете сплести код аспекта) в качестве таблицы базы данных со многими строками. Точечный штрих подобен типу SELECT, который может выбирать пользовательское подмножество строк/точек соединения. Фактический код, который вы переплетаете в выбранные вами места, называется советом.

+0

Nice Explanation – phoenix

25

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

В приведенном ниже примере,

@Pointcut("execution(* * getName()") 

Pointcut определяет правила говорят, рекомендации должны быть применены на GetName() метод присутствует в любом классе в любом пакете и joinpoints будет список всех метода GetName(), присутствующих в классов, чтобы можно было применять рекомендации по этим методам.

(В случае весны правило применяется только к управляемым компонентам, а рекомендации могут применяться только к общедоступным методам).

+1

«Pointcut определяет правила, говорящие, что метод getName() должен применяться к любому классу в любом пакете, а точки соединения - список всех методов getName(), присутствующих в классах, чтобы можно было применять рекомендации по этим методам «. Извините, но это становится более запутанным. Не могли бы вы дать мне аналогию в сценарии реального мира? –

+0

Четкий и хороший ответ, чтобы понять разницу. Меня часто путают. – Krishna

+0

Простой и очень четкий ответ! – phoenix

3

Я согласен с mgroves .. Точечный разрез можно рассматривать как коллекцию нескольких совместных точек. Совместная точка указывает конкретное место, где может быть реализована рекомендация, где в качестве pointcut отражается список всех совместных точек.

21

Сводные данные: Это, в основном, места в реальной бизнес-логике, где вы хотите вставить какую-то разную функциональность, которая необходима, но не является частью реальной бизнес-логики. Некоторые примеры JoinPints ​​являются: вызов метода, метод, возвращающий обычно, метод бросает исключение, инстанцировании объект, имея в виду объект, и т.д. ...

: срезов в которые что-то срезов в как регулярные выражения, которые используются для идентификации joinpoints , Pontcuts выражаются с использованием «языка выражения pointcut». Точки - это точки выполнения, в которых необходимо применять сквозную задачу. Существует различие между Joinpoint и Pointcut; Точки соединения более общие и представляют собой любой поток управления, где мы можем выбрать «сквозную проблему», в то время как pointcuts идентифицирует такие точки соединения, где «мы хотим» вводить сквозную проблему.

+1

Я могу сказать «Все ясно» для этого. – Jagadeesh

+1

Регистрация - Потенциальные места для применения/запуска кода рекомендации. Pointcut - фактические выбранные точки соединения для выполнения рекомендаций. – user104309

-2

JoinPoint: Он указывает точку (метод) в приложении, в которой будет выполнен Совет.

Pointcut: Это комбинация JoinPoints, и в нем указано, с каким будет выполняться совет JoinPoint.

1

АОП весной имеет {Советник, Совет, Pointcut, Joinpoint}

Как вы знаете, главная цель АОП развязку сквозными озабоченность логики (Aspect) из кода приложения, чтобы осуществить это весной мы используем (Advice/Advisor)

Pointcut используется для фильтрации, где мы хотим применить этот совет точно так же, как «все методы начинаются со вставки», поэтому исключаются другие методы, поэтому мы имеем в интерфейсе Pointcut {ClassFilter и MethodMatcher}

Итак, совет - это сквозная логическая реализация, а советник - t он советует плюс PointCut, если вы используете только совет, весна будет отображать его советнику и сделать pointcut TRUE, что означает, что вы ничего не блокируете. Вот почему, когда вы используете только совет, он применяется ко всем методам целевого класса, потому что вы их не фильтровали.

Но Joinpoint - это место в программе, вы можете думать об этом как отражение при доступе к объекту Class, а затем вы можете получить объект Method, тогда вы можете вызывать любой метод в этом классе, и именно так работает компилятор, если вы так думаете, вы можете представить себе Объединение.

Подсчет может быть с полем, конструктором или методом, но весной у нас есть точка соединения только с методами, поэтому весной у нас есть (до, после, бросает, вокруг) типы Joinpoint, все они относятся к местоположениям в класс.

Как я уже говорил, у вас может быть совет без pointcut (без фильтра), тогда он будет применяться ко всем методам или вы можете иметь советника, который является [советом + pointcut], который будет применяться к определенным методам, но вы можете " t иметь совет без точки соединения, такой как pointcut, вы должны указать его, поэтому весовые типы советов соответствуют тем же типам, что и точка соединения, поэтому, когда вы выбираете совет, вы неявно выбираете, какую точку соединения.

Чтобы завершить, совет является логикой реализации вашего аспекта для целевого класса, этот совет должен иметь точку соединения, например, перед вызовом, после вызова, после броска или вокруг вызова, тогда вы можете фильтровать, где именно вы хотите применить он использует pointcut для фильтрации методов или без pointcut (без фильтра), поэтому он будет применяться ко всем методам класса.

-5

присоединиться точка является местом, где мы на самом деле размещения советы

но точка разреза является сбор точек соединения. это означает, насколько мы используем перекрестную логику, называется точечным вырезом

3

JoinPoint: Точка соединения в вашей программе выполняется, когда поток исполнения изменен, как «Исправление исключений», «Вызов другого метода».

PointCut: PointCut - это в основном те соединения, в которых вы можете поместить свой совет (или назвать аспект).

Так что в основном PointCuts - это подмножество JoinPoints.

2

Точечная стрелка определена для реализации класса Aspect. Вырезание точки в основном относится к выражению pointcut в совете.

Для например,

@Before("execution(* app.purchase2.service.impl.*(..))") 
public void includeAddOns(RolesAllowed roles) { 
.. 
} 

Вышеуказанные средства, метод «includeAddOns» вызывается перед вызовом (в связи с советом @Before) любыми способами (в классах в рамках пакета «app.purchase2.service.impl»)

вся аннотацию называется срез точек @Before("execution(* app.purchase2.service.impl.*(..))")

Joint точка является фактическим вызова метода, который присоединился к методу в пакете «app.purchase2.service.impl» методу в аспекте класса «вкл ludeAddOns()».

Вы можете получить доступ к свойствам точки соединения с классом org.aspectj.lang.JoinPoint.

+0

Хороший ответ! Наконец я понял разницу! – Dante

13

Описание Лэймана для тех, кто знаком с концепциями АОП. Это не является исчерпывающим, но должно помочь в понимании концепций. Если вы уже знакомы с основным жаргоном, вы можете прекратить читать сейчас.

Предположим, у вас есть обычный сотрудник класса, и вы хотите что-то делать каждый раз при вызове этих методов.

class Employee{ 
    public String getName(int id){....} 
    private int getID(String name){...} 
} 

эти методы называются JoinPoints. Нам нужен способ идентифицировать эти методы, чтобы среда могла находить методы, среди всех загруженных классов.methods. Итак, мы будем писать регулярное выражение для соответствия сигнатуре этих методов. Хотя в этом есть больше, как вы увидите ниже, но свободно это регулярное выражение - это то, что определяет Pointcut. например

* * mypackage.Employee.get*(*) 

Первый * для модификатора public/private/protected/default. Second * для возврата типа метода.

Но тогда вы должны сказать еще две вещи:

  1. Когда следует действие необходимо принять - , например, до/после выполнения метода или об исключении
  2. Что должен это сделать когда это соответствует (возможно, просто распечатать сообщение)

Комбинация этих двух называется Совет.

Как вы можете себе представить, вам нужно написать функцию, чтобы иметь возможность делать # 2. Так вот как это могло бы выглядеть для основ.

Примечание: для наглядности, используя слово REGEX вместо * * mypackage.Employee.get*(*). В действительности полное выражение переходит в определение.

@Before("execution(REGEX)") 
public void doBeforeLogging() {....} <-- executed before the matching-method is called 

@After("execution(REGEX)") 
public void doAfterLogging() {....} <-- executed after the matching-method is called 

Как только вы начнете использовать их совсем немного, вы можете указать многие @ После/@ Перед/@ Вокруг советов. Регулярные выражения , повторяющиеся, в конечном итоге приводят к путанице и трудностям в обслуживании. Итак, что мы делаем, мы просто называем это выражение и используем его везде в классе Aspect.

@Pointcut("execution(REGEX)") <-- Note the introduction of Pointcut keyword 
public void allGetterLogging(){} <-- This is usually empty 

@Before("allGetterLogging") 
public void doBeforeLogging() {....} 

@After("allGetterLogging") 
public void doAfterLogging() {....} 

Кстати, вы также хотите, чтобы обернуть всю эту логику в классе, что называется Аспект и вы бы написать класс:

@Aspect 
public class MyAwesomeAspect{....} 

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

<aop:aspectj-autoproxy>

+0

Я новичок в AOP, и это объяснение помогло мне понять отношения между советами/точками/JoinPoints совершенно ясно. –

3

Определение

Согласно документации:

Присоединяйтесь точкой: в точку во время выполнение программы, например, выполнение метода или обработка исключения.

Объединенные очки как события в исполнении программы. Если вы используете Spring AOP, это даже ограничивается вызовом методов. AspectJ обеспечивает большую гибкость.

Но вы никогда не будете обрабатывать все события, поскольку вы не едите всю еду в меню, когда вы идете в ресторан (я не знаю вас, вы могли бы! Но, конечно же, нет). Таким образом, вы делаете выбор событий для обработки и что с ними делать. Здесь идет Pointcuts. Согласно документации,

Pointcut: предикат, который соответствует точек соединения.

Тогда вы связываете, что делать с Pointcut, там идет Советы. Согласно документации,

Совет связан с экспрессией в Pointcut и работает на любой точки соединения, совпавшего с срезом точек.

Код

package com.amanu.example; 

import org.aspectj.lang.annotation.After; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 
import org.aspectj.lang.annotation.Pointcut; 

/** 
* @author Amanuel Nega on 10/25/16. 
*/ 
class ExampleBussinessClass { 

    public Object doYourBusiness() { 
     return new Object(); 
    } 

} 

@Aspect 
class SomeAspect { 

    @Pointcut("execution(* com.amanu.example.ExampleBussinessClass.doYourBusiness())") 
    public void somePointCut() { 
    }//Empty body suffices 

    @After("somePointCut()") 
    public void afterSomePointCut() { 
     //Do what you want to do before the joint point is executed 
    } 

    @Before("execution(* *(*))") 
    public void beforeSomePointCut() { 
     //Do what you want to do before the joint point is executed 
    } 

} 

Объяснение Кодекса

  • ExampleBusinessClass, когда прокси-эд, наша цель!
  • doYourBusiness() является возможной суставом точкой
  • SomeAspect нашего аспект, который пересекает в нескольких проблем, такого ослом ExampleBusinessClass
  • somePointCut() является определением точки вырезать, что соответствует нашей совместной точки
  • afterSomePointCut() - это совет, который будет выполнен после нашего somePointCutТочечная резка, который соответствует doYourBusiness()совместного пункту
  • beforeSomePointCut() также совет, который соответствует всем public метод казни. В отличии от afterSomePointCut, это один использует встроенную точку среза декларацию

Вы можете посмотреть на documentation, если вы не верите мне. Я надеюсь, что это поможет

Смежные вопросы