1: Введение в аннотации Java
Аннотации часто используются в разработке, и я иногда вижу пользовательские аннотации в проектах. Сегодня давайте обсудим, что такое аннотация, а также сценарии применения аннотации и как настроить аннотацию.
В следующих перечислены общие аннотации в разработке
@Override: используется для определения того, что метод наследует от суперкласса. Когда метод родительского класса будет удален или изменен, компилятор будет запрашивать сообщение об ошибке (вы всегда можете увидеть это на методе ToString (), который мы видим чаще всего)
@Deprecated: это означает, что этот класс или метод устарел и истек. Если пользователь все еще хочет использовать его, будет создано предупреждение о компиляции.
@Suppresswarnings: предупреждение компилятора для игнорирования
Джунит Тест: @test
Некоторые аннотации Spring: @controller, @requestmapping, @requestparam, @responsebody, @service, @component, @repository, @resource, @autowire
Аннотации для Java Verification: @notnull, @email
Давайте посмотрим на истинное лицо горы Лу в переопределении аннотации.
@Target (elementType.method) @retention (armentpolicy.source) public @Interface override {} 2: Основные знания аннотации Java
1. Тип данных аннотации Java
Аннотации написаны в файлах .java и используют @Interface в качестве ключевого слова, поэтому аннотации также являются типом данных Java. Из широкого определения класса, интерфейса, перечисления и аннотации все типы классов.
2. Мета -аннотация Java
При создании аннотаций вам нужно использовать некоторые аннотации для описания созданных вами аннотаций, то есть аннотаций, написанных на @Interface. Эти аннотации называются мета -аннотациями, такие как @Target, @retention и т. Д., Виден в переопределении. Вот некоторые мета -аннотации
@Documented: используется, чтобы отметить, включена ли аннотация при генерации Javadoc. Вы можете видеть, что эта аннотация такая же, как @Override, аннотация пуста, и ничего нет.
@Документирован@hareveration (hestententypolicy.runtime) @target (elementtype.annotation_type) public @Interface Doccorded {}@Target: используется для определения того, где можно использовать аннотации. По умолчанию его можно использовать в любом месте, или он может указать область использования. В разработке чаще используется аннотации на классах (таких как @controller), поля (такие как @autowire), методы (такие как @requestmapping), параметры методов (такие как @requestparam) и т. Д.
Тип: класс, интерфейс или объявление перечисления
Поле: домен (атрибут) объявление
Метод: Декларация метода
Параметр: Объявление параметров
Конструктор: объявление метода конструктора
Local_variable: Объявление локальной переменной
Annotation_type: объявление типа комментариев
Пакет: оператор пакета
Target.java
@Документирован@hareveration (hestententypolicy.runtime) @target (elementtype.annotation_type) public @Interface Target { /** * Возвращает массив видов элементов, к которому может быть применен тип аннотации *. * @return массив видов элементов тип аннотации * может быть применен к */ letrytype [] value ();} public enum elementtype { /** class, интерфейс (включая тип аннотации) или объявление Enum* /type, /** Объявление поля (включает константы enum)* /field, /** Объявление метода* /Метод, /** Формальный параметр «Декларат»* /** Объявление*/ annotation_type,/ ** Объявление пакета*/ пакет,/ ** Тип Параметр Объявление*/ type_parameter,/ ** Использование типа*/ type_use}@Inhyted: позволяет подклассам наследовать аннотации в родительском классе и может получить аннотации родительского класса посредством отражения.
@Документирован@hareveration (hestententypolicy.runtime) @target (elementtype.annotation_type) public @Interface inerorited {}@Constraint: используется для проверки того, является ли значение атрибута законной
@Документирован@target ({elementtype.annotation_type})@hareveration (armentpolicy.runtime) public @Interface constraint {class <? Extends constraintValidator <?,? >> [] vasedatedBy ();}@Retention: цикл объявления аннотации используется для определения стадии выживания аннотации. Он может выжить на уровне исходного кода, уровне компиляции (уровень кода байта) и уровне времени выполнения.
Источник: Уровень исходного кода, аннотации присутствуют только в исходном коде и обычно используются для взаимодействия с компилятором и используются для обнаружения кода. Такие как @override, @suppresswarings.
Класс: Уровень байткода, аннотации существуют в исходном коде и файлах байт -кодов. Они в основном используются для генерации дополнительных файлов во время компиляции, таких как XML, файлы Java и т. Д., Но не могут быть получены во время выполнения. Например, Mybatis генерирует предприятия и картирование файлов. На этом уровне необходимо добавить прокси (javaagent) при загрузке JVM, и использовать прокси для динамического изменения файла Bytecode.
Среда выполнения: уровень времени выполнения, аннотации существуют в исходном коде, виртуальных машинах Bytecode и Java. Они используются в основном для выполнения, и отражение может использоваться для получения соответствующей информации.
@Документирован@horest (hestententypolicy.runtime) @target (elementtype.annotation_type) public @Interface hairtention { /*** Возвращает политику удержания. * @return политика удержания */ arsentpolicy value ();} 3. Содержание аннотаций Java
В приведенном выше исходном коде аннотации вы можете видеть, что некоторые аннотации не имеют контента, а некоторые аннотации имеют контент, который, кажется, похож на метод.
Синтаксический формат аннотированного контента: Имя атрибута типа данных () значение по умолчанию по умолчанию тип данных используется для описания типа данных атрибута. Значение по умолчанию означает, что когда атрибут не назначен, значение по умолчанию используется. Как правило, String использует пустую строку «» в качестве значения по умолчанию, а массивы обычно используют пустую массив {} в качестве значения по умолчанию.
Давайте посмотрим на заявление аннотации запроса в Springmvc
@Target ({elementtype.method, elementtype.type})@hareveration (armentpolicy.runtime)@Docment@MappingPublic @Interface requestMapping {string name () default ""; @Aliasfor ("path") string [] value () default {}; @Aliasfor ("value") string [] path () default {}; RequestMethod [] method () default {}; String [] params () default {}; String [] headers () default {}; String [] consumers () default {}; String [] uleves () default {};}Использование аннотации запроса в SpringMVC
@Requestmapping (value = "/list", method = requestMethod.post, provectes = {"application/json; charset = utf-8;"}) public String List () {} 4. Используйте сценарии аннотаций
Вы можете проанализировать сценарии использования аннотаций через период декларации аннотаций:
Уровень исходного исходного кода: для компиляторов, таких как @Override, @Deprecated и т. Д., Существует не так много сценариев, которые должны использовать разработчики.
Класс: Уровень байт -кодов, эта часть редко встречается
Время выполнения: уровень времени выполнения, это наиболее распространенный, и почти все аннотации, используемые разработчиками, являются уровнем выполнения. Аннотации времени выполнения обычно используются в следующих ситуациях
Аннотация без каких -либо атрибутов в аннотации. Эта часть аннотации обычно играет роль аннотации, такую как @Test, @before, @after. Получив эти аннотации тега, выполняется некоторая логическая обработка.
Вы можете использовать аннотацию ограничения @constraint для проверки значения атрибута, такого как @email, @notnull и т. Д.
Вы можете настроить некоторые параметры, используя свойства в аннотации, а затем вы можете использовать отражение для получения этих параметров. Эти аннотации не имеют других специальных функций, они просто настраивают некоторые параметры вместо конфигурации XML. Использование аннотаций для настройки параметров это популярно в Spring Boot, например @Configuration
Что касается метода конфигурации XML против аннотации, обычно используйте XML для настройки некоторых конфигураций, которые не очень близки к деловым отношениям, и используйте аннотации для настройки некоторых параметров, которые тесно связаны с бизнесом.
Три: Java Annotation and Refluection Basic API
// Получить аннотацию определенного типа публика <a Extends Annotation> a Getannotation (класс <a> AnnotationClass); // Получить все аннотации (включая аннотации, измененные в результате унаследованных в родительском классе) Public Annotation [] getAnnotations (); // Получите объявленные аннотации (но не включают аннотации, модифицированные унаследованными в родительском классе) публичная аннотация [] getDeclaredAnnotionations (); // Проверьте, аннотация ли объект аннотация Annotation Public Boolean -IsannotationPresent (Class <? Exnotation> GateSlas SecurityException; // Получить определенный метод публичный метод getMethod (string name, class <?> ... parametertypes);
Четыре: пользовательские аннотации
Используйте пользовательские аннотации + перехватчики или AOP для управления разрешениями.
Следующий пример используется для определения аннотации для ограничения пользователя, который должен войти в систему при доступе к интерфейсу.
Шаг 1: Определите аннотацию
Требуется login.java
@Документирован@target ({elementtype.method})@hareveration (hestentionpolicy.runtime) public @Interface Tresslogin {}Шаг 2: Используйте аннотации
@Controller @requestMapping ("/user") открытый класс usercontroller {@RequiresLogin @Requestmapping (value = "/list", products = {"Application/json; charset = utf-8;"}) public String getUserList () {System.out.println ("----------------------"); return "[{'id': 1, 'username': 'Zhangsan'}]"; }}Шаг 3: Используйте AOP, чтобы перехватить и проанализировать аннотации
public Class LoginAdvices {public void перед (JoinPoint joinPoint), бросает Exception {object target = joinpoint.getTarget (); String methodname = joinpoint.getSignature (). GetName (); System.out.println (target + "-------" + methodname); Method Method = target.getClass (). GetMethod (MethodName); Boolean AnnotationPresent = method.IsannotationPresent (tresslogin.class); if (annotationpresent) {// Пользователь должен войти в логический islogin = false; if (! islogin) {бросить новое исключение («Вы должны войти в систему, чтобы получить доступ к этому интерфейсу»); } else {System.out.println ("login ..."); }}}}Настройка AOP в ApplicationContext.xml
<bean id = "loginadvices"/> <!-конфигурация AOP-> <aop: config proxy-target-class = "true"> <!-раздел-> <aop: аспект ref = "loginadvices"> <!-point-> <aop: pointcut id = "pointcut1" expression = "execution (*com.mengdee.manager.controller. Подключите метод уведомления и точка-> <aop: перед методом = "перед" pointcut-ref = "pointcut1"/> </aop: аспект> </aop: config>
Пользовательские исключения
Зачем настраивать исключения
Хотя Java предоставляет богатое разнообразие классов обработки исключений, пользовательские исключения часто используются в проектах. Основная причина заключается в том, что классы исключений, предоставленные Java, до сих пор не могут удовлетворить потребности различных предприятий в некоторых случаях. Например, некоторые ошибки в системе соответствуют синтаксису Java, но не соответствуют бизнес -логике. Если учетная запись не существует, когда пользователь входит в систему или учетная запись заблокирована, вы можете настроить учетную запись исключения учетной записи.
Или в некоторых случаях одно и то же исключение в Java может быть вызвано несколькими причинами. Нелегко найти ошибки при устранении неполадок. В настоящее время вы можете использовать настройку более четкого исключения.
Преимущества пользовательских исключений: пользовательские исключения могут сделать исключения более ясными и скрывать основные исключения, что является более безопасным и более интуитивно понятным.
Использование пользовательских исключений: пользовательские исключения, как правило, унаследованы от исключения или Runtimeexception. В соответствии с потребностями бизнеса, некоторые атрибуты могут быть приняты в качестве параметров конструктора. Пользовательские исключения требуют, чтобы программисты вручную бросали исключения и обрабатывали исключения.
Ниже приведен пример пользовательских исключений в Apache Shiro
открытый класс ShiroException Extends RuntimeException {public shiroexception () {} public shiroexception (String message) {super (сообщение); } public shiroexception (бросаемая причина) {super (canes); } public shiroexception (строковое сообщение, бросаемое причина) {super (сообщение, причина); }}Выше приведено подробное описание аннотации Java и пользовательских аннотаций