1. Обзор конфигурации пружины
1.1. Обзор
Весенний контейнер считывает информацию о конфигурации бобов из конфигурации XML, аннотации Java и пружинной аннотации для формирования реестра определения бобов;
Определить реестр, чтобы создать бобы в соответствии с бобами;
Поместите экземпляры бобов в бассейн кэша из фасоли;
Приложение использует бобы.
1.2. Конфигурация на основе XML
(1) Обзор XML -файла
Xmlns --------------------------------------------------------------------------------------------------------------------------------
XMLNS: xsi ------------ Стандартное пространство имен, используемое для указания файла схемы пользовательского пространства имен
xmlns: xxx = "aaaaaa" ------------ Пользовательское пространство имен, XXX-псевдоним, а следующее значение AAAA-полное имя
xsi: схемалокация -------- Укажите конкретный файл схемы для каждого пространства имен, формат: Адрес файла полного имен имен. Полем Полем Отдельно с пробелами
2. Базовая конфигурация бобов
2.1. Наименование бобов
(1) Идентификатор и имя могут указывать несколько имен, а имена разделены запятыми, полуколонами или пространствами.
<beanname = "#car, 123, $ car" class = "xxxxxxxxx">
Пользователи могут использовать GetBean ("#Car"), GetBean ("123"), GetBean ("$ CAR") для GetBean.
(2) Если не указано атрибуты идентификатора и имени, Spring автоматически использует полностью квалифицированное имя класса в качестве имени боба
(3) Если есть несколько анонимных бобов, то есть нет <Bean/> с указанными идентификаторами и именем, предполагая, что полностью квалифицированное имя класса - XXX.
Затем получите первую фасоль, используя GetBean («XXX»), получите второй фасоль, используя GetBean («XXX#1»), получите третий фасоль, используя GetBean («XXX#2»).
3. Инъекция зависимости
3.1. Инъекция атрибута
(1) Инъекция атрибута требует, чтобы бобы обеспечивали конструктор по умолчанию и предоставляли метод сеттера для атрибутов, которые необходимо вводить. Пружина вызывает конструктор по умолчанию для создания объекта Bean, а затем вызывает метод сеттера, чтобы ввести значение свойства посредством отражения.
(2) Spring будет только проверять, существует ли соответствующий метод сеттера в бобах, и требования не будут предъявлены в отношении того, есть ли соответствующая переменная атрибута в бобах.
(3) Специальные спецификации Javabean для именования атрибутов: первые 2 буквы переменной - это либо все заглавные или все строчные.
3.2. Инъекция конструктора
(1) Порядок конфигурации параметров конструктора не повлияет на результаты конфигурации. Файл конфигурации пружины принимает политику, которая не связана с порядком метки элементов. Эта стратегия может обеспечить определенную информацию о конфигурации в определенной степени.
(2) Сопоставление параметров по индексу
Если тип параметра ввода конструктора одинаково, вам необходимо указать последовательный индекс параметров, в противном случае соответствующее соотношение не может быть определена. нравиться:
<constructor-argindex = "0" value = "xxxxxx"> <constructor-argindex = "1" value = "xxxxxx">
Индекс начинается с 0.
(3) Проблема круговой зависимости
Если конструктор конструктора 2 бобов зависит от другой стороны, возникнет проблема с тупиком потока.
Решение состоит в том, чтобы изменить инъекцию конструктора, чтобы приписать инъекцию.
3.3. Заводский метод инъекция
(1) Нестатический фабричный метод
Поскольку фабричный метод не является статичным, вы должны сначала создать фасоль экземпляра фабричного класса и использовать заводские бобы, чтобы ссылаться на него
<beanid = "carfactory" class = "Factory Class"/> <beanid = "car5" factory-bean = "carfactory" factory-method = "createcar"/>
(2) Статический фабричный метод
<beanid = "car5" class = "Factory Class" Factory-method = "createCar"/>
3.4. Подробное объяснение параметров инъекции
(1) 5 специальных символов в XML
| Специальные символы | Последовательность побега | Специальные символы | Последовательность побега |
| < | < | "" | |
| > | > | ' | ' |
| И | И |
(2) <! [CDATA []]>
Цель <! [CDATA []]> - позволить анализатору XML относиться к строке в теге как обычный текст.
(3) Введите нулевое значение, используя тег <null/>
(4) Каскадные атрибуты
<beanid = "parent" class = "xxxxxxx"> <propertyname = "child.xxx" value = "Значение объекта зависимости"/> </bean>
До Spring3.0, ребенок объекта зависимости должен быть создан сначала, в противном случае будет брошено исключение. После Spring3.0 нет необходимости отображать экземпляры. Контейнер для пружины автоматически создаст создание объекта зависимости.
(5) Сбор коллекций
<setmerge = "true"/>
Обычно используется в подклассах, чтобы объединить элементы сбора родительского класса
(6) Настройка бобов типа коллекции через пространство имен UTIL
Если вы хотите настроить боб типа коллекции вместо свойства типа коллекции, вы можете настроить его через пространство имен UTIL.
3.5. Автоматическая сборка
(1) Элемент <bean/> предоставляет атрибут, который указывает тип Autowire
3.6 Метод впрыска
Если мы вводем прототип бобов в бобы с синглтоном и надеемся вернуть новую фасоль каждый раз, когда мы ее называем, невозможно будет использовать традиционные методы впрыска, потому что действие бобов синглтон-режима, инъекционных бобов, происходит только один раз.
(1) Дополнительное решение состоит в том, чтобы позволить хост -бобам реализовать интерфейс BeanFactoryAware, чтобы хост -фасоль мог получить доступ к ссылкам контейнера, чтобы метод GET можно изменить и контейнер
Factory.getbean ("зависел от бобов"), вы можете получать новейшие бобы каждый раз.
(2) Приведенный выше метод объединяет наш код и пружину, что является худшим способом, и мы можем отделить впрыском метода.
Нам нужно только определить интерфейс и определить абстрактный метод для получения зависимых бобов на границе. Конфигурация пружины заключается в следующем:
<beanid = "car" class = "зависел от Bean"/> <beanid = "host" class = "enterface bean"> <lookup-methodname = "getCar" bean = "car"/> </bean>
Тег элемента Lookup-Method обеспечивает динамическую реализацию для getCar () интерфейсных бобов. Реализация впрыска метода в основном зависит от динамической технологии байт -кодов динамической операции пакета CGLIB.
3.7 Замена метода
Используйте Bean2, чтобы заменить метод GetCar от Bean1, при условии, что Bean2 должен реализовать интерфейс MethodReplacer, а конфигурация заключается в следующем:
<beanid = "bean1" class = "aaaaaaaaaa"> <replected methodName = "getCar" Replacer = "bean2"/> </bean> <beanid = "bean2" class = "bbbbbbbbb"/>
4. Отношения между <Bean>
4.1. Наследование
Конфигурация родительского боба может быть унаследована подклассами, чтобы избежать повторных определений. Конфигурация заключается в следующем:
<beanid = "родительский бон" class = "aaaaaa" Abstract = "true"/> <beanid = "Child Bean" class = "bbbbbb">
Подклассы могут переопределить конфигурацию родительского класса. Если Abstract = "true" родительского класса не указан, родительский боб будет создан экземпляр.
4.2. Зависимость
Некоторые фасоль инстанции зависят от других бобов, а другие бобы должны быть созданы, прежде чем они смогут создавать экземпляр хост -боба. Spring обеспечивает атрибут зависимости и указывает, что в первую очередь создается создание бобов зависимости, например:
<beanid = "host" class = "aaaaaa" зависит от = "b1"/> <beanid = "b1" class = "bbbbbbbb"/>
Если есть несколько бобов заранеезависимости, вы можете создать название бобов за запятыми, пространствами или полуколонами.
4.3. Сфера бобов
(1) Весенний контейнер создаст все бобы, когда он запускается. Если вы не хотите создавать экземпляры заранее, свойство Lazy-INIT = "true" <Bean/> может контролировать задержку экземпляра, но если бобы ссылаются другие бобы, которые необходимо создать заранее, пружина также игнорирует настройку задержки экземпляра.
(2) Связанная с помощью веб-приложения область
Если пользователь использует запрос, сеанс и глобальную область, дополнительная конфигурация должна быть сделана в веб -контейнере сначала:
В нижних версиях веб -контейнеров (до Сервлета 2.3) вы можете использовать конфигурацию фильтра HTTP -запроса:
<Filter> <Filter-name> requestContextFilter </filter-name> <filter-class> org.springframework.web.filter.requestcontextfilter </filter-class> </filter> <Filter-MAPPIN
В более высоких версиях веб -контейнеров вы можете использовать HTTP -прослушитель для настройки:
<Learser> <lloader-class> org.springframework.web.context.request.RequestContextListener </sluster-class> </sluster>
(3) Проблема зависимости
При введении бобов с веб-соисканием в бобы синглтона или прототипа, используйте AOP, например:
<bean id = "web1" scope = "request"> <aop: scoped-proxy/> </bean> <bean id = "singleton1"> <name = "z1" ref = "web1"/> </bean>
4.4. Фабрика
Вообще говоря, Spring использует атрибут класса <bean/> для указания фасолиации класса реализации посредством механизма отражения. Но в некоторых случаях процесс создания бобов более сложный. Если в традиционном способе, в «Bean> требуется большое количество конфигурации». Гибкость метода конфигурации ограничена, и может быть получено простое решение с использованием методов кодирования.
Spring предоставляет org.springframework.beans.factory.factorybean Factory Class Interface для этого, и пользователи могут настроить логику экстенции бобов, реализуя этот интерфейс.
Когда класс реализации, настроенный атрибутом класса <bean/> Factorybean и его подкласса, возврат метода Factorybean () не возвращает фабрику и его подкласс, но объект, возвращаемый методом Factorybean getObject ().
Если вы хотите получить объект FactoryBean и его подкласса, явно префикс Beanname с помощью префикса «&», такого как метод GetBean («& Car5»), когда метод GetBean (Beanname).
5. Конфигурация на основе аннотаций
5.1. Тип аннотации
@Component ----- Нативная аннотация
Произвольные аннотации:
@Repository: аннотировать дао
@Service: Service
@Controller: Аннотация контроллера
5.2. Используйте информацию о конфигурации аннотации, чтобы запустить пружинный контейнер
(1) После весны 2.5 было введено пространство имен контекста, которое обеспечивает применение аннотаций для определения бобов путем сканирования пакета класса:
<Контекст: Component-Scan Base-package = "xxxxxxxxxx" resource-pattern = "xxxx/*. class">
Атрибут ресурса-pattern используется для указания классов в определенных пакетах, которые необходимо сканировать в базовом пакете
(2) Существуют более мощные субботы фильтра
<context: component-scan base-package = "xxxxxxxxxx"> <context: include-filter type = "xxxx" Expression = "xxxxxxxxxxxxxxxx"/> <context: exclude-filter type = "xxxxxxxxxxx"/> <context: Exclude-Filter = "XXXX" expression = "XXXXXXXXXXXX
Из всех типов способность фильтрации AspectJ является наиболее мощной.
5.3. Автоматическая сборка бобов
(1) @autowired
@Autowired Matches по типу по умолчанию. Если в контейнере нет подходящего боба, будет брошено исключение, когда начинается пружинный контейнер. Вы можете использовать @autowired (обязательный = false) для аннотации, и никаких исключений не будет отменено.
Используйте @autowired, чтобы напрямую аннотировать параметры метода. Если метод имеет несколько параметров, по умолчанию, пружина автоматически выбирает бобы, соответствующие типу параметра для инъекции.
Используя аннотацию @autowired annotation переменных сбора, вы можете вводить все бобы, которые соответствуют типу элементов коллекции, что очень мощно.
Используя свойство ассемблера @autowired, не может быть метода сеттера.
(2) @qualifiler
Если в контейнере существует более одного подходящего боба, название бобов может быть квалифицировано аннотацией @qualifiler.
(3) Поддержка маркировки и аннотации
Весна также поддерживает @Resource, определяемый JSR-2550 и @Inject Annotations, определенные JSR-330
@Resource требует, чтобы атрибут атрибута боба был предоставлен. Если атрибут пуст, имя переменной или имя метода будет автоматически использоваться в качестве имени боба.
(4) Ключевые моменты:
Если вы используете только @autowired, нам все равно нужно явно определить узел <bean/> в XML. Весенний контейнер отключает сборку аннотаций по умолчанию. Способ включить его для настройки элемента <context: annotation-config/> в XML.
Но весна также дает еще один трюк. Используя элемент <context: component-scan/>, пружинный контейнер автоматически обнаружит фасоль без явного определения узла <bean/>.
Весна аннотирует класс аннотаций через @Component, @Repository, @Service и @Controller, так что <контекст: компонент-сканирование/> знает, какие классы необходимо зарегистрировать как Springbean.
Если вы используете сторонний пакет JAR и хотите автоматически вводить классы в сторонний пакет JAR, даже если сторонний пакет JAR не аннотирует их аннотациями, элемент фильтра <контекст: включать Filter> может заменить классы на основе аннотации, которые соответствуют экспрессии выражения выражения выражения.
5.4. Сфера действия бобов и метод процесса жизненного процесса
(1) @scope ("xxxx")
Диапазон по умолчанию бобов, настроенный аннотацией, - это Синглтон.
Весна обеспечивает аннотацию @scope. Когда дело доходит до класса, параметры аннотации совпадают с значением атрибута области в XML.
(2) Сравнение методов жизненного процесса
| <Bean> | аннотация |
| init-method | @Postconstruct |
| Дестони-Метод | @Predestroy |
Разница: аннотации могут определять несколько методов в классе, а методы выполняются в порядке
6. Конфигурация на основе Java
6.1. Используйте классы Java для предоставления информации о определении бобов
(1) Обычный POJO может предоставить информацию о определении бобов для весенних контейнеров, если аннотация @Configuration помечена. Каждый метод, помеченный @Bean, эквивалентен предоставлению информации о определении бобов.
(2) @Bean
Тип бона определяется типом возвращаемого значения метода, аннотированного @Bean
Имя по умолчанию бобов такое же, как и имя метода, и его также можно явно указано @bean (name = "xxx").
Вы можете использовать @scope на @bean, чтобы указать объем использования боба
(3) @configuration
Поскольку сам класс аннотаций @Configuration был отмечен аннотацией @Component, любой класс, помеченный @Configurstion, может быть автоматически собран в другие классы с использованием @autowired.
6.2. Запустите пружинный контейнер, используя информацию о конфигурации на основе класса Java
(1) Spring предоставляет класс AnnotationConfigApplicationContect, который может напрямую запустить контейнер пружины через аннотированную аннотацию @configuration.
(2) Когда есть несколько классов конфигурации
Вы можете зарегистрировать один за другим через метод регистрации AnnotationConfigApplicationContect, а затем вызовать метод обновления, чтобы обновить контейнер, чтобы применить эти зарегистрированные классы конфигурации.
Вы также можете использовать аннотацию @import (xxx.class), чтобы ввести все другие классы конфигурации в один класс конфигурации, чтобы вам нужно было зарегистрировать только один класс конфигурации.
(3) См. Конфигурацию @Configuration через класс конфигурации XML
<Контекст: Component-Scanbase-package = "..." "resource-pattern =" Имя класса конфигурации ">
(4) Справочная информация о конфигурации XML в классе конфигурации
Используйте @ImporTresource ("classPath: ............") на @Configuration, чтобы импортировать файл конфигурации XML
6.3. Сравнение 3 методов конфигурации
| XML | аннотация | Java Class |
| Класс внедрения бобов является текущей разработкой проекта | Управлять общей логикой инициализации бобов через код, подходящие для сценариев, где экземпляр бобов является более сложной |
Суммировать
Выше приведено подробное объяснение пружинного сборки бобов в контейнерах МОК. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на этот сайт:
Подробное объяснение трех методов конфигурации бобов в пружине 3.x
Краткое обсуждение разницы между Spring Singleton Bean и Singleton Pattern
Подробное объяснение жизненного цикла использования конфигурации пружины
Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!