Аннотации весной могут быть примерно разделены на две категории:
1) аннотации, связанные с контейнерами весенних бобов или фабриками из фасоли;
2) аннотации, связанные с Springmvc.
Аннотации, связанные с контейнером Bean's Bean, включают в себя: @Required, @autowired, @postconstruct, @predestory и аннотации в стандартном JSR-330 Javax.Inject.* Эта весна 3.0 была поддержана (@Inject, @nade, @qualifier, @provider, @scope, @singleton).
Аннотации, связанные с Springmvc, включают: @Controller, @Requestmapping, @RequestParam, @Responsebody и т. Д.
Чтобы понять аннотации весной, вы должны сначала понять аннотации на Java.
1. Аннотации на Java
Аннотации начали вводить в Java 1.5. Тот, с которым мы наиболее знакомы, должен быть: @Override, который определяется следующим образом:
/** * Указывает, что объявление метода предназначено для переопределения объявления метода A * в супертипе. Если метод аннотируется с * Компиляторы этого типа аннотации необходимы для создания сообщения ошибки *, если не менее одного из следующих условий не содержится: * Метод действительно переопределяет или реализует метод, объявленный в супертипе *. * Метод имеет подпись, которая переопределяется, эквивалентной для * любого публичного метода, объявленного в объекте. * * @author Peter von der ahé * @author joshua bloch * @jls 9.6.1.4 @override * @since 1.5 */ @target (elementtype.method) @retention (artententionpolicy.source) public @Interface переопределить {}Из аннотации мы видим, что функция @Override состоит в том, чтобы предложить компилятору, что метод, используемый аннотацией @Override, должен переопределить родительский класс или метод того же имени в java.lang.object. Мы видим, что @Target и @retention используются в определении @Override. Это так называемые «мета-аннотации»-это аннотации, которые определяют аннотации, или аннотации, которые аннотации (головокружение ...). Давайте посмотрим на @retention
/** * Указывает, как долго должны быть сохранены аннотации с аннотированным типом. Если аннотация удержания не присутствует на * объявлении типа аннотации, политика удержания по умолчанию * hareverentpolicy.class. * /@Документировано@harement (hareverentpolicy.runtime) @target (elementtype.annotation_type) public @Interface horeation { /*** Возвращает политику удержания. * @return политика удержания */ arsentpolicy value ();}@Retention используется для того, чтобы привести к тому, как долго сохраняется аннотация. Есть три значения:
public enum arsementpolicy { /*** Аннотации должны быть раскрыты компилятором. * / Source, / ** * Аннотация должны быть записаны в файле класса компилятором *, но не должны быть сохранены виртуальной машиной во время выполнения. Это поведение по умолчанию *. * / Class, / ** * аннотации должны быть записаны в файле класса компилятором и * сохраняются виртуальной машиной во время выполнения, чтобы их можно было прочитать отражательно. * * @see java.lang.reflect.annotatedElement */ runtime} Harementpolicy.source сохраняется на уровне исходного кода и заброшенным компилятором (@override - это такого рода); Harementpolicy.class сохраняется на уровне скомпилированного файла класса компилятором, но выброшен виртуальной машиной;
Harementpolicy.runtime зарезервирован до среды выполнения и может быть прочитана отражением.
Посмотрите на @Target:
Пакет java.lang.annotation;/*** Указывает контексты, в которых применим тип аннотации. * Контексты декларации и контексты типов, в которых тип аннотации может быть * применимо, указаны в JLS 9.6.4.1 и обозначены в исходном коде enum * Константы java.lang.annotation.elementtype * @since 1.5 * @jls 9.6.4.1 @Target * @Jls 9.7. */@Документировано@hareveration (harementpolicy.runtime) @target (elementtype.annotation_type) public @Interface Target {/** * Возвращает массив видов элементов, к которому может быть применен тип аннотации *. * @return массив видов элементов тип аннотации * может быть применен к */letrytype [] value ();}@Target используется для привлечения использования этой аннотации, а значения:
public enum elementtype { /** class, интерфейс (включая тип аннотации) или объявление Enum* /type, /** Объявление поля (включает константы enum)* /field, /** Объявление метода* /Метод, /** Формальный параметр «Декларат»* /** Объявление */ annotation_type,/ ** Объявление пакета */ пакет,/ ** * Тип параметра объявления * @since 1.8 */ type_parameter,/ ** * Использование типа * @since 1.8 */ type_use}Указывает, где эта аннотация может использоваться отдельно: 1) класс, интерфейс, аннотация, перечисление; 2) атрибут домен; 3) метод; 4) параметры; 5) конструктор; 6) локальные переменные; 7) тип аннотации; 8) Пакет
так:
@Target (elementType.method) @retention (armentpolicy.source) public @Interface override {}Это означает, что @Override может использоваться только на методах, сохраняющихся на уровне исходного кода, обрабатывается компилятором, а затем отброшен.
Существует также часто используемая мета -аннотация @documented:
/** * Указывает, что аннотации с типом должны быть задокументированы Javadoc * и аналогичными инструментами по умолчанию. Этот тип должен использоваться для аннотирования * объявлений типов, аннотации которых влияют на использование аннотированных * элементов их клиентами. Если объявление типа аннотируется с * документированным, его аннотации становятся частью публичного API * аннотированных элементов. */@Документировано@hareveration (hareverationpolicy.runtime) @target (elementtype.annotation_type) public @Interface Doccorded {}Указывает, могут ли аннотации быть обработаны Javadoc и сохраняться в документе.
2. Настроить и обрабатывать пользовательские аннотации с помощью мета -аннотаций
С мета -аннотациями я могу использовать его для настройки необходимых нам аннотаций. Сочетание пользовательских аннотаций и AOP или фильтров - очень мощное оружие. Например, аннотации могут использоваться для достижения мелкозернистого контроля разрешений - используйте аннотации разрешения на классах или методах, а затем перехватывают их в AOP или фильтрах. Вот реализация аннотации о разрешениях входа в систему:
/*** Не требуется аннотация входа в систему*/@target ({elementtype.method, elementtype.type})@horesting(retentionpolicy.runtime)@documentedpublic @interface nologin {}У нас есть индивидуальная аннотация @Nologin, которая может использоваться на методах и классах. Аннотация сохраняется до выполнения времени и может быть прочитана отражением. Значение этой аннотации: Класс или метод, аннотированный @nologin, можно получить, даже если пользователь не вошел в систему. Ниже приведен процесс аннотации:
/*** Проверьте regin interceptor* Если вам не нужно проверять вход, вы можете добавить @nologin в метод или контроллер*/public class cecklogininterceptor. Предоставляет handlerinterceptor {private static final logger = logger.getLogger (checkLoginInterceptor.class); @overshyserserserserserserserserserserserserserserserserserserserserserserserserserserserserserser. Хэндлер) бросает исключение {if (! (exance -ancomefulf handlermethod)) {logger.warn («Текущий обработчик операции не является handlermethod =" + handler.getClass (). getName () + ", req =" + request.getQuerystring ()); return true;} handlermethod handlermethod = (handlesTring); handlermethod.getmethod (). getName (); // определить, нужно ли вам проверить логин nologin = handlermethod.getmethod (). getannotation (nologin.class); if (null! = nologin) {if (logger.isdebugenabled ()) {logger.debug ("Текущая операция Methodname =" + methodname + "Не нужно проверять логин");} return true;} nologin = handlermethod.getMethod (). getDeclassClass (). if (null! = nologin) {if (logger.isdebugenabled ()) {logger.debug («текущая операция methodname =" + methodname + "Не нужно проверять логин");} return true;} if (null == request.getsession (). getAttribute (commonconstants.session_key_ueser) {logger). "Пользователь не вошел в систему, ip =" + request.getRemoteAddr ()); response.getWriter (). Write (jsonConvertor.convertfailResult (errorcodeenum.not_login) .toString ()); // Сообщение об ошибке return Handler, ModelAndView ModelAndView) Throws Exception {} @Override Public void Aftercomplotion (httpservletRequest, httpservletresponse, обработчик объекта, исключение Ex) Throws Exception {}}Выше мы определяем перехватчик входа в систему, сначала используя отражение, чтобы определить, аннотирован ли метод @nologin:
Nologin nologin = handlermethod.getmethod (). Getannotation (nologin.class);
Затем определите, аннотирован ли класс @nologin:
nologin = handlermethod.getmethod (). getDeclaringClass (). getAnnotation (nologin.class);
Если он аннотирован, он возвращается правдой. Если он не аннотирован, определяется, был ли он вошел в систему. Если он не вошел в систему, он возвращает сообщения об ошибках на передний план и false. Это простой пример использования аннотаций и фильтров для обработки разрешений. Если мы расширимся, мы можем использовать аннотации, чтобы указать, что пользователи могут быть доступны только к определенному методу или классу с определенной ролью или разрешениями, а затем судите в фильтре.
3. Аннотации, связанные с контейнером для весенних бобов
1) @autowired - это аннотация, которую мы используем больше всего. Фактически, Autowire = ByType является автоматической зависимостью инъекции, основанной на типе (инъекция зависимости на основе аннотаций), которая может использоваться в домене, методе и конструкторе.
2) @qualifier - это Autowire = byname. Когда аннотация @autowired определяет, что несколько типов бобов одинаковы, вам необходимо использовать @qualifier («xxbean»), чтобы указать идентификатор зависимого боба:
@Controller @requestmapping ("/user") открытый класс hellocontroller {@autowired @qualifier ("userservice") private userservice userservice;3) @Resource принадлежит к стандарту JSR250 и используется в домене и методах. Это также инъекция зависимости типа ByName. Метод использования: @Resource (name = "xxbean"). @Resource без параметров. Имя класса значений по умолчанию имеет нижний регистр.
4) Аннотации в jsr-330 standard javax.inject.* (@Inject, @Made, @qualifier, @provider, @scope, @singleton). @Inject эквивалентен @Autowired, @named эквивалентен @qualifier, а @named также используется в классе как @component.
5) @Component, @Controller, @Service, @Repository, эти аннотации отличаются от вышеуказанных аннотаций. Вышеуказанные аннотации вводятся в зависимые бобы, и функция этих аннотаций заключается в производстве бобов. Эти аннотации аннотируются на классе, аннотируя класс в бобы один за другим на заводе весеннего фабрики. @Controller, @Service, @Repository в основном @Component с более утонченной семантикой.
6) @postconstruct и @predestroy не используются не для инъекции зависимостей, а для жизненного цикла бобов. Аналогично init-method (инициализирующемуся) Destory-Method (OndayableBean)
4. Обработка аннотаций весной
Обработка аннотаций весной в основном выполняется путем реализации интерфейса Beanpostprocessor:
публичный интерфейс BeanpostProcessor {Object postprocessbefureinialization (объект Bean, String Beanname) Throws Beansexception; Object PostprocessAfterinitialization (объект Bean, String Beanname) бросает Beansexception;}Связанные классы обработки: AutoWireDannotationBeanpostProcessor, CommonannotationBeanpostProcessor, PersistenceannotationBeanpostProcessor, обязательный аннотация beanpostprocessor
Эти классы обработки могут быть неявно настроены в пружинный контейнер через <контекст: аннотация-конфиг/>. Все это обработка инъекции зависимостей, а также обработка аннотаций производственных бобов (@Component, @Controller, @Service, @Repository):
<Контекст: компонент-сканирование Base-package = "net.aazj.service, net.aazj.aop" />
Это делается путем указания отсканированного пути базового пакета, сканируя их на контейнеры для весенних бобов. Обратите внимание, что контекст: Component-Scan также будет настроить AutoWireDannotationBeanpostProcessor и CommonannotationBeanpostProcessor по умолчанию. Поэтому <контекст: аннотация-конфиг/> может быть опущен. Кроме того, контекст: компонент-сканирование также может сканировать аннотацию @aspept aop, но необходимо добавить <aop: AspectJ-autoproxy/> в файл конфигурации для сотрудничества.
5. Разница между весенними аннотациями и стандартными аннотациями JSR-330:
Суммировать
Вышеупомянутое все о быстрое понимание различных аннотаций весной. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!