Сверхподробное изложение технических моментов весеннего интервью Alibytes (рекомендуемая коллекция)

Spring опрос

предисловие

Как самая популярная технология разработки Java, Spring имеет превосходный дизайн внутреннего исходного кода.

Слово Spring не должно быть незнакомо разработчикам Java.Возможно, вы используете Spring каждый день и наслаждаетесь услугами, предоставляемыми экосистемой Spring. Многие интернет-компании сейчас используют Spring как один из самых важных источников информации на собеседованиях при приеме на работу.

Не будет преувеличением сказать, что если Java-программисты хотят попасть на фабрики первого уровня, нужно освоить Spring.

В конце статьи есть преимущества ~

Трудно быть программистом, а в 2020 году быть программистом еще сложнее.С увеличением числа ИТ-персонала растет и наше конкурентное давление.Если мы хотим выделиться из толпы, мы на самом деле изучаем наш технологический стек, широта и глубина.

Каковы три философских вопроса общего весеннего интервью? Почему? как пользоваться?

![](https://pic1.zhimg.com/v2-be76771c70ca3852041a25f256892244_b.jpeg)
На что именно Spring смотрит внизу? Ниже приводится краткое изложение основных моментов знаний о Spring, которым я хотел бы поделиться с вами, надеясь помочь вам освоить Spring.

Сначала поделитесь ментальной картой точек знаний Spring со всеми

Во-первых, общее введение в функции Spring framework.

**Sring Core Container**
Роль модулей. Модули Core и Beans являются основными частями фреймворка, обеспечивающими IoC (инверсию управления) и функции внедрения зависимостей. Базовой концепцией здесь является BeanFactory, которая обеспечивает классическую реализацию шаблона Factory, чтобы устранить необходимость в процедурном шаблоне singleton и действительно позволяет вам отделить зависимости и конфигурацию от логики программы.

1. Core

Он в основном включает в себя базовые основные классы инструментов среды Spring. Другие компоненты Spring используют классы в этом пакете. Модуль Core является базовым ядром других компонентов.

2. Beans (роль BeanFacotry)

Он включает в себя доступ к файлам конфигурации, создание bean-компонентов и управление ими, а также выполнение Inversion of Control | Dependency.
Все классы, связанные с операциями внедрения (IoC/DI)

3.Context

Работа с BeanFactory по-прежнему является ролью ApplicationContext.
Модули построены на основе модулей Core и Beans и предоставляют метод доступа к объектам в стиле фреймворка, аналогичный регистратору JNDI. Модуль Context наследует характеристики Bean-компонентов и предоставляет большое количество расширений ядра Spring, добавляя поддержку интернационализации (например, привязки ресурсов), распространения событий, загрузки ресурсов и прозрачного создания Context. Модуль Context также поддерживает некоторые функции J2EE, а интерфейс ApplicationContext является ключом к модулю Context.
Существенное отличие: (бины, использующие BeanFacotry, загружаются лениво, ApplicationContext загружается не лениво)

4.Expression Language

Модули предоставляют мощный язык выражений для запросов и управления объектами во время выполнения. Это расширение единого языка выражений, определенного в спецификации JSP 2.1. Язык поддерживает установку/получение значений свойств, присвоение свойств, вызов методов, доступ к контексту массивов, контейнеров и индексаторов, логические и арифметические операторы, именованные переменные и доступ к контексту массивов из контейнера IoC Spring. объект. Он также поддерживает проекцию списка, выборку и общую агрегацию списка.

Во-вторых, использование базовых аннотаций контейнера Spring IOC.

Форма файла конфигурации xml VS форма класса конфигурации

1. Определите информацию Bean на основе xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
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.xsd"> 
<!-- 定义一个Bean的信息 -->
<bean id="car" class="com.demo.compent.Car"></bean> 
</beans>
Подойдите к контейнеру, чтобы прочитать Бин
public static void main( String[] args ) 
{ 
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); 
System.out.println(ctx.getBean("person")); 
} 

2. Определите информацию Bean на основе формы чтения классов конфигурации

@Configuration 
public class MainConfig { 
@Bean 
public Person person(){ 
return new Person(); 
} 
} 
Перейдите к контейнеру, чтобы прочитать информацию о компоненте (перейдите в класс конфигурации)
public static void main( String[] args ) 
{ 
AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(MainConfig.class); 
System.out.println(ctx.getBean("person")); 
} 

В-третьих, анализ исходного кода контейнера Spring Ioc.

Основной процесс запуска контейнера IOC

i0:>org.springframework.context.support.AbstractApplicationContext#refresh

Процесс обновления контейнера IOC

i1>org.springframework.context.support.AbstractApplicationContext#prepareRefresh

