2014-12-06 4 views
1

Я изучаю сертификацию Spring Core, и у меня есть сомнения в связи с тем, как Spring AOP.Некоторые сомнения, связанные с конфигурацией АОП весной

Чтение документации, кажется, понимает, что существует 2 способа получения АОПА в Java:

  1. Использование AspectJ, что с помощью модификации байт-кода для сторон ткачества предлагает полномасштабный Аспект ориентированного языка программирования. (так что мне кажется, что AspectJ - это отличный язык, который может быть интегрирован с Java, чтобы предложить ему функции AOP).

  2. Spring AOP: используется в Spring framework, который использует динамические прокси для аспектного ткачества вместо модификации байткода.

Так что мои сомнения в основном состоят в следующем:

1) Чтение документации найдено следующий метод, чтобы добавить поддержку АОП моей весны применения:

С ИСПОЛЬЗОВАНИЕМ JAVA конфигурации класса:

@Configuration 
@EnableAspectJAutoProxy 
@ComponentScan(basePackages=“com.example”) 
public class AspectConfig { 
    ... 
} 

USIN G XML КОНФИГУРАЦИЯ:

<beans> 
    <aop:aspectj-autoproxy /> 
    <context:component-scan base-package=“com.example” /> 
</beans> 

Как вы можете видеть в обеих конфигурациях есть ссылка на AspectJ:

@EnableAspectJAutoProxy 

и

<aop:aspectj-autoproxy /> 

Почему? Если используется весна Spring AOP вместо AspectJ Почему есть ссылка на AspectJ, когда я настраиваю АОП весной?

2) В предыдущих примерах показать 2 способ настройки Spring: по Java конфигурации класса и конфигурации XML. Я знаю, что существует третий способ настройки приложения Spring: используя аннотации. Итак, существует способ настройки АОП с помощью аннотаций?

ответ

3

Я думаю, что эти настройки Spring AOP со ссылками на AspectJ в их именах действительно более раздражающего, чем полезно. Я могу понять, почему вы смущены. Spring AOP - это действительно отличная концепция от AspectJ. Как вы сказали: динамические прокси JDK или CGLIB в Spring AOP по сравнению с инструментами байтового кода во время компиляции или загрузки в AspectJ. Другие отличия:

  • AspectJ во время компиляции ткачество необходим специальный компилятор под названием Ajc. Это в основном компилятор Java Eclipse Ecj, усиленный аксессуаром, который выполняет инструментарий. Напротив, Spring AOP создает динамические прокси во время выполнения.
  • В AspectJ есть два варианта синтаксиса: родной и аннотация. Первый более элегантный и выразительный, надмножество Java и определенно нуждается в Ajc. Последний использует Java аннотаций и может быть собран с Javac, но нуждается в аспекте ткача содержится как в Ajc (время компиляции) и в ткацком агента aspectjweaver.jar (время загрузки), чтобы «закончить» их и сделать их пригодными для использования во время выполнения. Оба варианта нуждаются в времени выполнения AspectJ, содержащемся как в файле aspectjrt.jar (очень маленький, используемый во время выполнения во время компиляции во времени) и aspectjweaver.jar (гораздо больше, используемый для ткачества с загрузкой, содержит как время выполнения и ткач).
  • AspectJ работает для любого Java-класса, он не нуждается или даже не знает о структуре Spring. Spring AOP нуждается в платформе Spring в качестве основы, вы можете использовать инструмент Spring Beans/Components, а не Spring-agnostic POJO.
  • AspectJ более эффективен, потому что он избегает прокси. Но Spring AOP является необязательной частью структуры Spring в любом случае, поэтому, если вы используете перехват Spring и метода Spring Spring, это все, что вам нужно, имеет смысл использовать его.
  • Spring AOP использует подмножество синтаксиса pointcut AspectJ. Возможно, это тонкая причина, по которой Spring AOP использует ссылки AspectJ, но я все же считаю, что было неправильным решением не более четко отличать два понятия друг от друга относительно номенклатуры. Кроме того, общий поднабор языка poinctut определен в маленьком JAR, называемом aopalliance.jar, потому что давно так называемый «AOP Alliance» определил этот синтаксис. На сегодняшний день доминирующим и наиболее мощным AOP-языком является AspectJ, поэтому на самом деле AspectJ (поддерживается Eclipse) является лидером в этой области, IMO.
  • Когда я говорю, что Spring AOP использует подмножество синтаксиса AspectJ, наоборот, это означает, что AspectJ предлагает надмножество. Существует больше типов pointcut, таких как call(), set(), get() и т. Д., И у вас есть еще больше возможностей для перехвата точек соединения и применения сквозных проблем к вашей базе кода с помощью совета или определения между типами.

Я не понимаю ваш вопрос # 2. Класс конфигурации в вашем примере использует аннотации, поэтому нет третьего пути. ;-) Но есть старый, действительно устаревший подход АОП весной, называемый перехватчиками. Это остаточный подход к раннему АОП и уже давно устаревший, хотя он по-прежнему применим.

И Spring AOP, и AspectJ могут быть настроены через XML или аннотации в Spring.:-)

+0

Хороший ответ, я только каждый работал с AspectJ по отношению к Spring AOP, этот ответ помог мне понять больше о том, как они работают вместе. +1 – beartech1

1

Не уверен, что я полностью понимаю ваш вопрос, я думаю, вы спрашиваете что-то вроде: «Если я использую Spring AOP, почему я вижу ссылки на AspectJ?»

Если это так, то вы должны знать, что весна не в конкуренции с AspectJ, а использует AspectJ для АОП.

См Спринг документация: http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/aop.html

+0

Я не согласен, вроде. Рамка Spring как таковая не конкурирует с AspectJ, потому что она поддерживает как собственную Spring AOP, так и полноразмерный AspectJ через конфигурацию. Но две альтернативы AOP - это соревнование друг для друга, поскольку все, что вы можете сделать с Spring AOP, также можно выполнить с помощью AspectJ плюс многое другое. Поэтому, как только ограниченный набор функций Spring AOP недостаточен, вам необходимо использовать AspectJ. Ничто не мешает вам использовать AspectJ * только * с самого начала, т. Е. Вообще игнорировать Spring AOP. Поэтому в этом отношении два являются конкурентами. В противном случае я согласен. :-) – kriegaex

+0

Я тоже вижу эту перспективу. Я просто перехожу к тому, что говорят весенние документы. Конечно, это могут быть весенние люди, будучи дипломатическими. – beartech1

+0

Я бы сказал, что две системы AOP сосуществуют мирно весной. :-) Возможно, это то, что они означают. – kriegaex

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