Оглавление
1. Spring AOP на основе конфигурации XML
2. Используйте аннотации для настройки AOP
3.
4. Примечания по уведомлению AspectJ
5. нулевая конфигурация для реализации Spring IOC и AOP
AOP (ориентированное на аспект программирования)-это технология, которая реализует горизонтальный мультимодульный унифицированный контроль программных функций с помощью методов предварительной комплектации и динамических агентов во время выполнения. AOP - это дополнение к ООП и важной частью пружинной структуры. Различные части бизнес -логики могут быть изолированы с использованием AOP, тем самым уменьшая связь между различными частями бизнес -логики, улучшив возможность повторного использования программы и повышая эффективность развития. AOP можно разделить на статическое ткачество и динамическое плетение. Динамическое ткачество не требует изменения целевого модуля. Spring Framework реализует AOP, и использование аннотации для настройки AOP является более удобным и интуитивно понятным, чем использование конфигурации XML.
1. Spring AOP на основе конфигурации XML
Прежде чем объяснить аннотацию для реализации функции AOP, сначала используйте предыдущее обучение для настройки функции Spring AOP с использованием XML, чтобы оно было для сравнения и лучшего понимания.
1.1.
<Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http://maven.apme-" G/xsd/Maven-4.0.0.xsd "> <doliderVersion> 4.0.0 </modelVersion> <groupid> com.zhangguo </GroupId> <ArtifactId> Spring052 </artifactid> <версия> 0.0.1-snapshot </version> <Cackaging> jar </packaging> <mame> Spring052 </name> <Url> http://maven.apache.org </url> <properties> <project.build.sourceencoding> utf-8 </project.build. </Свойства> <Depertiencies> <dehyedency> <groupid> junit </groupid> <artifactid> junit </artifactid> <cerpope> test </scope> <sersive> 4.10 </version> </dependency> <dependency> Зависимость> <зависимость> <groupid> cglib </GroupId> <artifactid> cglib </artifactid> <sersion> 3.2.4 </version> </dependency> </depertive> </project>
1.2.
Пакет com.zhangguo.spring052.aop01;/*** System.out.println (n1+"-"+n2+"="+result); Result = N1*N2;
1.3.
package com.zhangguo.Spring052.aop01;import org.aspectj.lang.JoinPoint;/** * Notification class, cross-cut logic* */public class Advices { public void before(JoinPoint jp){ System.out.println("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------1.4.
<? xml version = "1.0" Encoding = "UTF-8"?> <Beans xmlns = "http://www.springframe.ords.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlsshema- ingframework.org/schema/p "xmlns: aop =" http://www.springframework.org/schema/aop "xsi: schemalocation =" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop./www.springframework.org/schema/aop:/www.springframework.org/schema/aop.spramewramework.org/schema/aopm op-4.3.xsd "> <!-Proxy Object-> <Bean Id =" Math "> </bean> <!-уведомление-> <Bean Id =" Советы "> </bean> <!-AOP Configuration-> <AOP: Config Proxy-Target-class =" true "> <!-раздел-> <aop: apect ref =" советы "> <! Express = "execution (* com.zhangguo.spring052.aop01.math. Бобы>
1.5.
Пакет com.zhangguo.spring052.aop01; импорт org.springframework.context.applicationContext; Import org.springframe.context.support.classpathxmlapplicationconcontext; Math Math = ctx.getbean ("Math", Math.class); Math.add (N1, N2);Результаты работы:
2. Используйте аннотации для настройки AOP
2.1. Это эквивалентно добавлению бобов в файл конфигурации XML в предыдущем примере, <!-Proxy Object-> <Bean Id = "Math"> </bean>, а код класса математики выглядит следующим образом:
Пакет com.zhangguo.spring052.aop02; импорт org.springframework.stereoty.service;/*** // заменить публичный int sub (int n1, int n2) {int result = n1-n2; System.out.println (n1+"-"+n2+"="+Результат); println (n1+"/"+n2+"="+result);2.2.
Пакет com.zhangguo.spring052.aop02; импорт org.aspectj.lang.joinpoint; импорт org.aspectj.lang.annotation.aspect; импорт org.aspectj.lang.annotation.aspept; /@Component@AspectPublic Class Advices {@before ("execution (* com.zhangguo.Spring052.aop02.Math.*(..))") public void before(JoinPoint jp){ System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Приведенный выше код в основном такой же, как и следующая конфигурация
<!-Уведомления-> <bean id = "Советы"> </bean> <!-AOP Configuration-> <AOP: Config Proxy-Target-Class = "true"> <!-раздел-> <aop: аспект ref = "Совет"> <!-point-> <aop: pointcut expression = "execution (* com.zhangguo.spring052. /> <!-Подключить метод уведомления и точка-> <aop: перед методом = "перед" pointcut-ref = "pointcut1"/> <aop: после метода = "после" pointcut-ref = "pointcut1"/> </aop: аспект> </aop: config>
2.3 Добавлено файл конфигурации AOP02.xml, и добавил узел AOP: AspectJ-Autoproxy на основе настройки IOC.
<? xml version = "1.0" Encoding = "UTF-8"?> <Beans xmlns = "http://www.springframe.ords.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlsshema- ingframework.org/schema/p "xmlns: aop =" http://www.springframework.org/schema/aop "xmlns: context =" http://www.springframework.org/schema/context " xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.spramework.org/schemamempem. Chema/Context/Spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd "> <Контекст: Component-Scan Base-package = "com.zhangguo.spring052.aop02"> </context: compontent-scan> <aop: abpectj-autoproxy proxy-target-class = "true"> </aop: AspectJ-autoproxy> </beans>
2.4.
пакет com.zhangguo.spring052.aop02; import org.springframework.context.applicationContext; import org.springframework.context.support.classpathxmlapplicationContext; public class -test {public void main (string [] args) {ApplicationContext ctx = new Classpathclict. Math Math = ctx.getbean ("Math", Math.class); Math.add (N1, N2);Результаты работы:
3.
The tangent function can be positioned to an accurate transverse logical position. In the previous example, we have only used execution(* com.zhangguo.Spring052.aop02.Math.*(..)). execution is a tangent function, but the function is only at one level. If the range we want to weave is a class or annotation, the execution will not be so easy to use. In fact, there are 9 tangent functions in total, which have different targeting.
@Aspectj использует специальное выражение точки зрения AspectJ, чтобы описать раздел.
Функция Method Point Cut: определяет точки подключения, описывая информацию о методе целевого класса.
Метод Параметр Функция точечного вырезания: определяет точки подключения, описывая информацию о параметре метода целевого класса.
Функция целевого класса.
Функция точечного вырезания класса агента: определяет точки подключения, описывая информацию класса прокси.
Общий аспект экспрессии функций:
Наиболее часто используемая функция точечной выреза: выполнение (<режим модификатора>? <Режим возврата типа> <МЕТОД Имя МОДА> (<Режим параметра>) <Режим исключения>?) Функция точки, которая может удовлетворить большинство потребностей.
Чтобы показать функции каждой точечной касательной функции, теперь добавляется новый класс Strutil, класс выглядит следующим образом:
пакет com.zhangguo.spring052.aop03; импорт org.springframework.stereotye.component; @component ("strutil") открытый класс strutil {public void show () {System.out.println ("Hello Strutil!");Тестовый код заключается в следующем:
пакет com.zhangguo.spring052.aop03; import org.springframework.context.applicationContext; import org.springframework.context.support.classpathxmlapplicationContext; Imath Math = ctx.getbean ("Math", Math.class); Math.add (N1, N2);3.1.
Пакет com.zhangguo.spring052.aop03; импорт org.aspectj.lang.joinpoint; импорт org.aspectj.lang.annotation.aspect; импорт org.aspectj.lang.annotation.aspect; import org.aspectj.lang.nantotation. /@Component@AspectPublic Class Advices {@before ("execution (* com.zhangguo.spring052.aop03.math 3 пакет включены в @after ("execution (*com.zhangguo.spring052.aop03.*.*(..))") public void после (joinpoint jp) { System.out.println ("-------------------------------");Результаты работы следующие:
выполнение (<режим модификатора>? <Режим возврата типа> <МЕТОД Имя МОДА> (<Режим параметра>) <Режим исключения>?)
3.2.
// В рамках функции точечной кончики // com.zhangguo.spring052.aop03 Все методы всех классов вырезаны в @after ("intuare (com.zhangguo.spring052.aop03.3.3
// Функция с точкой зрения // реализует любую точку подключения объекта прокси интерфейса imath @after («Это (com.zhangguo.spring052.aop03.imath)») ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
3.4
// Функция ARGS CUT // Требуется, чтобы метод имел две ссылки на типа Int, прежде чем он будет сплетен в логику перекрестного выреза @after ("args (int, int)") Public void After (JoinPoint JP) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Если тип параметра не является базовым типом данных, требуется имя пакета.
3.5
Сначала настройте аннотацию, которая может быть аннотирована на методе
Пакет com.zhangguo.spring052.aop03; импорт java.lang.annotation.documented; импорт java.lang.annotation.elementtype; импорт java.lang.annotation.retention; импорт java.lang.annotation.retentionpolicy; import. Ention(retentionPolicy.Runtime)@documentedPublic @Interface Myanno {} //@annotation point-cut function//Require the method must be annotated com.zhangguo.Spring052.aop03.MyAnno to be weaved into the transverse cut logic @After("@annotation(com.zhangguo.Spring052.aop03.MyAnno)") public void after(JoinPoint jp){ System.out.println("-------------------------------"); } пакет com.zhangguo.spring052.aop03; импорт org.springframework.stereotye.component; @component ("strutil") открытый класс strutil {@myanno public void show () {System.out.println ("Hello Strutil!");Результаты работы:
Другие функции вырезания точек с @ предназначены для аннотации
4. Примечания по уведомлению AspectJ
Аннотации уведомления AspectJ имеют 6, 5 обычно используются, и используются меньше введения.
Сначала решить проблему определения мультиплексирования точечного тангенса, как показано в следующем коде, содержимое тангентной функции точки точно такое же:
Пакет com.zhangguo.spring052.aop04; импорт org.aspectj.lang.joinpoint; импорт org.aspectj.lang.annotation.aspect; импорт org.aspectj.lang.annotation.aspept; /@Component@AspectPublic Class Advices {@before ("execution (* com.zhangguo.Spring052.aop04.Math.*(..))") public void before(JoinPoint jp){ System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Сначала вы можете определить касательную, а затем мультиплексировать ее следующим образом:
пакет com.zhangguo.spring052.aop04; импорт org.aspectj.lang.joinpoint; импорт org.aspectj.lang.annotation.aspect; импорт org.aspectj.lang.annotation.before; import org.aspectj.lang.annotation.pointcut; */@Component@AspectPublic Class Advices { // 切点 @pointcut ("execution (* com.zhangguo.spring052.aop04.math ame ()); System.out.println ("-------------------------------");Измените файл Advices.java и добавьте различные типы уведомлений следующим образом:
Пакет com.zhangguo.spring052.aop04; импорт org.aspectj.lang.joinpoint; импорт org.aspectj.lang.proceconingjoinpoint; импорт org.aspectj.lang.annotation.fter; импорт ang.annotation.around; импорт org.aspectj.lang.annotation.around; импорт org.aspectj.lang.annotation.aspept; import org.aspectj.lang.annotation.before; импорт org.aspectj.lang.annotation.pointcut; Import org.springframework.stereotyle.component;/*** Класс уведомлений, логика Cross-Cut*/@Component@AspizePublic Class Advices {// Cut Point @pointcut ("execution (* com.zhangguo.spring052. Pre-notice @before ("pointcut ()") public void до (joinpoint jp) { System.out.println (jp.getSignature (). GetName ()); --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Throwable {System.out.println (pjp.getSignature (). GetName ()); --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- После возвращения (JoinPoint JP, результат объекта) {System.out.println (jp.getSignature (). GetName (); --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- System.out.println (JP.GetSignature (). GetName ());Результаты работы:
5. нулевая конфигурация для реализации Spring IOC и AOP
Чтобы достичь нулевой конфигурации, на основе исходного примера, мы добавляем новый пользовательский класс, как показано ниже:
пакет com.zhangguo.spring052.aop05; Пользователь открытого класса
Этот класс не аннотирован, и контейнер не будет автоматически управляться. Поскольку нет файла конфигурации XML, используйте его в качестве информации о конфигурации, а файл ApplicationCfg.java выглядит следующим образом:
Пакет com.zhangguo.spring052.aop05; импорт org.springframework.context.annotation.bean; импорт org.springframework.context.annotation.componentscan; импорт org.springframework.nantext.annotation.configuration; import.springframework.nanteptoration.annotation.nanteptoration.nanteptoration. /Класс конфигурации, используемый для представления текущего класса в качестве контейнера, аналогичного <Beans/>@componentscan (basepackages = "com.zhangguo.spring052.aop05") // Диапазон сканирования эквивалент узлу конфигурации XML <Контекст: Component-Scan/>@EnableSpectJautoproxy (ProxyTargetClass = true) // Auto Proxy, эквивалент <AOP: AspistJ-autopProxy Proxy-class = "true"> </aop: AppectJ-autopproxy-class in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in infortcy-clec , эквивалентно <bean id = getUser/> @bean public user getUser () {return new user ();Каждая часть этого класса в основном имеет отношения один на один с конфигурацией XML. Тестовый код заключается в следующем:
пакет com.zhangguo.spring052.aop05; импорт org.springframework.context.applicationContext; Import org.springframe.context.annotation.antotationConfigApplicationContext; Инициализировать контейнеры через класс ApplicationContext ctx = новый Аннотация ctx.getbean ("getUser", user.class); Advices.java такой же, как и выше, без каких -либо изменений, результат выполнения следующего:
Выше всего содержание этой статьи.