Подготовьтесь к обновлению контекста контейнера prepareRefresh();

i2> ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

Инициализировать контейнер

i3>org.springframework.context.support.AbstractApplicationContext#prepareBeanFactory

Зарегистрируйте системные компоненты по умолчанию для контейнера IOC

i4>org.springframework.context.support.AbstractApplicationContext#postProcessBeanFactory

Переопределение подкласса для дополнительной обработки

i5>org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcess

Вызвать постпроцессор bean-проекта

i6>org.springframework.context.support.AbstractApplicationContext#registerBeanPostProcessors

Зарегистрируйте постпроцессор компонента

i7>org.springframework.context.support.AbstractApplicationContext#initMessageSource

Инициализировать интернационализированные ресурсы

i8>org.springframework.context.support.AbstractApplicationContext#initApplicationEventMulticaster

Зарегистрируйте мультикастер событий

i9>org.springframework.context.support.AbstractApplicationContext#onRefresh

Оставьте это подклассу для реализации, отсюда запускается springboot

i10>org.springframework.context.support.AbstractApplicationContext#registerListeners

Зарегистрируйте прослушиватель событий с помощью многоадресной рассылки

i11>org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization

Создать экземпляр компонента

i12:org.springframework.context.support.AbstractApplicationContext#finishRefresh

Обновление контейнера завершено, и отсюда запускается eureka.

В-четвертых, как Spring решает циклические зависимости

