Аннотация Java: Пожалуйста, не недооценивайте меня!

Java

Аннотации Java представляют собой набор метаданных, предоставляющих данные для интерпретации программного кода, но аннотации не являются частью самого интерпретируемого кода. Аннотации не имеют прямого влияния на работу кода.

Толкование аннотаций в Интернете слишком серьезно и жестко, что неялюбимый стиль. Хотя такое объяснение звучит очень профессионально.

Дабы смягчить всеобщую незнакомость с "аннотациями", скажу кое-что интересное. На самом деле, мое первое впечатление от слова «аннотация» — это не аннотации Java, а шедевр Чжу Си «Аннотации глав и предложений в четырех книгах». Почему у меня такая большая дыра в мозгу? потому что когда я пытаюсь перевестиAnnotationКогда это слово используется, результатом будет «аннотация» вместо «аннотация». Аннотации глав и предложений четырех книг - это только важные аннотации, сделанные Чжу Си в четырех книгах: «Великое учение», «Доктрина среднего», «Аналекты Конфуция» и «Мэн-цзы». Вы знаете, эта книга представляет собой банк вопросов и стандартных ответов на имперские экзамены после династий Мин и Цин!

аннотация(Annotation) — это концепция, представленная в Java SE 5.0.classа такжеinterfaceТо же самое, и принадлежит к типу. Многие разработчики думают, что аннотации имеют низкий статус, но это не так. рисунок@Transactional,@Service,@RestController,@RequestMapping,@CrossOriginПодождите, пока эти аннотации будут использоваться все чаще и чаще.

01. Зачем использовать аннотации?

Зачем использовать аннотации? Начнем с другого вопроса.

Слово «кросс-доменный» прилипает к каждому разработчику интерфейсов, как лейкопластырь; я не исключение, хотя я и не являюсь чистым разработчиком интерфейса.

Возникновение междоменных проблем связано с политикой браузера в отношении одного и того же источника: ограничение доступа сценариев, загружаемых из одного источника, к ресурсам из другого источника может эффективно изолировать потенциально вредоносные файлы и является важным механизмом безопасности.

跨域问题

Также существует множество решений междоменных проблем, таких как:

1) JSONP

2) прокси Nginx

3) «Совместное использование ресурсов между источниками» (Совместное использование ресурсов между источниками), именуемоеCORS, что, возможно, является стандартной практикой решения междоменных проблем.

Помню, когда я впервые столкнулся с междоменной проблемой, я специально спросил одноклассника о решении, и он сказал мне, что ответ следующий.

Первый шаг — добавить фильтр в web.xml.

<filter>
  <filter-name>contextfilter</filter-name>
  <filter-class>com.cmower.filter.WebContextFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>contextfilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

Второй шаг — реализовать класс WebContextFilter.

public class WebContextFilter implements Filter {
 
    @Override
    public void destroy() {
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse  httpServletResponse = (HttpServletResponse) response;
        httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
        httpServletResponse.setHeader("Access-Control-Allow-Headers", "accept,content-type"); 
        httpServletResponse.setHeader("Access-Control-Allow-Methods", "OPTIONS,GET,POST,DELETE,PUT"); 
        chain.doFilter(request, httpServletResponse);
         
    }
 
    @Override
    public void init(FilterConfig arg0) throws ServletException {
    }
 
}

Когда я увидел это решение, я был действительно опустошен. Разве это не междоменная проблема, неужели для этого нужно так много кода?

Я очень недоволен таким решением. Поэтому я решил провести небольшое исследование, и на это ушло примерно полдня, я наконец-то разобрался с проблемой "междоменной" и ее стандартным решением.CORS. И нашел очень простое решение -@CrossOrigin, если эта аннотация добавлена ​​в класс Controller, междоменная проблема может быть легко решена.

код показывает, как показано ниже.

@RestController
@RequestMapping("course")
@CrossOrigin
public class CourseController {
}

если не найдено@CrossOriginЭта аннотация, я очень хочу решить междоменную проблему в соответствии с решением, предоставленным моими одноклассниками. Но делать это все равно, что продавать нашу семейную машину и ездить в конной повозке, когда мы путешествуем.

Именно это я и хочу вам сказать, зачем использовать аннотации: они делают наш код чище и современнее.

02. Как определить аннотации?

Аннотация должна пройти@interfaceКлючевое слово (форма очень похожа на интерфейс, но впереди еще одна@) определять. мы можем открыть@CrossOriginВзгляните на исходный код.

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CrossOrigin {
	/**
	 * List of allowed origins, e.g. {@code "http://domain1.com"}.
	 * <p>These values are placed in the {@code Access-Control-Allow-Origin}
	 * header of both the pre-flight response and the actual response.
	 * {@code "*"} means that all origins are allowed.
	 * <p>If undefined, all origins are allowed.
	 * @see #value
	 */
	@AliasFor("value")
	String[] origins() default {};
	/**
	 * List of request headers that can be used during the actual request.
	 * <p>This property controls the value of the pre-flight response's
	 * {@code Access-Control-Allow-Headers} header.
	 * {@code "*"}  means that all headers requested by the client are allowed.
	 * <p>If undefined, all requested headers are allowed.
	 */
	String[] allowedHeaders() default {};
	/**
	 * List of supported HTTP request methods, e.g.
	 * {@code "{RequestMethod.GET, RequestMethod.POST}"}.
	 * <p>Methods specified here override those specified via {@code RequestMapping}.
	 * <p>If undefined, methods defined by {@link RequestMapping} annotation
	 * are used.
	 */
	RequestMethod[] methods() default {};
}

