Введение
Ориентированное ориентированное программирование (AOP) обеспечивает еще одну перспективу, чтобы думать о структуре программы, которая компенсирует недостатки объектно-ориентированного программирования (ООП). В дополнение к классам AOP предоставляет аспекты. Модулизуйте фокус, такой как перекрестное управление транзакциями множества типов и объектов. (Эти термины заботы часто называют перекрестными проблемами.)
Ключевым компонентом пружины является структура AOP. Несмотря на это, весенние контейнеры МОК не полагаются на AOP, что означает, что вы можете выбрать, использовать ли AOP. AOP обеспечивает мощное промежуточное решение, которое делает контейнеры IOC Spring более завершенными.
Весна 2.0 AOP:
Spring 2.0 представляет более простой и более мощный способ настроить раздел, и пользователи могут использовать методы на основе схемы или использовать аннотации @AspectJ. Для новых приложений, если пользователь разрабатывает в Java 5, мы рекомендуем пользователю использовать стиль @Aspectj, в противном случае можно использовать стиль на основе шаблона. Оба стиля полностью поддерживают тип консультаций и язык AspectJ, хотя он все еще использует Spring AOP.
В этой главе в основном обсуждается поддержка Spring 2.0 для AOP на основе шаблонов и @Aspect. Весна 2.0 полностью сохраняет обратную совместимость пружины 1.2. В следующей главе будет обсуждаться основная поддержка AOP, предоставляемая API Spring 1.2.
AOP используется весной:
Декларативные корпоративные услуги предоставляются, особенно вместо декларативных услуг EJB. Наиболее важной услугой является декларативное управление транзакциями, которое основано на абстрактной абстрактной транзакции.
Позволяет пользователям реализовать пользовательские разделы и использовать AOP для улучшения использования ООП.
Пример
Мы часто используем следующие типы
1. AOP на основе агента
2. Чистые и простые аспекты объектов Java
3.
4. Давайте применим секции ASPCET в форме инъекции один за другим.
Давайте сначала напишем несколько основных классов.
Класс интерфейса:
/ *** Определите интерфейс*/ public interface Sleepable {/ *** Метод сна*/ void sleep (); } Класс реализации:
/ *** Я внедряю интерфейс сна*/ public class chenllina реализует сон, {@override public void sleep () {// todo автоматически сгенерированный метод System.out.println («Будь хорошо, пришло время пойти в кровать!»); }} Класс улучшения:
/ *** Определите улучшение сна для достижения как до-, так и после установки*/ открытого класса Sleephelper MethodBeefeAdvice, After ReturningAdvice {@Override public void после повторного возврата (объект returnvalue, метод, объект [] args, объект-цель) бросает броски {System.out.println («Применить маму-объект перед подготовкой к кровати); } @Override public void перед (метод метода, объект [] args, объект цели) бросает throwable {System.out.println («Мечта после сна»); }}1. Агентство на основе AOP
<!-Создайте улучшенные советы-> <Bean Id = "sleephelper"/> <bean id = "lina"/> <!-Определите точечные совпадения со всеми методами сна-> <bean id = "sleeppointcut"> <Название свойства = "Паттерн" value = ".*Sleep"> </property> </bean> <! id = "sleephelperadvisor"> <property name = "Advice" ref = "sleephelper"/> <name = "pointcut" ref = "sleeppointcut"/> </bean> <!-Определите объект прокси-> <bean id = "rinaproxy"> name = "target" ref = "lina"/> <name ". value = "sleephelperadvisor"/> <!-<property name = "proxyinterfaces" value = "com.tgb.springaop.service.sleepable"/>-> </bean>
Как в файле конфигурации:
Атрибут шаблона указывает регулярное выражение. Это соответствует всем методам сна. Используйте org.springframework.aop.support.defaultpointcutadvisor, чтобы объединить касательную точку и улучшение для формирования полной касательной. После того, как окончательная конфигурация завершена, окончательный прокси -объект генерируется через org.springframework.aop.framework.proxyfactorybean.
2. Чистые и простые аспекты объектов Java
Как сказать, что просто простые аспекты объектов Java? На мой взгляд, это относительно первой конфигурации, которая не требует использования прокси, но автоматически сканирует внутренний механизм пружины. В настоящее время наш файл конфигурации должен быть изменен следующим образом:
<!-Создайте улучшенные советы-> <Bean Id = "sleephelper"/> <!-Target Class-> <Bean Id = "lina"/> <!-Настройка точечных и уведомлений-> <bean id = "sleepadvisor"> <Свойство имя = "ref =" sleephelper "> </property> <stament =" pattern "vature =". Конфигурация -> <bean/>
Это намного проще первого? Не нужно больше настроить прокси?
3.
Основываясь на нашем опыте, мы также знаем, что форма аннотаций проще, чем файл конфигурации. В настоящее время вам нужно прокомментировать существующие методы или классы:
/ ***Добавить улучшение через аннотацию*/ @aspept @component public class sleephelper03 {/* @pointcut ("excution (*com.tgb.springaop.service.impl ..*(..)")*/ @pointcut ("execution (*.sleep (..)") ") public void sleeppoint () bobfore bobfore bobfore bobfore bobfore bobfore bobfore bobfore bobtore (efution (*. public void beaforsleep () {System.out.println («Применить маску для лица перед сном»); } @AfterReturning ("sleeppoint ()") public void effectsleep () {System.out.println («Мечта после сна»); }
Просто напишите в файле конфигурации:
<!-Пакет сканирования-> <Контекст: компонент-сканирование base-package = "com.tgb" annotation-config = "true"/> <!-Amposj Annotation-> <aop: AspectJ-autoproxy proxy-target-class = "true"/> <!-Target Class-> <Bean Id = "lina"/>
4. Aspcet Cut Поверхности в форме инъекции
Я лично чувствую, что это самый простой, чаще всего используется и наиболее гибкий. Файл конфигурации следующим образом:
<!-Целевой класс-> <bean id = "lina"/> <bean id = "sleephelper"/> <aop: config> <aop: аспект ref = "sleephelper"> <aop: перед методом = "beforesleep" pointcut = "execution ( * * .sleep (..))"/> <aop: method = "chepsleep" ( * *. </aop: аспект> </aop: config>
Класс sleephelper02, упомянутый в файле конфигурации, выглядит следующим образом:
/ *** Добавить улучшение с помощью аннотаций*/ public Class sleepHelper02 {public void beaResleep () {System.out.println («Применить маску для лица перед сном»); } public void Aftersleep () {System.out.println («Мечта после сна»); }}
Это выглядит очень просто? Вы все используете Spring AOP? !
Что касается того, как позвонить, я написал здесь несколько тестовых классов. Вы можете взглянуть на это. Они в основном одинаковы:
/ *** Файл конфигурации spring_aop.xml через proxy*/ @test public void test () {ApplicationContext ct = new ClassPathxMlapplicationContext ("spring_aop.xml"); Спящий спящий = (сон) ct.getbean ("linaproxy"); Sleeper.sleep (); } / *** Файл конфигурации spring_aop_01.xml Короткий ответ java объект* / @test public void test01 () {ApplicationContext ct = new classpathxmlapplicationContext ("Spring_aop_01.xml"); Сон, спящий = (сон) ct.getbean ("Лина"); Sleeper.sleep (); } / *** Файл конфигурации spring_aop_03.xml аннотирован по аспекту* / @test public void test03 () {ApplicationContext ct = new ClassPathxMlapplicationContext ("Spring_aop_03.xml"); Сон, спящий = (сон) ct.getbean ("Лина"); Sleeper.sleep (); } / *** Файл конфигурации spring_aop_02.xml Файл конфигурации через APSECT* @Author Chen Lina* @version 31 мая 2015 года в 10:09:37* / @test public void test02 () {ApplicationContext ct = new classpathxmlackcontext ("Spring_02.xml"); Сон, спящий = (сон) ct.getbean ("Лина"); Sleeper.sleep (); }
Из тестового класса мы видим, что независимо от того, как мы реализуем AOP, их использование ничем не отличается. Результаты этих тестовых классов одинаковы: