предисловие
Слово Spring не должно быть незнакомо разработчикам Java.Возможно, вы используете Spring каждый день и наслаждаетесь услугами, предоставляемыми экосистемой Spring. Многие интернет-компании сейчас используют Spring как один из самых важных источников информации на собеседованиях при приеме на работу.
В конце статьи есть преимущества ~
Каковы три философских вопроса общего весеннего интервью? Почему? как пользоваться?
Сначала поделитесь ментальной картой точек знаний Spring со всеми
Во-первых, общее введение в функции Spring framework.
1. Core
2. Beans (роль BeanFacotry)
3.Context
4.Expression Language
Во-вторых, использование базовых аннотаций контейнера Spring IOC.
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
i2> ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
i3>org.springframework.context.support.AbstractApplicationContext#prepareBeanFactory
i4>org.springframework.context.support.AbstractApplicationContext#postProcessBeanFactory
i5>org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcess
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
i10>org.springframework.context.support.AbstractApplicationContext#registerListeners
i11>org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization
i12:org.springframework.context.support.AbstractApplicationContext#finishRefresh
В-четвертых, как Spring решает циклические зависимости
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. Возможные проблемы:
3. Решение:
Пять, анализ исходного кода 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. Свойства вещей (КИСЛОТА)
Что такое КИСЛОТА?
(1) атомарность [атомарность]
(2) Консистенция [Консистенция]
(3) Изоляция [изоляция]
(4) Прочность [Постоянство]
Пространство ограничено, и другой контент не будет отображаться здесь один за другим.Этот основной источник знаний Spring содержит в общей сложности 176 страниц PDF-документов.
Обратите внимание на официальный аккаунт: программисты гонятся за ветром, ответьте 008, чтобы получить сводку основных знаний Spring.