Как видно из приведенного выше кода, «аннотации» на самом деле являются «аннотациями», и кроме множества комментариев и «мета-аннотаций» на самом деле нет ничего.

"Мета-аннотации"? Что такое «мета-аннотации»?

«Мета-аннотации» — это аннотации (существительные), используемые для комментирования (глаголами) аннотаций (существительных). Пожалуйста, почувствуйте широту и глубину китайского языка.@Target,@Retentionа также@DocumentedЭто так называемые метааннотации.

1) @Цель

Цель означает цель,@TargetУказывает сценарий, в котором применяется аннотация. Каковы значения сцены?

  • ElementType.ANNOTATION_TYPE: вы можете аннотировать аннотации
  • ElementType.CONSTRUCTOR: вы можете аннотировать конструктор
  • ElementType.FIELD: вы можете аннотировать поля
  • ElementType.LOCAL_VARIABLE: вы можете аннотировать локальные переменные
  • ElementType.METHOD: Вы можете аннотировать метод
  • ElementType.PACKAGE: Может аннотировать пакет
  • ElementType.PARAMETER: Вы можете аннотировать параметры в методе
  • ElementType.TYPE: вы можете аннотировать типы, такие как классы, интерфейсы и перечисления.

2) @Удержание

Слово Retention означает срок хранения. То есть, когда@RetentionПрименительно к аннотации он объясняет время жизни аннотации. Давайте посмотрим на его диапазон значений.

  • RetentionPolicy.SOURCE: аннотация зарезервирована только на этапе исходного кода, она будет отброшена и проигнорирована при компиляции компилятором.
  • RetentionPolicy.CLASS: Аннотации сохраняются только до компиляции и не загружаются в JVM.
  • RetentionPolicy.RUNTIME: Аннотации можно сохранять до запуска программы, они будут загружены в JVM, поэтому их можно будет получить при запуске программы.

3) @Документировано

DocumentedЭто проще понять, это связано с документацией. Роль заключается в том, чтобы иметь возможность включать элементы аннотации в Javadoc.

Давайте оглянемся назад, когда поймем концепцию мета-аннотаций.@CrossOriginИсходный код, кажется, он намного понятнее?

Если вы можете внимательно прочитать комментарии в исходном коде, вы увидите ключевые слова, появляющиеся в классе WebContextFilter, такие какAccess-Control-Allow-Origin,Access-Control-Allow-Headers,Access-Control-Allow-Methods. То есть, когда мы проходим@CrossOriginПосле аннотирования класса Controller SpringMVC может автоматически добавлять фильтры для решения междоменных проблем в этот класс во время выполнения.

03. Можно ли отразить аннотации?

Аннотации можно получить посредством отражения.

1) Вы можете передать объект классаisAnnotationPresent()Метод определяет, применяется ли указанная аннотация к классу.

2) пройтиgetAnnotation()метод для получения объекта аннотации.

3) Когда объект аннотации получен, может быть получено значение атрибута, определенное при использовании аннотации.

Пример выглядит следующим образом:

@CrossOrigin(origins = "http://qingmiaokeji.com", allowedHeaders = "accept,content-type", methods = { RequestMethod.GET, RequestMethod.POST })
public class TestController {
	public static void main(String[] args) {
		Class c = TestController.class;

		if (c.isAnnotationPresent(CrossOrigin.class)) {
			CrossOrigin crossOrigin = (CrossOrigin) c.getAnnotation(CrossOrigin.class);

			System.out.println(Arrays.asList(crossOrigin.allowedHeaders()));
			System.out.println(Arrays.asList(crossOrigin.methods()));
			System.out.println(Arrays.asList(crossOrigin.origins()));
		}

	}
}

// 输出:[accept,content-type]
// [GET, POST]
// [http://qingmiaokeji.com]

04. Где чаще всего используются аннотации?

1)@Transactional: функциональная поддержка, предоставляемая Spring для управления транзакциями.

2)@ Service: Spring автоматически зарегистрирует этот класс в контейнере Spring при сканировании пакета.

3)@RestController:Да@ResponseBodyа также@Controllerсочетание аннотаций.

То есть код ниже эквивалентен коду ниже.

@RestController
public class HelloController {

    @RequestMapping(value="hello")
    public String sayHello(){
        return "hello";
    }
}
@Controller
@ResponseBody
public class HelloController {

    @RequestMapping(value="hello")
    public String sayHello(){
        return "hello";
    }
}

4)@RequestMapping: одна из наиболее часто используемых аннотаций в веб-приложениях Spring, отображающая HTTP-запросы на методы обработки контроллера MVC и REST.

5)@Select: аннотация оператора запроса, предоставленная MyBatis. Пример выглядит следующим образом:

@Select("select * from city")
List<City> getCitys();

6) Их намного больше, поэтому я не буду перечислять их по одному.

В конце концов

Я хочу сказать, что аннотации имеют много применений, основные из них:

  • Предоставление информации компилятору: компилятор может использовать аннотации для обнаружения ошибок и предупреждений.
  • Обработка на этапе компиляции: программные инструменты могут использовать информацию аннотаций для создания кода и HTML-документов.
  • Обработка во время выполнения: некоторые аннотации могут принимать извлечение кода во время работы программы.

не забудьте:

四书章句集注


PS: Эта статья изначально была опубликована в общедоступной учетной записи WeChat «Silent King Er», и ответьте на ключевое слово «0», чтобы получить подарочный пакет коллекционного издания электронной книги, тщательно подготовленный для вас вторым братом.