Это 25-й день моего участия в ноябрьском испытании обновлений. Узнайте подробности события:Вызов последнего обновления 2021 г."
❤️ Об авторе: Всем привет, я Сяо Сючжу. Высококачественные создатели в области Java 🏆, сертификация эксперта блога CSDN 🏆, сертификация эксперта по совместному использованию облачных сервисов Huawei 🏆
❤️Техническая работа, она должна быть вознаграждена
❤️Нравится 👍 В избранное ⭐Посмотрите еще раз и сформируйте привычку
рассмотрение:
Spring Framework-Понимание Spring Framework (1)
Некоторые из концепций, упомянутых в предыдущей главе, будут подробно объяснены в этой главе.
Что такое МОК
IoC (инверсия управления) Инверсия управления включает два аспекта: 1. Управление. 2. Разворот
Классы и зависимости классов обрабатываются контейнером. IoC — это не технология, а идея, важный принцип объектно-ориентированного программирования, который поможет нам разработать слабосвязанные и более качественные программы.
IOC недостаточно, чтобы добраться до сути, поэтому Мартин Фаулер предложил внедрение зависимостей DI (внедрение зависимостей) для замены IoC, то есть зависимость вызывающего класса от класса реализации интерфейса внедряется третьей стороной (контейнером или совместным классом). ) для удаления вызывающего класса Зависимость класса реализации интерфейса.
Существует два способа IOC: DI (внедрение зависимостей) и DL (поиск зависимостей).
Преимущества МОК
- Это сокращает создание объектов и управление ими и делает иерархию кода более понятной.
- IOC-контейнер Spring — это легковесный контейнер, который не навязчив (не зависит от API контейнера) и не требует реализации каких-то специальных интерфейсов.
- Нам предлагается программировать для интерфейсов.
- Связанность кода уменьшается, и связанные части помещаются в файл конфигурации.Если их взаимосвязь меняется, необходимо изменить только файл конфигурации.
DL (поиск зависимостей)
Программа предоставляет метод поиска и передает его контейнеру для поиска (функция обратного вызова).
Контейнер предоставляет интерфейс обратного вызова и контекст для компонента. И EJB, и Apache Avalon используют этот подход.
В следующем коде показан механизм поиска зависимостей, реализованный на основе JNDI.
public class MyBusniessObject{
private DataSource ds;
private MyCollaborator myCollaborator;
public MyBusnissObject(){
Context ctx = null;
try{
ctx = new InitialContext();
ds = (DataSource) ctx.lookup(“java:comp/env/dataSourceName”);
myCollaborator =
(MyCollaborator) ctx.lookup(“java:comp/env/myCollaboratorName”);
}……
Однако в повседневной разработке EJB используется редко, поэтому многие студенты не слышали о DL (просмотр зависимостей), что нормально, а DI (внедрение зависимостей) всем знакомо больше.
Тем не менее, вы должны использовать эти два поиска:
- Поиск по имени — autowireByName
- Поиск типа — autowireByType
Поиск по имени — autowireByName
Просто возьмите bean-компонент прямо из BeanFactory, обычно используется @Qualifier.
Поиск типа — autowireByType
Обычно используется @autowire
Если в контейнере существует компонент того же типа, что и указанное свойство, он будет автоматически связан с этим свойством. Если есть более одного bean-компонента этого типа, будет выброшено исключение
Простое понимание - соответствовать имени класса
DI (внедрение зависимостей)
Когда объекту нужен другой объект, нет необходимости создавать вызываемый объект в коде, а полагаться на внешний контейнер, который создается внешним контейнером и передается в программу.
Чтобы проиллюстрировать легенду, традиционное программирование показано на рисунке 1, где все активно создают связанные объекты, а затем объединяют их:
фигура 1
При наличии контейнера IoC/DI эти объекты больше не создаются в клиентском классе активно, как показано на рис. 2.
фигура 2
МОК контейнер
Контейнер IOC на самом деле является большой фабрикой, которая управляет всеми нашими объектами и зависимостями.
- Принцип через Javaтехнология отражениячтобы это произошло! Через отражение мы можем получить всю информацию о классе (переменные-члены, имя класса и т. д.)!
- Затем через конфигурационный файл (xml) или аннотацию кописыватьотношения между классами
- Мы можем использовать эту информацию о конфигурации и технологию отражения дляПостроитьИз соответствующих объектов и зависимостей!
Пружинный контейнер (Бобовая фабрика)
- BeanFactory: это самый простой, ориентированный на Spring
- ApplicationContext: основан на BeanFactory и предназначен для разработчиков, использующих среду Spring. Обеспечивает ряд функций!
ApplicationContext всем знаком, большинство приложений Spring используют ApplicationContext.
Разница между BeanFactory и ApplicationContext
BeanFactory можно понимать как фабричный класс, содержащий коллекцию bean-компонентов. BeanFactory содержит определения для bean-компонента, который создает экземпляр соответствующего bean-компонента при получении запроса клиента.
BeanFactory также можно использовать вСоздание отношений между сотрудничающими классами при создании экземпляров объектов. Это освобождает конфигурацию самого компонента и клиента компонента. BeanFactory также содержитУправление жизненным циклом бина, вызов методов инициализации клиента (методы инициализации) и методы уничтожения (методы уничтожения).
ApplicationContext - это подчеркнутый интерфейс для фанатов со всеми функциональными возможностями фасолива, но ApplicationContext на этой основе обеспечивает дополнительную функциональность.
- Обеспечение поддержки международных текстовых сообщений
- Единый метод чтения файлов ресурсов
- События для bean-компонентов, которые были зарегистрированы в прослушивателе
- И beanFactory загружается лениво, экземпляр класса создается, когда класс необходим, а ApplicationContext загружает все одноэлементные компоненты при его инициализации.
Ниже приведены три из наиболее распространенных реализаций ApplicationContext:
1. ClassPathXmlApplicationContext: Считайте контекст из XML-файла конфигурации пути к классам и сгенерируйте определение контекста. Контекст приложения получается из переменных окружения программы
ApplicationContext context = new ClassPathXmlApplicationContext(“bean.xml”);
2. FileSystemXmlApplicationContext: контекст считывается из файла конфигурации XML в файловой системе.
ApplicationContext context = new FileSystemXmlApplicationContext(“bean.xml”);
3. XmlWebApplicationContext: контекст считывается из XML-файла веб-приложения.
Жизненный цикл Spring Bean
Жизненный цикл Spring Bean прост и понятен. При инициализации экземпляра компонента необходимо выполнить ряд операций инициализации, чтобы достичь пригодного для использования состояния. Точно так же, когда bean-компонент не вызывается, его необходимо уничтожить и удалить из контейнера bean-компонента.
Фабрика компонентов Spring отвечает за управление жизненным циклом компонентов, созданных в контейнере Spring. Жизненный цикл бина состоит из двух наборов методов обратного вызова (callback).
- Метод обратного вызова, вызываемый после инициализации.
- Метод обратного вызова, вызываемый перед уничтожением.
Spring Framework предоставляет следующие четыре способа управления событиями жизненного цикла компонента:
-
Интерфейс обратного вызова InitializingBean и DisposableBean
-
Дополнительные интерфейсы Aware для особого поведения
-
Пользовательский метод init() и метод destroy() в файле конфигурации Bean
-
Методы аннотации @PostConstruct и @PreDestroy
использовать
customInit()
а такжеcustomDestroy()``方法管理``bean``生命周期的代码样例如下:
<beans> <bean id="demoBean" class="com.somnus.task.DemoBean" init-method="customInit" destroy-method="customDestroy"> </bean> </beans>
Сборка богов
Spring 4.x запускает сборку контейнера IOC Bean с4 видаСпособ:
- XML-конфигурация
- аннотация
- JavaConfig
- На основе конфигурации Groovy DSL (это редко)
В повседневной разработке обычно используется конфигурация XML + аннотации.
Остальные два, кого заинтересован, может использовать Baidu + Google сами по себе
Метод внедрения зависимостей
Существует 3 способа внедрения зависимостей:
-
инъекция свойств--> пройти
setter()
метод инъекций - Внедрение конструктора
- заводской метод впрыска
В чем разница между внедрением конструктора и внедрением свойств?
- Метод внедрения свойств поддерживает большую часть внедрения зависимостей.Если нам нужно внедрить только переменные типа int, string и long, мы не используем метод внедрения значения установки. Для примитивных типов мы можем установить значения по умолчанию для примитивных типов, если мы не внедряем их. Внедрение конструктора не поддерживает большую часть внедрения зависимостей, поскольку при вызове конструктора должны быть переданы правильные параметры конструктора, иначе будет сообщено об ошибке.
- Внедрение свойств не переопределяет значения конструктора. Если мы используем как внедрение конструктора, так и внедрение установщика для одной и той же переменной, конструктор не сможет переопределить значение, введенное установщиком. Очевидно, потому что конструктор вызывается только при создании объекта.
- При использовании внедрения свойств может быть не гарантировано, была ли внедрена определенная зависимость, то есть отношение зависимости объекта может быть неполным в это время. В другом случае внедрение конструктора не позволяет генерировать объекты с неполными зависимостями.
- Если объект A и объект B зависят друг от друга во время внедрения свойства, Spring выдаст s при создании объекта A.
ObjectCurrentlyInCreationException异常,因为在B对象被创建之前A对象是不能被创建的,反之亦然。所以Spring用设值注入的方法解决了循环依赖的问题,因对象的设值方法是在对象被创建之前被调用的。
Область действия компонента
Фасоль в контейнере Spring можно разделить на 5 областей. Все названия областей говорят сами за себя, но во избежание путаницы поясним:
Используйте 3, 4, 5 прицелы, нужноНастроить прокси вручную
- singleton: эта область действия компонента используется по умолчанию. Эта область действия гарантирует, что независимо от того, сколько запросов получено, в каждом контейнере будет только один экземпляр компонента. Шаблон singleton поддерживается самой фабрикой компонентов.
- прототип: область действия с несколькими экземплярами является противоположностью одноэлементной области действия, предоставляя экземпляр для каждого запроса компонента.
- Запрос: сеть будет в диапазоне каждого запроса компонентов компонента из клиента запроса на создание экземпляра после завершения запроса и произойдет из строя компоновки фаната.
- Сеанс: аналогично области запроса убедитесь, что в каждом сеансе есть экземпляр компонента, и компонент будет признан недействительным после истечения сеанса.
- глобальная сессия: глобальная сессия связана с приложением портлета. Когда ваше приложение развертывается для работы в контейнере портлетов, оно содержит множество портлетов. Если вы хотите объявить глобальную переменную хранения, совместно используемую всеми портлетами, эту глобальную переменную необходимо сохранить в файле global-session. Глобальная область имеет тот же эффект, что и область сеанса в сервлете.
Авторазводка бобов
Используйте атрибут autowire элемента bean, чтобы указать автоматическое связывание определений bean.Существует пять режимов:
- нет Метод по умолчанию не заключается в том, чтобы автоматически связывать bean-компонент путем ручной установки атрибута ref
- Имя компонента, от которого зависит byName, должно совпадать с именем, на которое ссылается класс, и оно будет соответствовать зависимости Имя нашей ссылки в классе — userAutowireDao, поэтому оно будет соответствовать нашему методу userAutowireDao.
- byType автоматически собирается по типу данных параметра.Если тип данных bean-компонента совместим с типом данных атрибута свойства другого bean-компонента, он будет автоматически собран.Простое понимание заключается в том, чтобы соответствовать имени класса.
- Параметры в методе построения автоматически собираются в виде byType.
- default определяется атрибутом default-autowire родительского тега
.
Подробное объяснение общих аннотаций
Внедрение аннотаций заключается в использовании тегов аннотаций для замены регистрации и зависимостей bean-компонентов в нашем файле конфигурации xml.
@Component
для класса
Все классы можно так писать, общие аннотации, это неправильный способ написания, хахаха
@Repository
для класса
Эта аннотация в основном является заявлением о компонентах класса DAO
@Service
Эта аннотация в основном объявляет класс обслуживания
@Controller
В основном объявить класс управления (действие/контроллер springmvc/struts2)
@Resource
используется в классе
По умолчанию аннотация javaEE вставляется byName. Если byName не найден, используйте byType для сопоставления
Эффект такой же, как у Autowired, порядок поиска обратный
@Resource имеет два важных атрибута, а именно name и type. Spring анализирует атрибут name аннотации @Resource как имя компонента, а атрибут type анализирует его как тип компонента. Таким образом, если используется атрибут name, используется стратегия автоматического внедрения byName, а стратегия автоматического внедрения byType используется при использовании атрибута type. Если не указано ни имя, ни атрибут типа, стратегия будет автоматически внедрена с использованием byName через механизм отражения.
@Autowired
используется в классе
Аннотации Spring по умолчанию вводятся byType, — если есть несколько классов реализации, он будет использовать byName (@Qualifier) для соответствия
Эффект такой же, как у ресурса, порядок поиска обратный
Используется с Autowired и Qualifier,
eg:
@Autowired
@Qualifier(value = "TestService2")
private TestService testService;
//класс реализации
@Service("TestService1")
public class TestServiceImpl implements TestService {...}
//класс реализации
@Service("TestService2")
public class TestServiceImpl implements TestService {...}
@Qualifier
аннотацию Spring, вы можете указать имя метода реализации
@Scope
Что касается области действия bean-компонента, вы можете просмотреть приведенные выше концепции, которые не будут повторяться здесь.
Суммировать
Опираясь на идеи других блоггеров: я разберусь с интеллект-картой Spring и выпущу ее, когда АОП будет написан.
Сегодняшнее весеннее введение написано здесь, до свидания!
Использованная литература:
- «Знание практики разработки корпоративных приложений Spring4.x»
№ .OSCHINA.net/U/3777556/ не...Очки знаний Spring IOC собраны в одном месте!
Ууху. Call.com/question/48…Как ответить интервьюеру: ваше понимание Spring
woo woo woo.cn blog on.com/повесить на некоторое время/…Самые полные весенние вопросы и ответы на интервью
blog.CSDN.net/Sun Qingzhong О, ты...Spring Notes — 5 режимов автосвязывания bean-компонентов (автозапись свойств)