История SpringBoot начинается с вопроса на собеседовании
В чем разница между Spring Boot, Spring MVC и Spring?
Опишите их характеристики отдельно:
Spring framework похож на семью, есть много производных, таких как boot, security, jpa и так далее. Но их основой являются ioc и aop Spring, ioc предоставляет контейнер для внедрения зависимостей, aop решает кросс-ориентированное программирование, а затем реализует расширенные функции других расширенных продуктов на основе этих двух.
Spring MVC предоставляет легкий способ разработки веб-приложений. Это модуль Spring, веб-фреймворка. Разрабатывать веб-приложения легко с помощью Dispatcher Servlet, ModelAndView и View Resolver. Затронутой проблемной областью является разработка веб-приложений или услуг — маршрутизация URL-адресов, сеансы, механизмы шаблонов, статические веб-ресурсы и т. д.
Spring Boot реализует автоматическую настройку и снижает сложность построения проекта. В основном для решения проблемы, связанной с тем, что использование среды Spring требует большого количества настроек, чтобы быть слишком хлопотным, поэтому это не решение для замены Spring, а инструмент, тесно интегрированный с средой Spring для улучшения опыта разработчиков Spring. . В то же время он интегрирует большое количество часто используемых сторонних конфигураций библиотек (таких как Jackson, JDBC, Mongo, Redis, Mail и т. д.), и эти сторонние библиотеки в приложениях Spring Boot можно использовать вместо других. из коробки).
Итак, если резюмировать самым кратким языком:
Весна — это «двигатель»;
Spring MVC — это среда MVC, основанная на Spring;
Spring Boot — это пакет интеграции для быстрой разработки, основанный на условной регистрации Spring4.
Как именно SpringBoot обеспечивает автоматическую настройку?
Из кода класс запуска проекта SpringBoot имеет только одну аннотацию @SpringBootApplication и один метод запуска.
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Посмотрите прямо на код @SpringBootApplication:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
@AliasFor(
annotation = EnableAutoConfiguration.class
)
Class<?>[] exclude() default {};
@AliasFor(
annotation = EnableAutoConfiguration.class
)
String[] excludeName() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackages"
)
String[] scanBasePackages() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackageClasses"
)
Class<?>[] scanBasePackageClasses() default {};
}
@SpringBootApplication: содержит аннотации @SpringBootConfiguration (открыть — @Configuration), @EnableAutoConfiguration, @ComponentScan.
@Configuration
@Configuration, используемый классом конфигурации контейнера Spring Ioc в форме JavaConfig, рекомендуется сообществом SpringBoot для использования формы конфигурации на основе JavaConfig.Поэтому после того, как класс запуска здесь помечен @Configuration, это фактически класс конфигурации контейнера IoC.
Сравните разницу между традиционным методом XML и методом настройки конфигурации:
- Декларация 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" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
">
<bean id="app" class="com..." />
- Используя фильтр в качестве примера, JavaConfig настраивается следующим образом:
@Configuration
public class DruidConfiguration {
@Bean
public FilterRegistrationBean statFilter(){
//创建过滤器
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
//设置过滤器过滤路径
filterRegistrationBean.addUrlPatterns("/*");
//忽略过滤的形式
filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
Любое определение класса Java, аннотированное @Configuration, является классом конфигурации JavaConfig.
Для любого метода, отмеченного @Bean, его возвращаемое значение будет зарегистрировано в контейнере IoC Spring как определение компонента, а имя метода по умолчанию будет соответствовать идентификатору определения компонента.
@ComponentScan
@ComponentScan соответствует элементам в конфигурации XML.Функция @ComponentScan заключается в автоматическом сканировании и загрузке соответствующих компонентов (таких как @Component и @Repository) или определений компонентов и, наконец, загрузке этих определений компонентов в контейнер IoC.
Мы можем точно настроить область автоматического сканирования @ComponentScan с помощью атрибутов, таких как basePackages.Если не указано, реализация среды Spring по умолчанию будет сканировать из пакета, который объявляет класс, в котором находится @ComponentScan.
注:所以SpringBoot的启动类最好是放在root package下,因为默认不指定basePackages。
@EnableAutoConfiguration
(основной контент) В переводе с английского это означает автоматическая конфигурация.Если подытожить, то с помощью @Import все определения bean-компонентов, отвечающие условиям автоматической конфигурации, загружаются в IoC-контейнер.
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
Самое главное в нем это @Import(EnableAutoConfigurationImportSelector.class), с помощью EnableAutoConfigurationImportSelector @EnableAutoConfiguration может помочь приложениям SpringBoot загрузить все подходящие конфигурации @Configuration в контейнер IoC, созданный и используемый текущим SpringBoot. Основное использование этого модуля конфигурации — SpringFactoriesLoader.
Подробное объяснение SpringFactoryLoader
SpringFactoriesLoader — загрузчик фабрики Spring. Этот объект предоставляет метод loadFactoryNames. Входными параметрами являются factoryClass и classLoader, то есть необходимо передать имя фабричного класса и соответствующий загрузчик класса. Метод загрузит путь поиска класса загрузчик в соответствии с указанным classLoader.Указанный файл, то есть файл spring.factories, входящий класс фабрики — это интерфейс, а соответствующий класс в файле — это класс реализации интерфейса, или конечный класс реализации.
public abstract class SpringFactoriesLoader {
//...
public static <T> List<T> loadFactories(Class<T> factoryClass, ClassLoader classLoader) {
...
}
public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
....
}
}
Таким образом, файл обычно представляет собой набор имен классов "один ко многим", как показано на рисунке ниже.После получения имен классов этих классов реализации метод loadFactoryNames возвращает коллекцию имен классов.После того, как вызывающий метод получает эти наборы , он проходитотражениеПолучите объекты класса, методы построения этих классов и, наконец, сгенерируйте экземпляры.
Следующий рисунок помогает нам визуализировать процесс автоматической настройки (украденное изображение)AutoConfigurationImportSelector
Продолжите AutoConfigurationImportSelector.class, упомянутый выше. Этот класс в основном фокусируется на методе selectImports.
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return NO_IMPORTS;
} else {
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
configurations = this.removeDuplicates(configurations);
Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
this.checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = this.filter(configurations, autoConfigurationMetadata);
this.fireAutoConfigurationImportEvents(configurations, exclusions);
return StringUtils.toStringArray(configurations);
}
}
Этот метод выполняется перед процессом запуска Springboot — созданием экземпляра bean-компонента и возвращает список информации о классах для создания экземпляра. Если информация о классе получена, Spring может загрузить класс в jvm через загрузчик классов.Теперь, когда мы зависели от компонентов, которые нам нужны, с помощью метода зависимостей Spring-Boot Starter, информация о классе этих компонентов может использоваться в выберите метод.
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}
Метод getCandidateConfigurations в методе возвращает список имен классов классов автоконфигурации.Метод вызывает метод loadFactoryNames для просмотра метода
public static List<String> loadFactoryNames(Class<?> factoryClass, @Nullable ClassLoader classLoader) {
String factoryClassName = factoryClass.getName();
return (List)loadSpringFactories(classLoader).getOrDefault(factoryClassName, Collections.emptyList());
}
Автоконфигуратор найдет соответствующий ключ во всех файлах spring.factories по системному пути проекта в соответствии с входящим factoryClass.getName(), чтобы загрузить классы внутри. Мы выберем файл spring.factories под этим mybatis-spring-boot-autoconfigure
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration
При входе в org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration есть куча аннотаций
@org.springframework.context.annotation.Configuration
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@ConditionalOnBean({DataSource.class})
@EnableConfigurationProperties({MybatisProperties.class})
@AutoConfigureAfter({DataSourceAutoConfiguration.class})
public class MybatisAutoConfiguration
{
private static final Logger logger = LoggerFactory.getLogger(MybatisAutoConfiguration.class);
private final MybatisProperties properties;
private final Interceptor[] interceptors;
private final ResourceLoader resourceLoader;
private final DatabaseIdProvider databaseIdProvider;
private final List<ConfigurationCustomizer> configurationCustomizers;
-
Конфигурация @Spring представляет собой SpringBean с аннотациями,
-
Аннотация @ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class}) означает, что класс конфигурации MybatisAutoConfiguration анализируется только при наличии двух классов SqlSessionFactory.class и SqlSessionFactoryBean.class, в противном случае этот класс конфигурации не анализируется. Нам нужно, чтобы mybatis возвращал нам объект сеанса, поэтому должен быть класс, связанный с фабрикой сеансов.
-
@CondtionalOnBean(DataSource.class): обрабатывает только источники данных, которые были объявлены как bean-компоненты.
-
Аннотация @ConditionalOnMissingBean(MapperFactoryBean.class) означает, что если бин, указанный по имени, не существует в контейнере, будет создана бин-инъекция, иначе он не будет выполнен
Приведенная выше конфигурация может гарантировать, что компоненты, необходимые mybatis, такие как sqlSessionFactory, sqlSessionTemplate и dataSource, могут быть настроены автоматически.Аннотация @Configuration предоставила контекст Spring, поэтому конфигурация вышеуказанных компонентов такая же, как конфигурация mybatis.xml при запуске Spring.
Пока SqlSessionFactory.class и SqlSessionFactoryBean.class существуют в пути к классам на основе проекта SpringBoot, а dataSourceBean зарегистрирован в контейнере, можно запустить автоматическую настройку., а это означает, что мыПока в проект maven добавлено несколько зависимостей, требуемых mybatis, может быть запущена автоматическая настройка., но если будет введена нативная зависимость mybatis, то класс автоматической настройки нужно модифицировать каждый раз при интеграции функции, и эффекта «из коробки» не получится. Таким образом, Spring-boot предоставляет нам унифицированный стартер, который может напрямую настраивать связанные классы, а зависимости (mybatis), необходимые для запуска автоматической настройки, следующие:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
Из-за транзитивности зависимостей maven мы можем полагаться на все классы, которые должны быть автоматически настроены, пока мы полагаемся на стартер для достижения готовых функций. Это также отражает то, что Springboot упрощает большое количество конфигураций XML и сложное управление зависимостями, предоставляемое средой Spring, позволяя разработчикам уделять больше внимания разработке бизнес-логики.
Затем вставьте украденную схему стартовой структуры SpringBoot.
Наконец, я хотел бы поделиться программой, которая, по моему мнению, лучше подходит для экспорта структуры таблиц базы данных.Ссылка действительна в течение семи дней. Ссылка: https://pan.baidu.com/s/1-r9pP9VV3Rws6B8mV-bBMw Пароль: bfy7