Аннотации 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», чтобы получить подарочный пакет коллекционного издания электронной книги, тщательно подготовленный для вас вторым братом.