В этой статье представлено написание AOP на основе Spring Boot и JDK8, объединяя пользовательские аннотации для достижения общей проверки параметров интерфейса.
причина
В настоящее время широко используемый метод проверки параметров заключается в добавлении аннотаций в класс объектов, но для разных методов применяемые правила проверки также различны. Например, есть объект аккаунта:
Общедоступный класс Accountvo {Private String name; // название частного целочисленного возраста; // Возраст}Предположим, есть бизнес: когда пользователь регистрируется, ему или ей нужно заполнить свое имя, и когда пользователь входит в систему, ему или ей нужно только заполнить свое имя. Тогда очевидно неуместно добавлять правила проверки к классам сущности.
Поэтому я всегда хотел реализовать проверку параметров на уровне метода. Различные методы могут применять различные правила проверки для одних и тех же параметров сущности, которые породили этот инструмент и используются в ежедневной работе в течение длительного времени.
представлять
Давайте сначала посмотрим, как его использовать:
@Servicepublic class testimpl реализует itestservice {@override @check ({"name", "age"}) public void testvalid (accountvo vo) {// ...}}Аннотация @Check на методе указывает, что имени и возрастные свойства в учетной записи параметра не могут быть пустыми. В дополнение к непустым проверке, это также поддерживает суждение по размеру и проверку равенства:
@Check ({"id> = 8", "name! = Aaa", "title <10"})Сообщение об ошибке по умолчанию возвращает поля, вызывает ошибку и называется методами, такими как:
UpdateUserid не должен нулевать, когда вызов testvalidid должен> = 8, когда вызов testvalidName должен!
Также поддерживается пользовательская информация о возврате ошибок:
@Check ({"title <= 8: количество символов заголовка не превышает 8 символов, включая знаки препинания"}) public void testvalid (testpo po) {// ...}Просто добавьте: после правила проверки и напишите пользовательскую информацию, которая заменит сообщение об ошибке по умолчанию.
PS: основной принцип состоит в том, чтобы получить значение поля в объекте параметров посредством отражения, а затем проверить его в соответствии с правилами. Следовательно, в настоящее время поддерживаются только методы, содержащие один параметр, и параметры не могут быть основного типа.
использовать
Как использовать AOP в Spring-Boot, я не буду вдаваться в подробности здесь, и в основном представлю код ядра в AOP.
Зависимости Maven
В дополнение к зависимости от пружины, необходимые сторонние зависимости не являются основными зависимостями, и вы можете выбрать в соответствии с вашими личными привычками:
<!-Для проверки строки-> <Dependency> <groupId> org.apache.commons </GroupId> <TrifactId> commons-lang3 </artifactid> <sersive> 3.3.2 </version> </repertive> <!-Для печати журнала-> <Dependency> <groupid> org.slf4j </GroupD> </artifactId> slf4jjjjjjjjjjj-apactId> </artifactId> slf4jjjjjj-apactiD> </ortfAct> <версия> 1.7.25 </version> </depervice>
Пользовательские аннотации
Импорт java.lang.annotation.elementtype; импорт java.lang.annotation.retention; импорт java.lang.annotation.target; импорт статический java.lang.annotation.retentionpolicy.runtime;/*** Антусия версии параметра* создано Cipher на 2017/20/20. */@Target ({elementtype.type, elementtype.method})@heartention (runtime) public @Interface check {// Правила проверки поля, формат: Имя поля + Правила проверки + Колон + Сообщение об ошибке, например: ID <10: ID должен быть меньше 10 строкиОсновной код
Перехватив метод интерфейса с аннотацией @check, выполните проверку параметров перед выполнением метода. Если есть сообщение об ошибке, оно будет возвращено напрямую:
@Around (value = "@com.cipher.checker.check") // Здесь вам нужно перейти на путь проверки публичных объектов на заказ (точка ход -джонкого). // Строка проверки параметров msg = docheck (point); if (! stringutils.isempty (msg)) {// Здесь вы можете вернуть return Class Incapsulated Throst new allogalargumentException (msg); } obj = point.proceed (); вернуть obj;}Метод проверки ядра в методе Докека, основной принцип состоит в том, чтобы получить правила поля и проверки, указанные на аннотации, получить значение соответствующего поля в объекте параметра посредством отражения, а затем выполните проверку:
/*** Проверка параметра** @param point spectingjoinpoint* @return Сообщение об ошибке*/Private String Docheck (Portingjoinpoint Point) {// Получить значение метода значения параметра [] arguments = point.getArgs (); // Получить метод метода метода = getMethod (точка); String methodInfo = stringUtils.isempty (method.getName ())? "": "во время вызова" + method.getName (); String msg = ""; if (ischeck (method, arguments)) {check annotation = method.getannotation (check.class); String [] fields = annotation.value (); Объект vo = аргументы [0]; if (vo == null) {msg = "param не может быть null"; } else {for (String Field: Fields) {// Полевое поле // Получить значение значения объекта поля = ReflectionUtil.invokegetter (vo, info.field); // выполнить правило проверки Boolean ISValid = info.optenum.fun.apply (value, info.operatornum); MSG = ISVALID? MSG: info.innermsg; }}} вернуть msg;}Вы можете видеть, что основная логика:
Parse Fields -> Получить значение полей -> Выполнить правила проверки
Класс перечисления поддерживается внутри, и соответствующие операции проверки указаны в нем:
/** * Операция enum */enum operator {/** * больше, чем */dear_than (">", checkparamaspect :: isgreaterthan),/** * больше, чем или равна */dear_than_equal ("> =", CheckParamaspepe :: isgreaterthanequal),/** * Меньше, чем */mess_than (", isceretraThanequal),/** меньше, чем */mess_than (", isceraterthanequal). / *** Меньше, чем или равна* / mess_than_equal ("<=", checkparamaspect :: islessthanequal), / *** не равно* / not_equal ("! частное строковое значение; Частная бифункция <объект, строка, логический> веселый; Оператор (строковое значение, бифункция <объект, строка, логическое> веселье) {this.value = value; this.fun = веселье; }} Из -за пространственных причин я не буду расширять все коды один за другим. Заинтересованные друзья могут получить все исходные коды по следующему адресу: Ciphermagic/Java-learn/Sandbox/Checker
Тодо
наконец
Спасибо за чтение. Друзьям, которому это нравится, может понравиться на GitHub. Если у вас есть какие -либо вопросы или предложения, пожалуйста, оставьте сообщение ниже и с нетерпением ждем вашего ответа.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.