Прежде чем читать эту статью, вы можете ссылаться на статью « Простое понимание IOC и AOP -примеров Spring и AOP и кода » , чтобы кратко понять соответствующее содержание МОК и AOP. Давайте перейдем к теме.
Эта статья создаст самый простой пример шаг за шагом, чтобы использовать функции AOP Spring, которая считается новичкой демо -версии Spring AOP. Как новичок, запуск такой простой демонстрации также пострадал от многих ошибок.
Проблема ООП, дополнительная к AOP
Когда нам нужно ввести общественное поведение в рассеянные объекты, ООП кажется бессильным. То есть ООП позволяет вам определять отношения сверху донизу, но не подходит для определения отношений слева направо. Например, функция регистрации. Код журнала часто рассеяется горизонтально по всем уровням объектов без какого -либо отношения к основной функциональности объекта, которому он рассеян. То же самое относится и к другим типам кода, таким как безопасность, обработка исключений и прозрачность. Этот вид нерелевантного кода, разбросанный повсюду, называется кодом перекрестного обрезания. В дизайне ООП это вызывает много дублирования кода, что не способствует повторному использованию каждого модуля.
Так называемый «аспект», проще говоря, инкапсулирует логику или обязанности, которые не связаны с бизнесом, но называются совместно бизнес-модулем, что способствует снижению дублирования системы кода, сокращению связи между модулями и повышением будущей работы и обслуживаемости.
Поддержка AOP весной
Агент AOP весной отвечает за генерацию и управление контейнерами IOC весны, а его зависимости также управляются контейнерами МОК. Следовательно, прокси -сервер AOP может непосредственно нацелен на другие экземпляры бобов в контейнере, и эта взаимосвязь может быть обеспечена инъекцией зависимостей контейнера IOC. Spring использует Java Dynamic Proxy для создания AOP -прокси по умолчанию, чтобы он мог создавать прокси для любого экземпляра интерфейса. Когда класс, который нуждается в прокси, не является прокси -интерфейсом, пружина автоматически переключается на использование прокси -сервера CGLIB, а также может заставить CGLIB.
Логика этого примера заключается в следующем: есть класс автомобилей (бизнес -класс). До и после метода GO в классе автомобиля запускается, будут соответствующие записи журнала, но сам класс автомобиля не знает никакой логики журнала.
Создайте проект Maven и добавьте зависимости
Сначала создайте новый проект Maven, используйте шаблон MavenarchetypequickStart, затем откройте файл pom.xml и добавьте пакеты зависимостей, необходимые для запуска Spring AOP.
<depervice> <groupid> org.springframework </groupid> <artifactid> spring-core </artifactid> <sersive> 4.0.5.release </version> </argefactid> <dependency> <groupid> org.springframework </GroupD> <ArtifactId> </artifactId> <serse> 4.0.5.R.R.Realese> <ArtifactId> </artifactId> <serse> <groupId> org.springframework </GroupId> <ArtifactId> Spring-Context </artifactId> <sersion> 4.0.5.Release </version> </resemency> <dehyederine> <groupid> org.springframework </GroupId> <strifactId> Spring-Context </artifactId> <serse> 4.0.5.5. <groupId> org.springframework </GroupId> <StrifactId> Spring-aop </artifactId> <sersive> 4.0.5.Release </version> </depervice> <dehyederian> <groupid> org.aspectj </GroupId> <strifactid> aspectJweaver </artifactid> <serse> 1.8.1 </версия> </версия> </версия> </версия> </версию> </версию> </версию> </версию> </версию> </artifactid> aspeaver </artifactid> </версия>.
Написание бизнес -кода
Добавлен автомобиль бизнес -класса, включая метод GO ()
пакет com.wowo.spring_aop_demo1; открытый класс car {public void go () {System.out.println ("Go Go Go!"); }}Напишите аспекты
Класс журнала будет записывать работу системы, но логика журнала не будет записана повсюду в бизнес -классе, а существует как класс аспектов.
пакет com.wowo.spring_aop_demo1; public class carlogger {public void beforerun () {System.out.println («Автомобиль будет работать»); } public void Afterrun () {System.out.println ("Автомобиль работает"); }}Этот класс аспекта содержит два метода, а именно предварительную нотицию и послеотирование.
Настроить ассоциации через бобы
В этом примере добавлен новый файл конфигурации с именем Bean.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: p = "http://www.springframework.org/schema/p" xmlns: context = "http://www.springframework.org/schema/context" xmlns: aop = "http://wwww.springframe. XSI: Schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5 http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <beansd yide" <bean id = "logger" /> <aop: config> <aop: аспект ref = "logger"> <aop: pointcut Expression = "execution (* com.wowo.spring_aop_demo1.car.go (..))" id = "go" /> <aop: до pointcut-ref = "go" method = "beforerun" /> <aop: optcut-ref = "go" = "beforrun" /> <aop: aop ref = "go go" go "go" go "go". method = "Afterrun"/> </aop: аспект> </aop: config> </beans>
Примечание. В этом файле конфигурации пространство имен AOP и несколько адресов, содержащихся в XSI: требуется схемалокация.
выполнение (* com.wowo.spring_aop_demo1.car.go (..))-это точечное выражение. Выполнение означает запуск во время выполнения. Следующее * представляет возвращаемое значение любого типа. com.wowo.spring_aop_demo1.car относится к классу, где находится точечная выреза. Go (..) - это имя метода, и ... представляет любой параметр.
Существует 5 типов уведомлений, которые могут быть применены к секциям пружины:
・Перед вызовом уведомления перед вызовом вызовов метод
・После-уведомление называется после завершения метода, независимо от того, успешно ли этот метод выполняется.
・После возврата-уведомление о вызове вызывается после успешного выполнения метода
・Уведомление о послеострении-вызов после того, как метод бросает исключение
・Вокруг-Нормы пакетов уведомленного метода и выполняет пользовательское поведение до и после уведомленного вызова метода.
Запустите бизнес -код
Ниже приведен класс, содержащий метод Main () для запуска бизнес -кода
Пакет com.wowo.spring_aop_demo1; import org.springframework.context.applicationContext; import org.springframework.context.support.classpathxmlapplicationContext; public class app {public static void main (string [] args) {ApplicationContext = new ClassPathxMlapplicationContext ("bean.xml"); Car Car = (car) context.getbean ("car"); car.go (); }}В приведенном выше коде автомобильный объект создается к весне. Когда Spring создает этот объект, он обнаруживает, что один из его методов настроен как Pointcut. Следовательно, при создании объекта будет создан прокси -объект. Когда метод вырезания точкой go () будет выполнен, он будет перехвачен прокси-объектом, созданным весной. Перед запуском метода GO он вызовет соответствующий предварительный предварительный процесс Carlogger's соответствующий предварительный процесс Beforerun (), затем вызовет метод Car.go (), а затем вызовет постпроцесс класса Carlogger Afterrun ().
Примечание: пружина должна использоваться для создания объекта, содержащего касательные. Если вы создаете его самостоятельно, Spring не может отслеживать его, и ее работа не будет уведомлена, применяя какое -либо приложение.
Выходной результат проекта
Автомобиль будет rungo Go Go! Автомобиль работает
Используйте окружающие уведомления
Если вы хотите использовать окружающие уведомления, нам необходимо изменить методы уведомления и файлы конфигурации в классе аспекта. Бизнес -класс не должен вносить какие -либо изменения, потому что они полностью отделены. Сначала изменить класс секции Carlogger
Import org.aspectj.lang.proudecingjoinpoint; открытый класс Carlogger {public void vourserrun (ходатайство Joinpoint joinpoint) {System.out.println («Автомобиль будет работать»); try {// вызов целевого метода объекта прокси, в этом примере, указывающем на метод car.go () joinpoint.proceedceed (); } catch (throwable e) {e.printstacktrace (); } System.out.println ("Автомобиль работает"); }}Метод, окружающий уведомление, необходимо принять параметры типа HortingingJoinpoint, и его метод Process () будет вызывать целевой метод прокси -объекта, поэтому при нормальных обстоятельствах этот метод должен быть вызван. Мы также можем организовать пробег объекта прокси, не вызывая этот метод.
Далее измените AOP: конфигурационную часть файла конфигурации на следующее
<aop: config> <aop: аспект ref = "logger"> <aop: pointcut expression = "execution (* com.wowo.spring_aop_demo1.car.go (..))" id = "Go"/> <aop: aste method = "vestrun" pointcut-ref = "go"/> </aop: apect> </aop: configt-ref = "/> </aop: apect>
Примечание. Уведомления о окружении не могут существовать в то же время, что и уведомления спереди/задней части. После запуска кода результат вывода остается неизменным.
Суммировать
Выше приведено все контент, разделяемый этой статьей о введении в демо -версию Spring AOP, я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!