Это седьмой день моего участия в августовском испытании обновлений, подробности о мероприятии:Испытание августовского обновления
1. Начало работы со SpringBoot
1.1 Введение в Spring Boot
SpringBoot — это новая платформа, предоставленная командой Pivotal, которая предназначена для упрощения начального процесса создания и разработки новых приложений Spring. Фреймворк использует особый способ настройки, поэтому разработчикам больше не нужно определять шаблонную конфигурацию. Таким образом, Spring Boot стремится стать лидером в быстро развивающейся области быстрой разработки приложений. Причина, по которой SpringBoot может развиваться быстро, заключается в том, что файлы конфигурации переносятся из xml в java-файлы, что сокращает написание файлов конфигурации.
1.2, JavaConfig
Технология JavaConfig используется для замены конфигурации текущего громоздкого xml-файла, и ее наиболее важной альтернативой является использование большого количества аннотаций.
1.2.1. Подготовка проекта
<properties>
<spring.version>5.0.8.RELEASE</spring.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.22</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
1.2.2 Инверсия управления конфигурационным классом для замены конфигурационного файла
1.2.2.1 Создание компонента
public class OneBean {
}
1.2.2.2, создайте класс конфигурации
// 配置类注解,贴上表明这个类是一个配置类
@Configuration
public class AppConfig {
// Bean实例注解,贴有该注解的方法为实例方法,在功能上等价于:<bean name="someBean" class="cn.linstudy.onfig.OmeBean" ></bean>
@Bean
public OneBean oneBean(){
// 注意:实例方法的返回对象会交由Spring容器管理起来
return new SomeBean();
}
}
1.2.2.3 Испытание
@RunWith(SpringRunner.class)
// 引用配置类的注解
@ContextConfiguration(classes = AppConfig.class)
public class App {
@Autowired
private ApplicationContext ctx;
@Test
public void testApp(){
OmeBean omeBean = ctx.getBean("omeBean", SomeBean.class);
System.out.println(omeBean);
}
}
1.2.3 Сканирование компонентов конфигурационного класса вместо конфигурационного файла
1.2.3.1, Сканирование компонента компонента
При изучении среды Spring у Spring есть 4 тега версии (представляющих одно и то же значение, просто для обозначения разных объектов). Когда сканер контейнеров Spring сканирует классы, помеченные меткой макета, он автоматически создает объекты-экземпляры этих классов и передает их контейнеру для управления.
@Controller //标记控制层
public class EmployeeController{
}
@Service //标记服务层
public class EmployeeServiceImpl{
}
@Repository //标记持久层
public class EmployeeDAOImpl{
}
@Component //其他类
public class EmployeeListener{
}
Помимо использования приведенных выше аннотаций, нам также необходимо выполнить настройку в файле xml.
<context:component-scan base-package="指定扫描的包路径"></context:component-scan>
Вместо JavaConfig нам нужно опубликовать аннотации, чтобы сообщить Spring, что нам нужно сканировать этот класс и создавать объекты.
@Component //版型标签
public class OmeBean {
}
Компонент Spring сканирует аннотации, сканирует все классы с меткой версии в пакете и его подпакетах, указанных в свойстве basePackages, и создает объекты для управления контейнером Spring.Если атрибут basePackages не указан, это означает сканирование всех пакетов и подпакетов текущего класса.
@Configuration
//组件扫描标签
@ComponentScan(basePackages ="cn.linstudy.config")
public class AppConfig {
}
1.2.4 Подробное объяснение аннотации @Bean
1.2.4.1, создайте класс OneBean
@Setter
@Getter
public class OneBean {
public OneBean() {
System.out.println("OneBean被创建");
}
public void init() {
System.out.println("OneBean被初始化");
}
public void destroy() {
System.out.println("OneBean被销毁");
}
}
1.2.4.2 Написание классов конфигурации
@Scope("singleton")
@Bean(value = "ob",initMethod = "init", destroyMethod = "destroy")
public OomeBean oomeBean(){
return new OomeBean();
}
1.2.4.3. Резюме
- Атрибут имени в теге bean-компонента = атрибуту name/value в аннотации @Bean.
- Атрибут id в теге bena = имя метода экземпляра метода.
- init-method в теге bean = атрибут initMethod в аннотации @Bean.
- Атрибут destroy-method в теге компонента = атрибут destroyMethod в аннотации @Bean.
- Атрибут области в теге компонента = аннотация @Scope в методе экземпляра
1.2.5 Внедрение зависимостей класса конфигурации вместо файла конфигурации
1.2.5.1, создайте новый класс
public class TwoBean {
}
@Setter
@Getter
public class OneBean {
private Two twoBean;
}
1.2.5.1 Первый метод реализации
Мы можем напрямую вызывать методы экземпляра для реализации внедрения зависимостей.
JavaConfig реализует традиционные зависимости и должен обратить внимание на:
- Объекты omeBean можно получить из контейнера.
- twoBean можно получить из контейнера.
- Компоненты, полученные объектом omeBean с помощью метода getTwoBean(), должны быть равны объектам twoBean, полученным из контейнера.
@Configuration
public class AppConfig {
@Bean
public OmeBean omeBean(){
OmeBean omeBean = new OmeBean();
OmeBean.setTwoBean(twoBean());
return someBean;
}
@Bean
public TwoBean twoBean(){
return new TwoBean();
}
}
Обратите внимание:
- Если метод twoBean() вызывается несколько раз, контейнер Spring выполнит создание объекта twoBean только один раз.Причина: метод twoBean() проксируется контейнером Spring, и проверка компонента контейнера будет выполняться перед каждым Звонок Возьми из контейнера. Если нет, выполните метод и поместите возвращаемое значение в контейнер.
1.2.5.2,Способ реализации второй
Второй способ — реализовать внедрение зависимостей путем внедрения объектов-экземпляров.
@Configuration
public class AppConfig {
@Bean
public OneBean omeBean(TwoBean twoBean){
OneBean omeBean = new OneBean();
omeBean.setTwoBean(twoBean);
return omeBean;
}
@Bean
public TwoBean twoBean(){
return new TwoBean();
}
}
1.2.6 Импорт файлов конфигурации друг в друга
1.2.6.1, @импорт
Аннотация импорта класса конфигурации, прикрепленная к классу конфигурации, эквивалентна: тегу
1.2.6.2, ресурс @import
Аннотация импорта файла конфигурации, прикрепленная к классу конфигурации, эквивалентна: тегу
1.2.7 Загрузка и получение значений конфигурационных файлов
1.2.7.1 Загрузка
Мы можем использовать аннотацию @PropertySource, чтобы загрузить файл конфигурации ресурсов и вставить его в класс конфигурации, чтобы загрузить файл типа свойств в контейнер Spring.
<context:property-placeholder location="classpath:xxx.perperties"/>
1.2.7.2 Стоимость
Когда файл конфигурации загружается, если нам нужно получить значение, мы можем использовать аннотацию @Value, чтобы получить данные конфигурации из конфигурации свойств.
1.2.7.2.1, создайте db.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.126.129:3306/car_crm
jdbc.username=root
jdbc.password=123456
1.2.7.2.2, определить класс
@Setter
@Getter
@ToString
public class MyDataSource {
private String driverClassName;
private String url;
private String username;
private String password;
}
1.2.7.2.3 Получение значения
@PropertySource("classpath:db.properties")
@Configuration
public class AppConfig {
@Value("${jdbc.driverClassName}")
private String driverClassName;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean
public MyDataSource myDataSource(){
MyDataSource source = new MyDataSource();
source.setDriverClassName(driverClassName);
source.setUrl(url);
source.setUsername(username);
source.setPassword(password);
return source;
}
}
1.3, принцип автоматической сборки SpringBoot
1.3.1, основные аннотации SpringBoot
Ядром SpringBoot является аннотация @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 {
1.3.2, Принцип автоматической сборки SpringBoot.
1.3.2.1 Обзор
Запуск SpringBoot загружает большое количество классов автоконфигурации.@SpringBootApplication
Содержит следующие три аннотации:
-
@SpringBootConfiguration
: После того, как мы нажмем, мы обнаружим, что нижний слойConfigurationАннотация, грубо говоря, является поддержкойJavaConfigкак настроить(Использование класса конфигурации Configuration эквивалентно файлу XML.). -
@EnableAutoConfiguration
: НаАвтоматическая конфигурацияФункции. -
@ComponentScan
: этосканированиеАннотация, по умолчанию сканированиеПод текущим классомупаковка. будет@Controller/@Service/@Component/@Repository
Подождите, пока аннотации будут загружены в контейнер IOC.
Когда мы введем @EnableAutoConfiguration, мы обнаружим, что он импортировал аннотацию @implot и импортировал класс конфигурации AutoConfigurationImportSelector, который имеет метод getCandidateConfiguration для получения методов конфигурации-кандидатов, который может читать различные методы конфигурации-кандидаты в META-INF/spring.factories в зависимость Класс конфигурации представляет различные предварительно настроенные конфигурации на основе зависимостей, которые вы вводите в качестве условий.
1.3.2.2, селектор импорта автоконфигурации
@EnableAutoConfiguration
Аннотация импортируетAutoConfigurationImportSelector
Автоматический селектор классов конфигурации, который может реализовать пакетную загрузку классов конфигурации в контейнер Spring. Его основной метод -getCandidateConfigurations
Цель состоит в том, чтобы лежать в конфигурации-кандидате.
protected List<String> getCandidateConfigurations(
AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
getSpringFactoriesLoaderFactoryClass(),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;
}
1.3.2.3, Загрузчик Spring Factory
getCandidateConfigurations
Роль метода заключается в делегированииSpringFactoriesLoader
читать пакет jarMETA-INF/spring.factories
файл и загрузите объект автоконфигурации, настроенный внутри. Это сердце автопроводки.
Чтобы написать стартер, вам нужно следовать спецификации SpringBoot, и вам нужно написать META-INF/spring.factories, который указывает класс автоконфигурации стартера и сообщает SpringBoot, какую конфигурацию нужно разместить заранее, и загружает его напрямую, когда выполняются условия.
1.2.3.4, Анализ RedisAutoConfiguration
Мы принимаемRedisAutoConfiguration
Настройте анализ класса.
Мы нажимаем и смотрим на исходный код, и мы можем обнаружить, что есть четыре аннотации:
-
@Configuration
: указывает, что этот класс является классом конфигурации. -
@ConditionalOnWebApplication(type = Type.SERVLET)
: указывает, что класс, соответствующий проекту, имеет тип Type.SERVLET. -
@ConditionalOnMissingBean({RepositoryRestMvcConfiguration.class})
: Указывает, что если в среде нетRepositoryRestMvcConfiguration
Этот объект Bean вступает в силу. Это точка входа пользовательской конфигурации. -
@ConditionalOnClass({RepositoryRestMvcConfiguration.class})
: указывает, что контейнер существуетRepositoryRestMvcConfiguration
Только этот объект Bean вступит в силу.
@Configuration(
proxyBeanMethods = false
)
@ConditionalOnWebApplication(
type = Type.SERVLET
)
@ConditionalOnMissingBean({RepositoryRestMvcConfiguration.class})
@ConditionalOnClass({RepositoryRestMvcConfiguration.class})
@AutoConfigureAfter({HttpMessageConvertersAutoConfiguration.class, JacksonAutoConfiguration.class})
@EnableConfigurationProperties({RepositoryRestProperties.class})
@Import({RepositoryRestMvcConfiguration.class})
public class RepositoryRestMvcAutoConfiguration {
public RepositoryRestMvcAutoConfiguration() {
}
@Bean
public SpringBootRepositoryRestConfigurer springBootRepositoryRestConfigurer() {
return new SpringBootRepositoryRestConfigurer();
}
}
1.4. Внимание
1.4.1. Почему пакет war не является пакетом jar?
Метод упаковки SpringBoot по умолчанию — это jar-пакет. В предыдущей разработке кот Tomcat и веб-проект были независимыми, и перед тем, как кот Tomcat сможет развернуть военный пакет, должны быть соблюдены определенные правила. Однако проект SpringBoot встроен в Tomcat, а развертывание и работа выполняются за один раз, поэтому его удобно обозначить как пакет jar.
1.4.2, роль spring-boot-starter в файле pom.xml
Когда мы создавали проект SpringBoot, мы могли обнаружить, что было введено много старта Он собрал часто используемые jar-пакеты и различные зависимости на рынке.И эти зависимости управляются версией, чтобы избежать многих конфликтов версий., что значительно упрощает нашу разработку.Если нам нужно ввести зависимость в последующих проектах, нам нужно ввести только ее начало, а версию зависимости вводить не нужно. Перечислите некоторые распространенные стартеры SpringBoot:
spring-boot-starter: 核心启动器 , 提供了自动配置,日志和YAML配置支持
spring-boot-starter-aop: 支持使用 `Spring AOP` 和 `AspectJ` 进行切面编程。
spring-boot-starter-freemarker: 支持使用 `FreeMarker` 视图构建Web 应用
spring-boot-starter-test: 支持使用 `JUnit`, 测试 `Spring Boot` 应用
spring-boot-starter-web: 支持使用 `Spring MVC` 构建 Web 应用,包括 `RESTful` 应用,使用 `Tomcat` 作为默认的嵌入式容器。
spring-boot-starter-actuator: 支持使用 Spring Boot Actuator 提供生产级别的应用程序监控和管理功能。
spring-boot-starter-logging: 提供了对日志的支持 , 默认使用Logback
1.4.3, мощная функция в mave - наследование
Наследование — очень мощная функция в Maven.Наследование позволяет дочернему POM получать некоторые конфигурации (groupId, версия, зависимости, сборка, управление зависимостями и т. д.) в родительском и может выполнять унифицированную настройку и управление зависимостями в дочернем POM.
1.4.4 Разница между DepencyManagement и зависимостями
В файле pom SpringBoot зависимости помещаются в DepencyManagement, так в чем разница между ними:
- зависимости: даже если зависимость не прописана в подпроекте, подпроект все равно унаследует зависимость от родительского проекта (наследовать все).
- dependencyManagement: он только объявляет зависимости и не реализует введение, поэтому подпроекты должны отображать зависимости, необходимые для объявления. Если зависимость не объявлена в подпроекте, она не будет унаследована от родительского проекта, только если зависимость прописана в подпроекте и не указана конкретная версия, она будет унаследована от родительского проекта, а версия и область действия будет унаследован от родительского проекта.Оба читаются из родительского pom, кроме того, если в подпроекте указан номер версии, будет использоваться версия jar, указанная в подпроекте (частичное наследование).
1.4.5 Как запустить SpringBoot без Tomcat
Springboot использует встроенный tomcat, который реализован программно.Порт по умолчанию — 8080, который можно установить с помощью server.port в application.properties.
1.4.6 Подробное объяснение SpringApplication.run(..) в основном методе класса запуска SpringBoot
Основной метод в классе запуска имеет четыре функции:
- Запустите программу SpringBoot.
- Загрузите пользовательский класс конфигурации, чтобы завершить автоматическую сборку.
- Разверните текущий проект во встроенном Tomcat.
- Запустите Tomcat, чтобы запустить проект.
2. Синтаксис конфигурационного файла SpringBoot
2.1 Обзор конфигурационных файлов SpringBoot
Когда мы используем инициализатор spring для создания проекта Spring Boot, нам нужно только ввести зависимость веб-стартера, и он становится веб-проектом, и мы можем получить к нему доступ через localhost: 8080 без какой-либо настройки, потому что Spring Boot автоматически настроил всю информацию о конфигурации для нас на нижнем уровне. Итак, как мы можем изменить информацию о конфигурации по умолчанию? При использовании инициализатора Spring для создания проекта Springboot в каталоге ресурсов автоматически создается файл application.properties. Это пустой файл. Его функция состоит в том, чтобы предоставить нам запись для изменения информации о конфигурации по умолчанию. Spring Boot также предоставляет нам другой стиль файла конфигурации application.yml, хотя это два разных файла, но суть одна, разница в том, что синтаксис немного отличается.
2.2, Синтаксис свойств
Конфигурационный файл application.properties относительно прост. В нем нет пробелов, чтобы различать его. Родительское свойство и дочернее свойство разделены символом.
дифференцированный.
# key = value
server.port=8080
2.3. ЯМЛ
Он представляет собой совершенно новый синтаксический формат, хотя его немного громоздко писать, но это действительно формат файла конфигурации, официально рекомендованный SpringBoot, поскольку он может хранить более сложные типы, чем файл конфигурации свойств. Его грамматические особенности:
- Деликатный случай.
- k: (пробел) v: Указывает пару пар ключ-значение (должны присутствовать пробелы), а иерархическое отношение контролируется отступом пробелов.
- Пока это столбец данных, выровненный по левому краю, это означает, что все они находятся на одном уровне.
- "#" означает комментарий, который игнорируется парсером от этого символа до конца строки.
server:
port: 8080
3. Интеграция с SpringBoot
Самое главное в SpringBoot — интеграция различных фреймворков, в том числе уже знакомых Mybatis, Shiro и т.д.
3.1. Подключиться к базе данных
3.1.1. Введение зависимостей
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--springboot整合jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
3.1.2, источник данных Хикари
3.1.2.1 Обзор
После springboot2.0 используется пул соединений по умолчанию:Hikari, известный как «самый быстрый пул соединений в истории», поэтому мы можем использовать его напрямую без добавления зависимостей.Автоматическая конфигурация Springboot содержит класс конфигурации DataSourceAutoConfiguration, который сначала проверит, есть ли уже объект пула соединений в контейнере, и если , соединение по умолчанию будет использоваться пулом и автоматически настраивает объект пула соединений в соответствии с определенными свойствами, используемые значения свойств поступают из объекта DataSourceProperties.
3.1.2.2, изменить application.properties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql:///ssm_carbusiness?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
3.1.3, Источник данных друидов
3.1.3.1 Обзор
Хотя SpringBoot официально рекомендует источник данных Hikari, если мы хотим использовать источник данных Druid, это также очень просто. Вам нужно только добавить зависимости, в это время добавьтеDruidПакет автоматической настройки springboot, который содержитDruidDataSourceAutoConfigure
Класс автоматической конфигурации автоматически создаст объект пула соединений druid, поэтому springboot обнаружит, что объект пула соединений уже существует, и больше не будет его использовать.Hikari.
3.1.3.2 Введение зависимостей
<!-- druid数据源依赖,记住一定要引带start的 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
3.1.3.3. Изменить application.properties
spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.url=jdbc:mysql:///ssm_carbusiness?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
spring.datasource.druid.username=root
spring.datasource.druid.password=123456
3.1.3.4 Внимание
Если при написании кода мы случайно укажем не тот пакет, и введем обычные зависимости (обычные зависимости без запуска, только собственные зависимости Друида), то это не пакет автоматической настройки. Тогда SpringBoot не будет анализировать или нам нужно вручную настроить его, чтобы он вступил в силу. Нам просто нужно добавить строку конфигурации в application.properties.
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
3.2. Интеграция MyBatis
3.2.1. Введение зависимостей
<!--mybatis集成到SpringBoot中的依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
3.2.2, настроить сканирование интерфейса
В традиционном проекте SSM мы можем указать Spring расположение моего интерфейса Mapper в файле конфигурации, чтобы мы могли создать прокси-объект класса реализации интерфейса Mapper.Без этого файла конфигурации в SpringBoot нам нужно только запустить SpringBoot Just добавьте строку конфигурации в класс.
@SpringBootApplication
// 添加这一行配置,告诉SpringBoot我的Mapper接口的位置在哪里
@MapperScan("cn.linstudy.mapper")
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
3.2.3, свойства конфигурации
В прошлом нам нужно было настроить некоторые свойства в application.xml, чтобы лучше использовать MyBatis, например, расположение файла mapper.xml, включить ли отложенную загрузку, псевдонимы и т. д. Теперь эта информация должна быть в application.properties. .Настроить его.Если он не нужен в бизнесе, его не нужно настраивать.
# 是否1开启懒加载
mybatis.configuration.lazy-loading-enabled=true
# 开启懒加载的方法
mybatis.configuration.lazy-load-trigger-methods=clone
# mapper.xml文件的配置
mybatis.mapper-locations=classpath:cn/wolfcode/*/mapper/*Mapper.xml
# 配置别名
mybatis.type-aliases-package=cn.wolfcode.sb.domain
#打印SQL日志
logging.level.cn.linstudy.mapper=trace
3.3 Управление транзакциями
3.3.1. Введение зависимостей
<!-- 支持使用 Spring AOP 和 AspectJ 进行切面编程。 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
3.3.2, XML-транзакция конфигурации
Примите стратегию смешивания классов конфигурации и XML и используйте @ImportResource("classpath:spring-tx.xml") в классе конфигурации. Мы записываем выражения транзакций, аспектов и точек в этом XML-файле.Не рекомендуется.
3.3.3 Транзакция конфигурации аннотаций
Автоматическая настройка SpringBoot предоставляет класс автоматической настройки аннотации транзакции TransactionAutoConfiguration.После введения зависимостей мы непосредственноКласс реализации бизнес-уровня или его методразмещено непосредственно на@Transactional
Аннотации достаточно, рекомендуется использовать. Не забудьте проверить, поддерживает ли механизм базы данных транзакции, прежде чем использовать его.
SpringBoot по умолчанию использует динамический прокси-сервер CGLIB.Если вы хотите использовать динамический прокси-сервер JDK, вам нужно только написать строку конфигурации в application.properties.
#优先使用JDK代理
spring.aop.proxy-target-class=false
3.4 Обработка статических ресурсов в SpringBoot
3.4.1, расположение статических ресурсов
Стандартный каталог SpringBoot отличается от традиционного каталога maven SSM, у него также есть два каталога под ресурсами для хранения статических ресурсов:
- статический: используется для хранения CSS, JS и других стилей.
- шаблоны: используется для хранения шаблонов страниц.
SpringBoot также имеет правила обработки статических файлов:
- По умолчанию Springboot запускается с пути к классам.
/static
,/public
,/resources
,/META-INF/resources
Загрузите статические ресурсы в четыре места.
-
Вы можете настроить свойство spring.resources.staticLocations в application.properties, чтобы изменить адрес загрузки статического ресурса.
-
Поскольку SpringBoot по умолчанию
static
Путь сопоставления следующих статических ресурсов:/
, поэтому нам не нужно писать, когда мы вводимstatic
.3.4.2, конфигурация сопоставления путей
В автопроводке SpringBoot,WebMvcAutoConfiguration
Класс автоконфигурации импортируемогоDispatcherServletAutoConfiguration
Объект конфигурации создается автоматическиDispatcherServlet
передний контроллер, по умолчанию< url-pattern >
да/
.
3.5 Единая обработка исключений
3.5.1, режим SpringBoot по умолчанию
По умолчанию SpringBoot выдаст все ошибки наBasicErrorController
Класс завершает обработку, неправильное представление направлено наclasspath:/static/error/
иclasspath:/templates/error/**
В пути код состояния http — это имя представления по умолчанию.Если возникает ошибка 404, соответствующий шаблон — 404.html.
Если мы хотим сами написать страницу ошибки, то нам достаточно создать файл шаблона с таким же именем в пути по умолчанию.
3.5.2 Способ улучшения контроллера
Определите самостоятельно усилитель контроллера, который специально используется для унифицированной обработки исключений.Этот метод обычно используется для ошибок типа 5xx.
@ControllerAdvice //控制器增强器
public class ExceptionControllerAdvice {
@ExceptionHandler(RuntimeException.class) //处理什么类型的异常
public String handlException(RuntimeException e, Model model) {
return "errorView"; //错误页面视图名称
}
}
3.6, фильтр
3.6.1, обзор фильтров
Фильтр реализован на основе технологии Servlet. Проще говоря, фильтр должен фильтровать. Он помогает нам фильтровать определенные URL-адреса и выполнять некоторую специальную обработку при разработке веб-проектов. Его основные функции заключаются в следующем:
- Отфильтруйте некоторые нежелательные вещи, такие как некоторые неверные запросы.
- Запрос и соответствующий контент могут быть изменены.
- Может использоваться для фильтрации пользователей, которые не вошли в систему.
3.6.2, реализация фильтра
Есть две основные реализации:
- Первый заключается в использовании
@WebFilter
. - Второй заключается в использовании
FilterRegistrationBean
.
3.6.3, @Веб-фильтр
3.6.3.1 Обзор
@WebFilter используется для объявления класса в качестве фильтра, аннотация будет обрабатываться контейнером во время развертывания, и контейнер будет развертывать соответствующий класс в качестве фильтра в соответствии с конкретной конфигурацией атрибута.
Имя свойства | тип | описывать |
---|---|---|
filterName | String | Укажите имя фильтра |
urlPatterns | String | String |
value | String | То же, что и urlPatterns |
3.6.3.2 Реализация кода
Создайте MyFilter.java для реализации интерфейса фильтра.
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebFilter(urlPatterns = "/api/*",filterName = "myFilter")
@Order(1)//指定过滤器的执行顺序,值越大越靠后执行
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化过滤器");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request= (HttpServletRequest) servletRequest;
String uri=request.getRequestURI();
String method=request.getMethod();
System.out.println(uri+" "+method+"哈哈我进入了 MyFilter 过滤器了");
filterChain.doFilter(servletRequest,servletResponse);
}
}
Класс запуска помечен @ServletComponentScan.
Создайте интерфейс FilterController
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class HelloController {
@GetMapping("/user/filter")
public String hello(){
return "哈哈我通过了过滤器";
}
}
3.6.4. Реализация компонента FilterRegistrationBean
Создать конфигурацию фильтра
import com.yingxue.lesson.filter.MyFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
@Bean
public MyFilter myFilter(){
return new MyFilter();
}
@Bean
public FilterRegistrationBean getFilterRegistrationBean(MyFilter myFilter){
FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean();
/**
* 设置过滤器
*/
filterRegistrationBean.setFilter(MyFilter());
/**
* 拦截路径
*/
filterRegistrationBean.addUrlPatterns("/api/*");
/**
* 设置名称
*/
filterRegistrationBean.setName("myFilter");
/**
* 设置访问优先级 值越小越高
*/
filterRegistrationBean.setOrder(1);
return filterRegistrationBean;
}
}
Изменить MyFilter.java
//@WebFilter(urlPatterns ={"/api/*"},filterName = "myFilter")
Изменить класс запуска
//@ServletComponentScan
3.7 Перехватчик
3.7.1 Обзор
Проще говоря, это клапан, который перехватывает метод до того, как к нему будет осуществлен доступ, а затем добавляет определенные операции до или после него. Перехватчик — это стратегия реализации АОП. Его основная функция — контролировать запущенный процесс.
3.7.2 Обзор методов перехватчиков
Перехватчик также имеет три основных метода:
- preHandle вызывается перед запросом, если запрос нужно перехватить, возвращает false, иначе true.
- postHandle вызывается после запроса и не имеет возвращаемого значения.
- afterCompletion вызывается в конце запроса и не имеет возвращаемого значения.
3.7.3 Реализация кода
Создайте класс перехватчика и реализуйте интерфейс HandlerInterceptor.
public class MyInterceptor implements HandlerInterceptor {
@Value("${open.url}")
private String openUrl;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor....在请求处理之前进行调用(Controller方法调用之前)");
String requestUrl=request.getRequestURI();
System.out.println("过滤器MyFilter拦截了请求为"+requestUrl);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor...请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor....在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
}
}
Изменить application.properties
Нам нужно добавить строку кода в application.properties, чтобы добавить групповой адрес интерфейса разработки, указывающий код выпуска.
#凡是请求地址层级带有 open 都放行
open.url=/**/open/**
Создайте Java-реализацию WebMvcConfigurer и переопределите метод addInterceptors.
@Configuration
public class WebAppConfig implements WebMvcConfigurer {
@Value("${open.url}")
private String openUrl;
@Bean
public MyInterceptor getMyInterceptor(){
return new MyInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getMyInterceptor()).addPathPatterns("/api/**").excludePathPatterns(openUrl);
}
}
3.7.4 Тест
@RestController
@RequestMapping("/api")
public class InterceptorController {
@GetMapping("/home/open/info")
public String home(){
return "欢迎来到首页";
}
@GetMapping("/user/interceptor")
public String interceptor(){
return "我被拦截了并通过了拦截器";
}
}
3.8, журнал
Логи играют важную роль в тестировании и отладке нашей системы, мы часто использовали их при разработке системы.System.out.print()
Это предложение используется для вывода некоторой системной информации, но для вывода логов в реальной работе этот метод не используется, вероятно, по следующим причинам:
- По сравнению с System.out.println структура ведения журнала более гибкая и может отделять вывод журнала от кода.
- Структура журнала может легко определить среду вывода журнала, консоль, файл и базу данных.
- Структура журнала может легко определить формат вывода и уровень вывода журнала.
3.8.1, введение в журнал
3.8.1.1 Введение в журналы в SpringBoot
Мы видим, что журнал включен по умолчанию при запуске SpringBoot. Слева направо:время,уровень журнала идентификатор потока,имя темы,класс журнала,описание журнала.
Уровень журнала, чем выше уровень, тем меньше вывод.Если установлен уровень информации, уровни отладки и трассировки не могут отображаться.trace < debug < info < warn < errorSpringboot по умолчанию выбирает Logback в качестве среды ведения журнала, а также может выбирать другие среды ведения журнала, но это не обязательно.
3.8.1.2 Два способа вывода логов
Определите статический объект Logger в классе
// 这里传入当前类的作用是方便输出日志时可以清晰地看到该日志信息是属于哪个类的
private static final Logger log = LoggerFactory.getLogger(当前类.class);
используя предоставленный ломбок
@Slf4j
аннотация
@Slf4j
@Service
public class PermissionServiceImpl implements IPermissionService {}
//输出日志中有变量可以使用{}作为占位符
log.info("删除id为{}的数据", id);
log.debug("权限插入成功:{}",expression);
log.info("权限插入成功:{}",expression);
log.warn("权限插入成功:{}",expression);
}
3.8.1.3 Использование файла конфигурации Logback
Платформа Logback автоматически загрузит classpath:logback.xml по умолчанию в качестве файла конфигурации платформы. При использовании в SpringBoot имеется дополнительная поддержка автозагрузки classpath:logback-spring.xml. Поэтому рекомендуется использовать более мощный файл logback-spring.xml.
<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:开启日志框架的热部署,默认值true表示开启
scanPeriod:热部署的频率,默认值60 second
debug:设置输出框架内部的日志,默认值false
-->
<configuration scan="true" scanPeriod="60 second" debug="false">
<property name="appName" value="springboot demo" />
<contextName>${appName}</contextName>
<!-- appender:日志输出对象,配置不同的类拥有不同的功能
ch.qos.logback.core.ConsoleAppender:日志输出到控制台
-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd-HH:mm:ss} %level [%thread]-%logger{35} >> %msg %n</pattern>
</encoder>
</appender>
<!-- ch.qos.logback.core.FileAppender:日志输出到文件中
<appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
<encoder>
<pattern>%-4relative [%thread] %level %logger{35} - %msg %n</pattern>
</encoder>
<append>true</append>
<file>mylog.log</file>
</appender>
-->
<!-- root是项目通用的logger,一般情况下都是使用root配置的日志输出
level:按照级别输出日志,日志级别,级别越高,输出的内容越少
trace < debug < info < warn < error
-->
<root level="info">
<appender-ref ref="STDOUT" />
</root>
<!-- 自定义的logger,用于专门输出特定包中打印的日志
<logger name="cn.wolfcode.crm.mapper" level="trace">
</logger>
-->
</configuration>
3.9. Интегрированный интерфейс
3.9.1 Интеграция JSP
Когда дело доходит до Java, следует сказать, что сценарий разработки — это веб-разработка.Когда дело доходит до веб-разработки, технология, которой нельзя избежать, — это JSP.Хотя SpringBoot официально не рекомендует использовать JSP, это все же очень важно интегрировать JSP.
3.9.1.1.Введение зависимостей
<!--JSP标准标签库-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!--内置tocat对Jsp支持的依赖,用于编译Jsp-->
<dependencys>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
3.9.1.2 Редактировать структуру проекта
3.9.1.3, Конфигурация преобразователя представления Spring Mvc
Нам нужно изменить приложение .properties и добавить конфигурацию преобразователя представления Spring Mvc.
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
3.9.1.4. Резюме
Поэтому, когда мы столкнемся в будущем, когда старый проект будет обновлен до проекта Spring Boot, мы должны сначала настроить веб-приложение и путь, настроить веб, а затем настроить некоторые конфигурации, необходимые для ORM, и, наконец, не забыть настроить просмотр резольвера. После настройки необходимой конфигурации вы можете напрямую скопировать код в новый проект.
3.9.2 Интеграция FreeMarker
Для интеграции FreeMarker в традиционный SpringMVC требуется настроить в контейнере Spring два объекта FreeMarkerConfigurer и FreeMarkerViewResolve. При этом оба объекта должны быть настроены с некоторыми свойствами, что довольно хлопотно. В SpringBoot, полагаясь на функцию автоматической настройки, мы можем очень легко Реализация интеграции FreeMarker должна только ввести зависимость.
<!-- SpringBoot集成FreeMarker的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
3.9.2.1. Основополагающий принцип
Автоматическая конфигурация SpringBoot содержитFreeMarkerAutoConfiguration
Объект конфигурации, который импортируется повторноFreeMarkerReactiveWebConfiguration
Объект конфигурации, созданный в немFreeMarkerConfigurer
иFreeMarkerViewResolve
Два объекта передаются в управление Spring, и устанавливаются значения свойств по умолчанию, полученные изFreeMarkerProperties
объект
3.9.2.2, конфигурация общих атрибутов
# 是否开启freemarker支持
spring.freemarker.enabled=true
# 模板编码
spring.freemarker.charset=UTF-8
# 模板contenttype
spring.freemarker.content-type=text/html
# 是否开启session属性暴露,默认false
spring.freemarker.expose-session-attributes = false
# 加载模板时候的前缀
spring.freemarker.prefix: templates
# 模板文件后缀,SpringBoot2.X默认是ftlh,有时候我们的模板后缀是ftl
spring.freemarker.suffix: ftl
# 模板加载地址
spring.freemarker.template-loader-path=classpath:/templates/
#一般我们会做3个配置,其余默认
# 暴露session对象的属性
spring.freemarker.expose-session-attributes=true
# 配置为传统模式,空值自动处理
spring.freemarker.settings.classic_compatible=true
# 重新指定模板文件后缀 springboot 2.2.x 后 默认后缀为 .ftlh
spring.freemarker.suffix=.ftl
3.9.3. Интеграция Тимелеафа
Thymeleaf — это механизм шаблонов для рендеринга контента XML/XHTML/HTML5. Подобно JSP, FreeMaker и т. д., его также можно легко интегрировать с веб-фреймворками. Механизм шаблонов для веб-приложений. По сравнению с другими механизмами шаблонов, самая большая особенность Thymeleaf заключается в том, что он может напрямую открывать и отображать страницы шаблонов в браузере, не запуская все веб-приложение. thymeLeaf поддерживает Spring Expression Language как диалект, а именно SpEL, который представляет собой выражение EL, которое можно использовать в Spring. Он отличается от JSP, который мы использовали, тимелеаф использует теги HTML для завершения логики и ввода данных для рендеринга. Можно сказать, что можно полностью заменить jsp на тимелеаф.
3.9.3.1 Создание проекта
Мы не забываем проверять эти два параметра зависимости при создании проекта.
3.9.3.2, Конфигурация преобразователя представления Spring Mvc
#thymeleaf
# 前缀 默认读取classpath:/templates/
#无需配置
#spring.thymeleaf.prefix=classpath:/templates/
# 后缀
spring.thymeleaf.suffix=.html
spring.thymeleaf.charset=UTF-8
spring.thymeleaf.servlet.content-type=text/html
3.9.3.3 Тестирование
Создайте hello.html в шаблонах, добавьте xmlns:th="www.thymeleaf.org"Пространство объявлений Thymeleaf.