**Что такое циклическая зависимость?**
Так называемая круговая зависимость состоит в том, что A зависит от B, B зависит от A или A зависит от B, B зависит от C, а C зависит от A.
![](https://pic2.zhimg.com/v2-d2113a52b4c9792eb31e8c0b5ae29495_b.jpeg)

1. Пример кода:

//getter/setter
public class InstanceA {
 private InstanceB instanceB;
}
public class InstanceB {
private InstanceA instanceA;
}

<bean id="instanceA" class="com.tuling.circulardependencies.InstanceA">
<property name="instanceB" ref="intanceB"></property>
</bean>
<bean id="intanceB" class="com.tuling.circulardependencies.InstanceB">
<property name="instanceA" ref="instanceA"></property>
</bean>

2. Возможные проблемы:

Когда контейнер IOC создает bean-компонент, он сначала создает экземпляр instanceA по порядку. Затем я внезапно обнаружил, что мой instanceA зависит от моего instanceB;
Затем контейнер IOC создает экземпляр instanceB, а затем обнаруживает, что instanceA зависит от instanceB. Если контейнер не справится с этим, IOC будет выполнять описанный выше процесс бесконечно, пока не произойдет сбой программы исключения памяти.

3. Решение:

Конечно, Spring этого не допустит. Когда контейнер обнаружит, что beanB зависит от beanA, контейнер получит раннюю ссылку на объект beanA и внедрит эту раннюю ссылку в beanB, позволяя beanB завершить создание экземпляра первым. После того, как beanB завершит создание экземпляра, beanA может получить ссылку на beanB, а beanA завершит создание экземпляра. Вы можете не знать, что здесь означает «ранняя ссылка», так что не беспокойтесь об этом...

Пять, анализ исходного кода Spring Aop

Основные концепции АОП

1. Сквозные проблемы (какие методы включены)

Какие методы перехватывать и как с ними бороться после перехвата, эти проблемы называются сквозными проблемами.

2. Аспект (аспект, извлечь некоммерческий код, первоначально смешанный с кодом бизнес-логики, и поместить ту же функцию в класс, чтобы сформировать аспект)

Класс — это абстракция характеристик объекта, а аспект — это абстракция сквозных интересов.

3. Точка соединения (точка, которую нужно врезать)

Точка перехвата, потому что Spring поддерживает только точку подключения типа метода, поэтому точка подключения в Spring относится к перехваченному методу.На самом деле точка подключения также может быть полем или конструктором

4. Точечная резка

Определение перехватывающих точек соединения

5. Уведомление (совет)

Так называемое уведомление относится к коду, который должен быть выполнен после перехвата точки подключения.Уведомления делятся на пять категорий: предварительные, пост-уведомления, исключения, окончательные и объемные уведомления.

6. Целевая аудитория

Целевой объект прокси

7. Плетение

Процесс применения аспекта к целевому объекту, приводящий к созданию прокси-объекта.

8. Введение

При условии, что код не изменяется, введение может динамически добавлять некоторые методы или поля в класс во время выполнения.

Простой случай

public interface Calculate {	/**	 * 加法	 * @param numA	 * @param numB	 * @return	 */	int add(int numA,int numB); 	/**	 * 减法	 * @param numA	 * @param numB	 * @return	 */	int reduce(int numA,int numB); 	/**	 * 除法	 * @param numA	 * @param numB	 * @return	 */	int div(int numA,int numB); 	/**	 * 乘法	 * @param numA	 * @param numB	 * @return	 */	int multi(int numA,int numB);}

========== Класс реализации

public class TulingCalculate implements Calculate { 	public int add(int numA, int numB) { 		return numA+numB;	} 	public int reduce(int numA, int numB) {		return numA-numB;	} 	public int div(int numA, int numB) {		return numA/numB;	} 	public int multi(int numA, int numB) {		return numA*numB;	}}

========= Класс аспекта

@Aspectpublic class TulingLogAspect { 	@Pointcut("execution(* com.tuling.TulingCalculate.*(..))")	public void pointCut(){}; 	@Before(value = "pointCut()")	public void methodBefore(JoinPoint joinPoint){		String methodName = joinPoint.getSignature().getName(); System.out.println("执行目标方法【"+methodName+"】之前执行<前置通知>,入参"+ Arrays.asList(joinPoint.getArgs()));	} 	@After(value = "pointCut()")	public void methodAfter(JoinPoint joinPoint) {		String methodName = joinPoint.getSignature().getName(); System.out.println("执行目标方法【"+methodName+"】之前执行<后置通知>,入参"+Arrays.asList(joinPoint.getArgs()));	} 	@AfterReturning(value = "pointCut()")	public void methodReturning(JoinPoint joinPoint ) {		String methodName = joinPoint.getSignature().getName(); System.out.println("执行目标方法【"+methodName+"】之前执行<返回通知>,入参"+Arrays.asList(joinPoint.getArgs()));	} 	@AfterThrowing(value = "pointCut()")	public void methodAfterThrowing(JoinPoint joinPoint) {		String methodName = joinPoint.getSignature().getName(); System.out.println("执行目标方法【"+methodName+"】之前执行<异常通知>,入参"+Arrays.asList(joinPoint.getArgs()));	}}

========== Класс конфигурации

@Configuration@EnableAspectJAutoProxy public class MainConfig { 	@Bean	public Calculate calculate() {		return new TulingCalculate();	} 	@Bean	public TulingLogAspect tulingLogAspect() {		return new TulingLogAspect();	}}

Шесть, анализ исходного кода транзакций Spring

Анализ концепции сделки

1. Что такое вещь?

Транзакция — это логический набор исполнительных единиц, которые выполняются либо все, либо ни одна из них.

2. Свойства вещей (КИСЛОТА)

![](https://pic3.zhimg.com/v2-eaaf82016fd16befa234ac61de93528e_b.jpeg)

Что такое КИСЛОТА?

ACID относится к четырем характеристикам транзакции в системе управления базами данных СУБД.
например: в системе базы данных транзакция состоит из серии операций с базой данных для формирования полного логического процесса, такого как банковский перевод, вычитание суммы из исходного счета и добавление суммы к целевому счету.
![](https://pic2.zhimg.com/v2-eac68398ddb1b9876da4913641a2db1d_b.png)

(1) атомарность [атомарность]

Атомарность означает, что операция не может быть разделена, тогда две операции либо завершаются одновременно, либо вообще не завершаются, если транзакция завершается неудачно, то транзакция откатывается, как ни в чем не бывало.

(2) Консистенция [Консистенция]

Непротиворечивость также относительно легко понять, что означает, что база данных всегда должна быть в согласованном состоянии, одно согласованное состояние до начала транзакции, другое согласованное состояние после завершения транзакции, и транзакция переводит базу данных из одного согласованного состояния в другое согласованное состояние. состояние

(3) Изоляция [изоляция]

Так называемая независимость означает, что параллельные транзакции не влияют друг на друга.Если данные, к которым должна обращаться одна транзакция, изменяются другой транзакцией, пока другая транзакция еще не зафиксирована, данные, к которым она обращается, не будут затронуты. незавершенной сделкой влияние. Другими словами, результаты транзакции невидимы для других транзакций до тех пор, пока транзакция не будет зафиксирована.

(4) Прочность [Постоянство]

Если транзакция была зафиксирована, она будет навсегда сохранена в базе данных.

Пространство ограничено, и другой контент не будет отображаться здесь один за другим.Этот основной источник знаний Spring содержит в общей сложности 176 страниц PDF-документов.

Обратите внимание на официальный аккаунт: программисты гонятся за ветром, ответьте 008, чтобы получить сводку основных знаний Spring.

В конце концов

Приветствую всех, чтобы общаться вместе. Если вам понравилась статья, не забудьте подписаться на меня и поставить лайк. Спасибо за вашу поддержку!