1. Примечания
Аннотация - это механизм, похожий на аннотацию. Добавление аннотаций в код может использовать эту информацию через некоторое время позже. В отличие от комментариев, комментарии для нас, чтобы увидеть. Виртуальная машина Java не может составить, и аннотации не составлены, но мы можем прочитать информацию в аннотациях с помощью механизма отражения. Аннотация использует ключевое слово @Interface, наследует java.lang.annotition.annotation
1. Аннотации в джавазе
Позвольте мне привести пример, чтобы рассмотреть, что аннотация в Javase. Ключ - две точки: определение аннотации и как получить информацию выше аннотации посредством отражения.
1. Сначала определите две аннотации. Один из них аннотирован ClassInfo в классе, а другой - аннотированный MethodInfo на методе.
ClassInfo
пакет com.itheima10.annotation; импорт java.lang.annotation.documented; импорт java.lang.annotation.elementtype; импорт java.lang.annotation.retention; импорт java.lang.annotation.retentionpolicy; импорт java.lang.antation.target @target (elementtypepepepepe. использоваться в классе @retention (hestumentpolicy.runtime) // В Java, файлы класса и аннотации времени выполнения @documented // можно сгенерировать в документе справки public @Interface classinfo { /** * Эта аннотация обладает двумя свойствами строкового типа * @return * /string name () defaul ""; String value () default "";}MethodInfo
Пакет com.itheima10.annotation; импорт java.lang.annotation.documented; импорт java.lang.annotation.elementtype; импорт java.lang.annotation.retention; импорт java.lang.annotation.retentionpolicy; импорт java.lang.annotation.target @target (ElementTypepepe.mathodation). использоваться в методах @retention (armentpolicy.runtime) // в Java, файлы класса и аннотации времени выполнения @documenced // можно сгенерировать в документе справки public @Interface methodInfo { /*** Эта аннотация имеет два свойства типа строки* /string name () default ""; String value () default "";}2. Напишите класс аннотации, чтобы использовать аннотацию, определенную выше
пакет com.itheima10.annotation; @classinfo (name = "xiaopingguo118", value = "niu") открытый класс Annotationuse {@methodinfo (name = "java", value = "Spring Framework важна") public java () {}}3. Напишите AnnotationTest тестового класса и проанализируйте свойства выше двух аннотаций
пакет com.itheima10.annotation; import java.lang.reflect.method; import org.junit.test; public class annotationtest {public static void test () { / ** * Если пропорциональна аннотации класса, получите класс *, если разыгрывайте аннотацию метода, Met Method First * / class1 = ITHEIMA.10.class. // Судите, существует ли аннотация ClassInfo в классе if (class1.isannotationpresent (classinfo.class)) {// Получить аннотацию на классе classcinfo classinfo = (classinfo) class1.getannotation (classinfo.class); System.out.println (classinfo.value ()); System.out.println (classinfo.name ()); } Method [] methods = class1.getMethods (); для (метод метода: методы) {// есть ли аннотация метода в методе, проходящем if (method.isannotationpresent (methodinfo.class)) {methodInfo methodInfo = method.getannotation (methodInfo.class); System.out.println (methodInfo.name ()); System.out.println (methodInfo.value ()); }}} @Test public void test () {annotationTest.test (); }}2. Аннотация весной
Spring Framework предоставляет нам функции аннотации.
Использование аннотационных программирования предназначено в основном для замены файлов XML и быстрее развития. Тем не менее, использование XML -файлов заключается в решении проблемы изменения исходного кода программы. Теперь, когда я не использую XML -файлы, разве это не нарушает принцип открытия и закрытия? Это правда. Тем не менее, аннотации также хороши, поэтому вам не нужно настраивать так много файлов XML при использовании аннотаций. Самое главное, что они обладают высокой эффективностью развития. Полем
Когда аннотации не используются, многие теги <Bean> необходимо настроить в файле файла Configuration ApplicationContext.xml из платформы Spring для объявления объектов класса. Используя аннотации, вам не нужно добавлять тяги тега в файл конфигурации, и соответствующее описание состоит в том, чтобы добавлять инструкции в позицию «Комментарий» соответствующего класса. Конкретное введение заключается в следующем:
• 1. Сочетание отношений между объектами @Resource , по умолчанию состоит в том, чтобы собирать по имени. Если связанный объект не может быть найден на основе имени, то поиск по типу будет продолжаться. Если атрибут имени не указан, не указано,
• Когда аннотация отмечена на поле, по умолчанию должно быть название поля в качестве имени боба, чтобы найти объект зависимости
• Когда аннотация отмечена на методе сеттера атрибута, имя атрибута по умолчанию принимается в качестве имени боба, чтобы найти объект зависимости.
• Примечание. Если атрибут имени не указан и объект зависимости не может быть найден по умолчанию, аннотация @Resource возвращается к сборке по типу. Но как только атрибут имени указан, его можно собрать только по имени.
• 2. @Autowired
@Autowired собирается по типу по умолчанию, @Resource собирается по имени по умолчанию, и только тогда, когда боб, соответствующий имени, не может быть найден, будет собрана по типу. Решение состоит в том, чтобы собирать зависимые объекты по типу. По умолчанию требуется существование зависимых объектов. Если нулевые значения разрешены, это может быть установлено на false.
• 3. @Qualifier
Если мы хотим использовать сборку по имени, мы можем использовать ее в сочетании с аннотацией @qualifier.
1. Чтобы использовать аннотации, вам необходимо добавить шаги файла и ограничения в файл конфигурации:
Представление пространства имен контекста
<Beans xmlns = "http://www.springframework.org/schema/beans"
xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance"
xmlns: context = "http://www.springframework.org/schema/context"
...
http://www.springframework.org/schema/context/spring-context-2.5.xsd ">
2. Добавить контекст: тег аннотации-конфиг в файл конфигурации
<Контекст: аннотация-конфиг> </контекст: аннотация-конфиг>
Пример демонстрации:
Напишите класс человека с атрибутом студента и методом SALI (). Код выглядит следующим образом
package com.itheima10.spring.di.annotation;import javax.annotation.Resource;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;/** * @Autowired//Match by type* * @Autowired//Match by введите @Qualifier ("Студент") * */Public Class Person {@Resource (name = "студент") частный студент; public void Shoid () {this.student.say (); }}Код класса студентов выглядит следующим образом
пакет com.itheima10.spring.di.annotation; студент открытого класса {public void say () {System.out.println ("Студент"); }}Настройка файла ApplicationContext.xml
<? xml version = "1.0" Encoding = "UTF-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: context = "http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd "> <!-Поместите человека и студента в пружинный контейнер-> <Bean Id =« Человек »> </bean> <Bean ID =" Студент "! Пространство имен xmlns: context = "http://www.springframework.org/schema/context" http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.sramework.org/schema/context/spring-context-2.5.5.5.sramework.orgemation.> Счастчик, который был введен с момента его начала-> <Контекст: аннотация-конфиг> </контекст: аннотация-конфиг> </beans>
Напишите AnnotationTest Test Class
Пакет com.itheima10.spring.di.annotation; import org.junit.test; import org.springframework.context.applicationContext; импорт org.springframework.context.support.classpathxmlapplicationcontext;/** Принцип:* 1. container is parsed to * <context:annotation-config></context:annotation-config> *, the annotation parser for dependency injection will be started* 4. The spring container will look up within the scope of the beans included in the spring management to see which properties of these classes are added with @Resource annotation* 5. If an attribute is added with @Resource annotation*, it will check whether the value of Атрибут имени аннотации - «» *, если оно «», он будет соответствовать имени атрибута, где находится аннотация, и значение идентификатора в пружинном контейнере. Если совпадение успешно, назначение * Если совпадение не удастся, назначение будет выполнено в соответствии с типом. Если совпадение будет успешным, назначение будет назначено * Если совпадение не удастся, о назначении будет сообщено * Если совпадение не удастся, назначение будет сообщено напрямую * Если совпадение не будет успешным, назначение будет сообщено * Если совпадение не будет успешным, назначение будет сообщено непосредственно *, если совпадение не будет сообщено, что не будет сообщено, что не будет сообщено о назначении. Сравните ссылочный тип XML и аннотации. Эффективность относительно высока. Написание более хлопотно. Написание аннотаций является относительно простым и менее эффективным * */public Class AnnotationTest {@Test public void testannotation () {ApplicationContext context = new ClassPathXmlApplicationContext ("ApplicationContext.xml"); Лично -личность = (человек) контекст.getbean ("person"); Person.say (); }}Если вы используете аннотации, вам не нужно загружать человека и студента в файл конфигурации, что может упростить написание файла конфигурации.
3. сканирование
В предыдущих примерах мы использовали определение фасоли XML для настройки компонентов. В немного большем проекте обычно существуют сотни компонентов. Если эти компоненты настроены с использованием определения фасоли XML, это, очевидно, увеличит размер файла конфигурации, что делает его не очень удобным для поиска и обслуживания. Spring2.5 представляет для нас механизм автоматического сканирования компонентов, который может найти классы, аннотированные с аннотациями @Component, @Service, @Controller и @Repository под классом, и включает эти классы в пружинный контейнер для управления. Его функция такая же, как и использование компонентов конфигурации узла бобов в файле XML. Чтобы использовать механизм автоматического сканирования, нам нужно открыть следующую информацию о конфигурации:
1. Внедрить пространство имен контекста
Добавить контекст: тег компонента-сканирования в файле конфигурации XML
Где базовая упаковка-это пакет (подпака), который необходимо сканировать.
Пример:
Приведенный выше пример записывается в режиме сканирования следующим образом
@ComponentPublic Class Person {@Resource (имя = "студент") частный студент; public void Shoid () {this.student.say (); }}@ComponentPublic Class Student {public void say () {System.out.println ("Студент"); }}ApplicationContext.xml должен быть настроен только в одном предложении
<!-Компонент компонента помещает класс в пружинный контейнер, а класс называется сканированием компонента под пакетом и подпакетом, указанным Base-Package-> <Контекст: компонент-сканирование Base-package = "com.itheima10.spring.scan"> </context: component-scan>
Напишите AnnotationTest Test Class
/*** Принцип* 1. Start Spring Container* 2. 2. Перепружие контейнер. to <bean id = "person"> @component ("aa") открытый класс Person {} == эквивалент <bean id = "aa"> 5. Следуйте этапам анализа @resource: весь процесс сканируется дважды, эффективность становится более низкой, а написание становится проще и проще * */public classttest. ClassPathxMlapplicationContext ("ApplicationContext.xml"); Лично -личность = (человек) контекст.getbean ("person"); Person.say (); }}Появление экземпляров
Мы изменим последнюю систему управления документами в Item51 в аннотации. Интерфейс документа остается неизменным, с методами чтения и записи. Классы реализации являются следующими Exceldocument, PDFDocument и WordDocument.
@Component ("Exceldocument") открытый класс Exceldocument реализует документ {public void read () {System.out.println ("Excel Read"); } public void write () {System.out.println ("Excel write"); }}@Component ("pdfdocument") открытый класс pdfdocument реализует документ {public void read () {System.out.println ("pdf Read"); } public void write () {System.out.println ("pdf write"); }}@Component ("WordDocument") открытый класс WordDocument реализует документ {public void read () {System.out.println ("Word Read"); } public void write () {System.out.println ("Word write"); }}DocumentManager
@Component ("DocumentManager") открытый класс DocumentManager {@Resource (name = "Exceldocument") частное документ; public void read () {this.document.read (); } public void write () {this.document.write (); }}Файл конфигурации
<Контекст: компонент-сканирование base-package = "com.itheima10.spring.iocdi.document">
</контекст: компонент-сканирование>
Напишите тестовый класс DocumentTest
открытый класс DocumentTest {@Test public void testDocument () {ApplicationContext context = new ClassPathxMlApplicationContext ("ApplicationContext.xml"); DocumentManager DocumentManager = (DocumentManager) context.getBean ("DocumentManager"); DocumentManager.read (); DocumentManager.Write (); }} 2. Введение в другие функции аннотации
@Service используется для аннотирования компонентов бизнес -слоя и аннотаций уровня обслуживания
@Controller используется для аннотации компонентов контрольного уровня (например, действие в стойках) и аннотации управляющего слоя
@Repository используется для аннотирования компонентов доступа к данным, то есть компонентов DAO. Аннотация слоя настойчивости
@Component относится к компонентам. Когда компоненты нелегко классифицировать, мы можем использовать эту аннотацию для аннотации.
Примеры воспроизводят случай MVC
Мы снова рассмотрим случаи MVC в Item51, добавляя слои DAO, услуги и действия PersondaoImpl, PersonAction и Personserviceimpl соответственно, чтобы добавить аннотации в DAO, обслуживание и уровни действий PersondaoImpl.
@Repository ("persondao") открытый класс persondaoimpl реализует persondao {@override public void saidperson () {System.out.println ("Save Person"); }} @Service ("personservice") открытый класс Personserviceimpl реализует Personservice {@Resource (name = "persondao") private persondao persondao; public void setpersondao (persondao persondao) {this.persondao = persondao; } @Override public void saveperson () {this.persondao.saveperson (); }} @Controller ("PersonAction") открытый класс PersonAction {@Resource (name = "personservice") частное лицо лица; public void setPersOnservice (Personservice Personservice) {this.personservice = personservice; } public void savePerson () {this.personservice.saveperson (); }}Напишите тест mvctest
открытый класс mvctest {@test public void testmvc () {ApplicationContext context = new ClassPathxMlapplicationContext ("ApplicationContext.xml"); PersonAction PersonAction = (PersonAction) context.getBean ("PersonAction"); PersonAction.saveperson (); }}4. Наследование весной
Весеннее поддерживает наследование, которое можно разделить на наследование класса и наследование атрибутов.
1. Наследование класса
Весенние свойства:
(1) Аннотация: если установить True, это означает, что определенный боб абстрактный, скажите Spring, чтобы не создавать экземпляры бобов;
Вопрос: Должно ли это быть абстрактным классом? Может ли это быть абстрактным классом?
(2) Родитель: указывает функцию идентификатора бобов на бобах, что эквивалентно функции расширения на классе Java;
Сцена: есть три боба:
<bean id = "bean1" class = "… testbean"> <property name = "sex" value = "male"/> </bean> <bean id = "bean2" class = "… testbean"> <name = "sex" value = "male"/> </bean> <bean id = "bean3" class = "…" testbean "> <name =" value = "/bean"/bean "/bean"/bean "/bean"/"/bean"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/"/" "/"/"/"/"/"/"/"/""/Bean ".
Модифицировать: определить Spring Parent Bean
<bean id = "basebean" class = "… testbean"> <name = "sex" value = "male"/> </bean>
Определите подчинки
<bean id = "bean1" parent = "basebean"/> Унаследовать свойства родительского боба <bean id = "bean2" parent = "basebean"/> <bean id = "bean3" parent = "basebean"> перезаписать свойства родительского фасоли <свойство = "sex" value = "Женское"/> <bean>
Детские бобы могут наследовать свойства родительского боба или переопределить свойства родительского фасоли.
2. Атрибут наследование
Есть одинаковые атрибуты между несколькими различными бобами, и сцена можно извлечь:
<bean id = "bean1" class = "… atestbean"> <name = "sex" value = "male"/> <name = "task" ref = "task"/> </bean> <bean id = "bean2" class = "… btestbean"> <property name = "sex" = "мужчина"/> </bean>
Модифицировать: (1) Извлечь публичные атрибуты
<bean id = "basesex" Abstract = "true"> <property name = "sex" value = "male"/> </bean>
(2) Модификация боба
<bean id = "bean1" class = "… atestbean" parent = "basesex"> <name = "task" ref = "task"/> </bean> <bean id = "bean2" class = "… btestbean" parent = "basesex"/>>>
Здесь Бин имеет атрибуты как родителя, так и класса, и Basesex, на который указал родитель, позволяет различным бобам делиться одним и тем же значением атрибута; Когда TransactionProxyFactoryBean объявляет об услуге, наследование атрибута бобов может значительно снизить избыточную конфигурацию XML.
Находящее аннотационные наследование не требует родительских атрибутов.
Давайте сделаем небольшую сводную картину в последний раз
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.