Сегодня я продолжаю внедрять AOP. Я лично думаю, что это самый гибкий и расширяемый способ. Возьмите управление журналами в качестве примера, используя форму пользовательских аннотаций Spring AOP для реализации управления журналами. Без лишних слов, начните сразу! ! !
Я скажу еще раз о конфигурации.
Что добавить в ApplicationContext-Mvc.xml
<MVC: Annotation-управляемая /> <!-Активировать функцию сканирования компонентов, автоматически сканирование компонентов, настроенных с помощью аннотации под пакетом com.gcx и его подпакеров-> <Контекст: компонент-сканирование Base-package = "com.gcx" /> <!-Начальная поддержка @AspectJ Annotation-> <!-Proxy-Target-class-class equals, что истинное, что насильно. Proxy-Target-Class является ложным по умолчанию. Если ваш класс реализует интерфейс, перейдите в JDK -прокси. Если нет, перейдите в прокси-сервер Cglib-> <!-Примечание. Рекомендуется использовать прокси-сервер Cglib для простого режима прибыли. Хотя динамический прокси JDK быстрее прокси, чем прокси, его производительность не так хороша, как cglib-> <!-Если вы не пишете Proxy-Target-class = "true" Предложение в порядке-> <aop: AspectJ-autopProxy Proxy-target-class = "true"/> <!-раздел-> <bean id = "Systemlogsecte"> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </> <!
Далее начните писать код.
Создать журнал
открытый класс SystemLog {Private String ID; частная строка описание; частный метод строки; частный длинный логтип; Private String Requestip; частная строка ExceptionCode; частная строка ExceptionDetail; частные строки Params; частная строка CreateBy; Частная дата создана; public String getId () {return id; } public void setId (string id) {this.id = id == null? null: id.trim (); } public String getDescription () {return description; } public void setDescription (строка описание) {this.description = description == null? null: description.trim (); } public String getMethod () {return Method; } public void setMethod (String Method) {this.method = method == null? null: method.trim (); } public long getLogtype () {return logtype; } public void setLogtype (long logtype) {this.logtype = logtype; } public String getRequestip () {return requestip; } public void setRequestip (string requestip) {this.requestip = requestip == null? null: requestip.trim (); } public String getExceptionCode () {return ExceptionCode; } public void setExceptionCode (String ExceptionCode) {this.exceptionCode = exceptionCode == null? null: exceptioncode.trim (); } public String getExceptionDetail () {return ExceptionDetail; } public void setExceptionDetail (string exceptionDetail) {this.exceptionDetail = exceptionDetail == null? null: exceptiondetail.trim (); } public String getParams () {return params; } public void setParams (String params) {this.params = params == null? null: params.trim (); } public String getCreateby () {return createBy; } public void setCreateby (String createBy) {this.createby = createBy == null? null: createby.trim (); } public date getCreatedAte () {return cantureTate; } public void setCreatedAte (дата создан) {this.createdate = censueTate; }}Написание интерфейса DAO
пакет com.gcx.dao; import com.gcx.entity.systemlog; public interface systemlogmapper {int deletebyprimarykey (String id); int insert (systemLog recore); int вставка (системная запись); SystemLog SelectByPrimaryKey (String ID); int updateByPrimaryKey (SystemLog Record);}Написание уровня услуг
пакет com.gcx.service; import com.gcx.entity.systemlog; public interface Systemlogservice {int deletesystemlog (String id); int insert (systemLog recore); int inserttest (SystemLog Record); SystemLog SelectSystemLog (String ID); int updateSystemlog (systemLog record);}Написать обслуживание класса ServiceImpl ServiceImpl
Пакет com.gcx.service.impl; import javax.annotation.resource; импорт org.springframework.stepolype.service; import com.gcx.annotation.log; импорт com.gcx.dao.systemlogmapper; импорт com.gcx.entity.systeml; com.gcx.service.systemlogservice; @Service ("SystemLogService") Общедоступный класс SystemLogServiceImpl реализует SystemLogService {@Resource Private SystemLogmapper SystemLogMapper; @Override public int deletesystemlog (String id) {return systemLogmapper.deleteByprimarykey (id); } @Override public int insert (systemLog record) {return SystemLogMapper.InsertSelective (record); } @Override public SystemLog SelectSyStemLog (String Id) {return SystemLogMapper.selectbyPrimaryKey (id); } @Override public int updateSystemLog (stystemLog record) {return systemLogmapper.updatebyprimarykeyseelective (record); } @Override public int insertTest (systemLog record) {return systemLogmapper.insert (record); }}Здесь базовая программа завершена
Ниже приведена пользовательская аннотация
пакет com.gcx.annotation; импортировать java.lang.annotation.*; @target ({elementtype.parameter, elementtype.method}) @retention (arsentpolicy.runtime) @documented public @Interface log { / ** Тип операции, которая будет выполнена, такая как: добавить операцию ** / public строка / ** Специальная операция, которая должна быть выполнена, например: добавить пользователь **/ public String OperationName () по умолчанию ";}Напишите вырез ниже
пакет com.gcx.annotation; импорт java.lang.reflect.method; import java.util.date; импорт java.util.uuid; импорт javax.annotation.resource; импорт javax.servlet.http.httpserveltrequest; import javax.servlet.http.httpserveltrequest; import.servlet.http.http.httpserveltrequest; import.servlet.http.http.httpserquest; org.aspectj.lang.joinpoint; import org.aspectj.lang.proudeingjoinpoint; импорт org.aspectj.lang.annotation.fter; импорт org.aspectj.lang.annotation.afterreturning; импорт. org.aspectj.lang.annotation.aspept; import org.aspectj.lang.annotation.before; import org.aspectj.lang.annotation.pointcut; импорт org.slf4j.logger; импорт org.slf4j.loggerfactor com.gcx.entity.systemlog; import com.gcx.entity.user; import com.gcx.service.systemlogservice; import com.gcx.util.jsonutil;/** * @author yang jian * @e-mail: электронная почта * @version Создано время: 2015-10-19 4:29:0:05 PM-Mail: @Version Class*/ @Ampose @ComponentPublic Class SystemLogaspect {// Inject Service для сохранения журналов в базу данных @Resource // Я использую здесь аннотация ресурса, обычно используя @Autowired. Их различия. Если у меня будет время, я напишу Private SystemLogService SystemLogService в последующем блоге; Private Static Final Logger logger = loggerFactory.getLogger (SystemLogaspect. Class); // TANGENT CONTROLLER LEAR TANGENT @pointcut ("execution (* com.gcx.controller ..*.* (..)") ") public void controlleraspect () {}/*** Предварительная подписка используется для перехвата контроллера для записи операции пользователя** @param point point*/@before (" Контроллера JoinPoint) { System.out.println ("====================================================================================== ====================================================================== ====================================================================== ====================================================================== ====================================================================== ====================================================================== ===================================================================== System.out.println ("==================================================================================================== ((SurveyingJoinpoint) joinpoint) .proceed (); System.out.println ("============================================================================================================================================= logger.info ("rave" + joinpoint + " /tuse time:" + (end - start) + "MS с исключением:" + e.getmessage ()); Httpservlectrequest = (((servletrequestattributes) = new user (); Class.forname (TargetName); Method.getannotation (log.class) .OperationType (); System.out.println ("Метод запроса:" + (joinpoint.gettarget (). GetClass (). GetName () + " user.getName ()); log.setmethod ((joinpoint.getTarget (). getClass (). getName () + ". log.setexceptiondetail (null); Catch (Exception E) {// Записывает локальный журнал исключений. System.out.println ("====== Creepute Controller Post-return уведомление =============== "ControllerAspect ()", Throwing = "E") Public void DoafterThing (JoinPoint JoinPoint, Throwable E) { /*httpservletRequest requent = (((ServletRequestattributes) requestOntextholder.getRequestTtributes (). getRequest () httpsession sesvic (User) if (joinpoint.getargs ()! = null && joinpoint.getArgs (). Length> 0) {for (int i = 0; i <joinpoint.getargs (). Length; i ++) {params += jsonutil.getJSont (joinpoint.getargs () [i]) +";"; joinpoint.gettarget (). Методы) {if (method.getName (). /*=============== Консоль вывод =========* / System.out.println ("=============== Уведомление об исключении Start ======================================================================================= ========================================================================================== ========================================================================================== ========================================================================================== System.out.println ("Информация об исключении:" + e.getmessage ()); OperationName); log.setid (uuid.randomuuid (). ToString ()); log.setmethod ((joinpoint.getTarget (). getClass (). getName () + "." + База данных SystemLogService.insert (log); ex.getMessage ()); e.getClass (). getName (), e.getClass (). getName (), params);Я много написал здесь, включая предварительную уведомление, уведомление о окружающей среде, уведомление о пост-нотике, уведомление об исключении и уведомление после ящики. Это нормально, если я не напишу все в нашем реальном письме. Я привык писать логику журнала в пост-логе. Я вижу, что некоторые из предварительных уведомлений также включены в предварительные уведомления в Интернете, но я чувствую, что лучше написать это в пост-логических уведомлениях.
Давайте начнем добавлять пользовательские аннотации в контроллер! !
пакет com.gcx.controller; import org.springframework.beans.factory.annotation.autowired; import org.springframework.stereotype.controller; import org.springframework.web.bind.annotation.Requestmapping; import com.gcx.Annotation.log; com.gcx.service.userservice;@controller@requestmapping ("usercontroller") открытый класс usercontroller {@autowired private userservice userservice; @Requestmapping ("testaop") @log (anpormationtype = "Добавить операцию:", anportagename = "добавить пользователя") public void testaop (string username, string пароль) {userservice.adduser (username, пароль); }}Напишите тестовый класс ниже
@Test public void testaop1 () {// start spring inforter applicationcontext ctx = new classpathxmlapplicationcontext (new String [] {"classPath: ApplicationContext-Mvc.xml", "classPath: ApplicationContext-Datasource.xml"}); // Получить сервис или компонент контроллера usercontroller usercontroller = (usercontroller) ctx.getbean ("usercontroller"); usercontroller.testaop ("Zhangsan", "123456"); }Данные базы данных:
Первоначально я хотел написать две касательные точки, одна - это уровень обслуживания, а другой - слой контроллера. Уровень сервиса используется для записи информации об исключении, в то время как уровень контроллера используется для записи функций. Результат бега выглядит следующим образом.
Если вы сделаете это, я не знаю, хороша ли эффективность работы в реальном проекте. Пожалуйста, ознакомьтесь с Daniu в блоге, чтобы дать несколько предложений! !
Приведенный выше пример объяснения метода пользовательских аннотаций Spring AOP для реализации управления журналами - это весь контент, который я делюсь с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.