1. Предисловие
В предыдущих проектах я редко обращал внимание на конкретную реализацию и теорию Spring AOP. Я просто кратко понял, что такое AOP и как его использовать. Я видел сообщение в блоге, которое было хорошо написано, поэтому я пришел, чтобы узнать об этом.
Аоп
Можно сказать, что AOP (ориентированное на аспект), то есть ориентированное на аспект программирование, является дополнением и улучшением ООП (объектно-ориентированное программирование). OOP вводит такие понятия, как инкапсуляция, наследование и полиморфизм для установления объектной иерархии, которая используется для имитации коллекции общественного поведения. Тем не менее, ООП позволяет разработчикам определять вертикальные отношения, но не подходит для определения горизонтальных отношений, таких как функции ведения ведения ведения ведения регистрации. Код журнала часто рассеяется горизонтально по всем уровням объектов и не имеет ничего общего с основными функциями соответствующего объекта. Этот вид не связанного кода, разбросанный повсюду, называется поперечной резкой. В дизайне ООП он вызывает большое количество дублирования кода, что не способствует повторному использованию каждого модуля.
Технология AOP, напротив, использует технику, называемую «перекрестным», для разжигания внутренней части инкапсулированного объекта и инкапсулировать эти общие поведения, которые влияют на множественные классы в модуль многократного использования, и назвать его «аспект», который является аспектом. Так называемый «раздел» просто инкапсулируется логикой или обязанностями, которые не связаны с бизнесом, но называются совместно бизнес-модулем, что удобно для снижения дубликатного кода системы, снижения связи между модулями и способствующим будущей работой и обслуживаемости.
Используя технологию «перекрестного», AOP делит программную систему на две части: основная проблема и перекрестная озабоченность. Основным процессом обработки бизнеса является основной целью, и часть, которая имеет к нему мало общего, является поперечное внимание. Одной из особенностей перекрестных проблем является то, что они часто возникают в нескольких основных проблемах и в основном похожи в различных местах, таких как аутентификация разрешения, журналы и вещи. Роль AOP состоит в том, чтобы разделить различные проблемы в системе и отделить основные проблемы от перекрестных проблем.
AOP Core Concept
1.
Какие методы перехватить и как справиться с этим после перехвата? Эти опасения называются перекрестными проблемами
2. Раздел (аспект)
Классы являются абстракциями функций объектов, а разделы являются абстракциями перекрестных проблем
3. JoinPoint
Перехваченная точка, потому что пружина поддерживает только точки соединения метода, поэтому точка соединения в пружине относится к перехвату метода. Фактически, точка подключения также может быть поле или конструктором.
4. Pointcut
Определение перехвата точек соединения
5. Уведомление (советы)
Так называемое уведомление относится к коду, который должен быть выполнен после перехвата точки соединения. Уведомления разделены на пять категорий: предварительно установленные, пост-установки, исключение, окончательные и окружающие уведомления.
6. Целевой объект
Целевой объект прокси
7. Плетение
Процесс применения щели к целевому объекту и создания создания объектов прокси -сервера
8. Введение
Без изменения кода введение может динамически добавить некоторые методы или поля в класс в течение периода выполнения.
Весенняя поддержка AOP
Агент AOP весной отвечает за генерацию и управление контейнером IOC Spring, а его зависимости также управляются контейнером IOC. Следовательно, прокси -сервер AOP может непосредственно нацелен на другие экземпляры бобов в контейнере, и эта взаимосвязь может быть обеспечена инъекцией зависимостей контейнера IOC. Правила создания прокси весной:
1. По умолчанию, Java Dynamic Proxy используется для создания AOP -прокси, чтобы вы могли создать прокси для любого экземпляра интерфейса.
2. Когда класс, который нуждается в прокси, не является интерфейсом прокси, пружина переключится на использование прокси CGLIB, а также может заставить CGlib использовать.
Программирование AOP на самом деле очень простая вещь. Глядя на программирование AOP, программисты должны участвовать только в трех частях:
1. Определите обычные компоненты бизнеса
2. Определите точку входа, одна точка входа может перекрестно вырезать несколько компонентов бизнеса
3. Определите улучшенную обработку. Усовершенствованная обработка - это действие по обработке, которое переплетается в обычные бизнес -компоненты в рамках AOP.
Следовательно, ключом к программированию AOP является определение точки входа и определение обработки улучшения. После определения соответствующей точки въезда и обработки улучшения, структура AOP автоматически генерирует прокси -сервер AOP, то есть метод прокси -объекта = обработка улучшения + метод прокси -объекта.
Вот шаблон файла Spring Aop .xml с именем aop.xml, и последующее содержимое расширяется на aop.xml:
<? xml version = "1.0" Encoding = "UTF-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemalocation = "http://wwww.springframe. http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd "> </beans>
Простая реализация AOP на основе весны
Обратите внимание, что прежде чем объяснить, позвольте мне объяснить: Чтобы успешно запустить код, недостаточно использовать пакет JAR, предоставленный Spring для разработчика. Пожалуйста, загрузите два пакета JAR Online:
1. aopalliance.jar
2. AspectJweaver.jar
Давайте начнем объяснять метод реализации XML Spring AOP, сначала определите интерфейс:
Общественный интерфейс Helloworld {void printhelloworld (); void doprint ();} Определите два класса реализации интерфейса:
открытый класс helloworldimpl1 реализует helloworld {public void printhelloworld () {System.out.println ("enter helloworldimpl1.printhelloworld ()"); } public void doprint () {System.out.println ("enter helloworldimpl1.doprint ()"); возвращаться ; }} открытый класс helloworldimpl2 реализует helloworld {public void printhelloworld () {system.out.println ("enter helloworldimpl2.printhelloworld ()"); } public void doprint () {System.out.println ("enter helloworldimpl2.doprint ()"); возвращаться ; }} Фокус перекрестного выреза, вот время печати:
Public Class TimeHandler {public void printment () {System.out.println ("currentTime =" + System.currentTimeMillis ()); }} С этими тремя классами вы можете реализовать простой пружинный AOP. Посмотрите на конфигурацию AOP.xml:
<? xml version = "1.0" Encoding = "UTF-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemalocation = "http://wwww.springframe. http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd "> <bean id =" helloworldimpl1 "/> <bean id =" helloworldimpl2 "/> <bean id =" timehandler "/> <aop: config> <aop: аспект id =" ref-neckhand ". id="addAllMethod" expression="execution(* com.xrq.aop.HelloWorld.*(..))" /> <aop:before method="printTime" pointcut-ref="addAllMethod" /> <aop:after method="printTime" pointcut-ref="addAllMethod" /> </aop:aspect> </aop:config></beans>
Напишите основную функцию, чтобы назвать это:
public static void main (String [] args) {ApplicationContext ctx = new classpathxmlapplicationContext ("aop.xml"); Helloworld hw1 = (helloworld) ctx.getbean ("helloworldimpl1"); Helloworld hw2 = (helloworld) ctx.getbean ("helloworldimpl2"); hw1.printhelloworld (); System.out.println (); hw1.doprint (); System.out.println (); System.out.println (); hw2.printhelloworld (); System.out.println (); hw2.doprint ();} Результат работы:
Currenttime = 1446129611993enter Helloworldimpl1.printhelloworld () CurrentTime = 1446129611993CurrentTime = 1446129611994NENTER Helloworldimpl1.doprint () Currenttime = 1446129611994CurrentTimk Helloworldimpl2.printhelloworld () currenttime = 1446129611994currenttime = 1446129611994NENTER HELLOWORLDIMPL2.DOPRINT () CUSTIME = 1446129611994
Я видел, что в прокси -сервер были добавлены все методы двух классов реализации интерфейса Helloworld, а содержание прокси - это время печати.
Дополнительная информация об использовании AOP на основе весеннего
1. Добавьте заинтересованность в перекрестном вырезании и распечатайте журнал. Класс Java:
открытый класс loghandler {public void logbefore () {System.out.println ("log перед методом"); } public void logafter () {System.out.println ("log после метода"); }}<? xml version = "1.0" Encoding = "UTF-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemalocation = "http://wwww.springframe. http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd"> <bean id="helloWorldImpl1" /> <bean id="helloWorldImpl2" /> <bean id="timeHandler" /> <bean id="logHandler" /> <aop:config> <aop:aspect id="time" ref = "timehandler" order = "1"> <aop: pointcut id = "addtime" expression = "exepring (* com.xrq.aop.helloworld.* (..))" /> <aop: перед методом = "printcute" pointcut-ref = "addtime" /> <aop: After Method = "printtime" pointcut-ref = "AddTime" /> <aop: After Method = "printtime" point-ref = "AddTuctore" /> <aop: After Method = "printtime". id="log" ref="logHandler" order="2"> <aop:pointcut id="printLog" expression="execution(* com.xrq.aop.HelloWorld.*(..))" /> <aop:before method="LogBefore" pointcut-ref="printLog" /> <aop:after method="LogAfter" pointcut-ref="printLog" /> </aop: аспект> </aop: config> </beans>
Испытательный класс остается неизменным, и результат печати:
CurrentTime = 1446130273734LOG перед MethodEnter helloworldimpl1.printhelloworld () log после MethodCurrentTime = 1446130273735CurrentTime = 1446130273736Log перед методом HelloworLdimpl1.doprint () logcurrenttime = 1446130273736.durentmprint () log после метода. 1446130273736log перед Methodenter helloworldimpl2.printhelloworld () log после метода CurrentTime = 1446130273736currenttime = 1446130273737Log перед методом HelloworLdimpl2.doprint () log после метода CurrentTime = 14461302737777
Есть два способа использовать Loghandler до TimeHandler:
(1) В аспекте есть атрибут заказа, а количество атрибута заказа-это порядок перекрестного вырезания точек фокусировки
(2) Определите логхандлер перед TimeHandler. Spring использует порядок определения аспекта в качестве порядка ткачества по умолчанию.
2. Я просто хочу вплетать некоторые методы в интерфейс
Просто измените выражение точечной отрывы:
<? xml version = "1.0" Encoding = "UTF-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx" xsi: schemalocation = "http://wwww.springframe. http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd"> <bean id="helloWorldImpl1" /> <bean id="helloWorldImpl2" /> <bean id="timeHandler" /> <bean id="logHandler" /> <aop:config> <aop:aspect id="time" ref = "timehandler" order = "1"> <aop: pointcut id = "addtime" expression = "exepring (* com.xrq.aop.helloworld.print* (..))" /> <aop: перед методом = "printtime" pointcut-ref = "addtime" /> <aop: After Method = "print-reptre-ref =" AddTime " /> <aop: After Method =" print-ref = "AddTime" /> <aop: After Method = "print-reptime" /> <aop: apemptime: aop: aop: apepertime ". id="log" ref="logHandler" order="2"> <aop:pointcut id="printLog" expression="execution(* com.xrq.aop.HelloWorld.do*(..))" /> <aop:before method="LogBefore" pointcut-ref="printLog" /> <aop:after method="LogAfter" pointcut-ref="printLog" /> </aop: аспект> </aop: config> </beans>
Это означает, что TimeHandler будет только методы, которые начинаются в начале интерфейсной печати Helloworl
3. Force cglib для создания прокси -сервера
Как упоминалось ранее, Spring использует динамический прокси или Cglib для генерации прокси. Высшие версии Spring автоматически выбирают, использовать ли динамический прокси или CGLIB для генерации содержимого прокси. Конечно, мы также можем заставить CGLIB генерировать прокси, то есть атрибут «прокси-таргета» в <AOP: config>. Если это значение атрибута установлено на TRUE, то прокси на основе класса будет работать. Если Proxy-Target-Class установлен на FALSE или этот атрибут опущен, то прокси на основе интерфейса будет работать.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.