[SpringBoot] Примечания к исследованию SpringBoot 2: Управление зависимостями и автоматическая настройка

0 Документ по началу работы

https://www.yuque.com/atguigu/springboot/qb7hy2

1 Управление зависимостями

Обычно используемые зависимости и их номера версий объявлены в SpringBoot. Вы можете объявить необходимые зависимости непосредственно в pom.xml, без номера версии:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

Зависимость импорта выглядит следующим образом:
MySQL
если вам нужно изменить версию, проверьте формат объявления номера версии в родительской зависимости и измените
Объявление версии родительской зависимости
его в pom.xml, чтобы изменить его в соответствии с его форматом:

<properties>
    <mysql.version>5.1.43</mysql.version>
</properties>

Зависимости импорта следующие:
MySQL

2 Автоматическая конфигурация

2.1 Компоненты контейнера IOC

package App;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class MainApp {
    
    
	public static void main(String[] args) {
    
    
		// 1. 返回IOC容器
		ConfigurableApplicationContext run = SpringApplication.run(MainApp.class, args);

		// 2. 查看容器里的组件
		String[] beanDefinitionNames = run.getBeanDefinitionNames();
		for (String name : beanDefinitionNames) {
    
    
			System.out.println(name);
		}
	}
}

SpringBoot предоставит часто используемые компоненты

org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
......(省略)
multipartResolver
spring.servlet.multipart-org.springframework.boot.autoconfigure.web.servlet.MultipartProperties
org.springframework.aop.config.internalAutoProxyCreator

2.2 Сканирование пакетов

SpringBoot автоматически просканирует пакет, в котором расположена основная программа, и все подпакеты, находящиеся под ней.Как
изменить путь сканирования:

@SpringBootApplication(scanBasePackages = "App.Controller")

3 Функция контейнера

3.1 @ Конфигурация

Структура каталога:
Структура каталогов
класс конфигурации MyConfig:

  • @Configuration (proxyBeanMethods = false): proxyBeanMethods по умолчанию - true
  • @Bean ("user02"): имя пользовательского компонента
package App.config;

import App.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//@Configuration  // 配置类 full模式,获取单实例对象
@Configuration(proxyBeanMethods = false)  // 配置类 lite轻量级模式,每次调用会产生一个新的对象,跳过判断,SpringBoot启动快
public class MyConfig {
    
    

	@Bean // 给容器中添加组件,以方法名作为组件的ID
	public User user01(){
    
    
		//返回类型就是组件的类型,返回的值就是组件在容器中的实例
		return new User("zhangsan",18);
	}

	@Bean("user02") // 自定义组件名称
	public User user007(){
    
    
		return new User("zhangsan",18);
	}

}

Тестовый класс MainApp:

  • @SpringBootApplication (scanBasePackages = "App"): здесь для сканирования всего пакета.
package App;

import App.bean.User;
import App.config.MyConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

//@SpringBootApplication(scanBasePackages = "App.Controller")
@SpringBootApplication(scanBasePackages = "App")
public class MainApp {
    
    
	public static void main(String[] args) {
    
    
		// 1. 返回IOC容器
		ConfigurableApplicationContext run = SpringApplication.run(MainApp.class, args);

		// 2. 查看容器里的组件
		String[] beanDefinitionNames = run.getBeanDefinitionNames();
//		for (String name : beanDefinitionNames) {
    
    
//			System.out.println(name);
//		}
		for (String name : beanDefinitionNames) {
    
    
			if(name.startsWith("u")){
    
    
				System.out.println(name);
			}
		}

		// 3.从容器中获取组件,注册的组件默认是单实例的
		User u1 = run.getBean("user01", User.class);
		User u2 = run.getBean("user01", User.class);
		System.out.println("是否为单实例: "+(u1==u2));

		MyConfig myConfig = run.getBean(MyConfig.class); // 配置类本身也是组件
		System.out.println(myConfig);

		System.out.println(myConfig.user01()); // 调用配置类的方法获取的都是之前注册的单实例(proxyBeanMethods = true)

	}
}

Результат выглядит следующим образом:

  • user01: компонент по умолчанию
  • user02: bean-компонент с произвольным именем
  • Полученные два объекта идентичны, что указывает на один экземпляр
  • Получить объект класса конфигурации (класс конфигурации также является компонентом)
  • Вызвать метод класса конфигурации

Выход

3.2 @ Импорт

@Import({
    
    User.class, Pet.class}) // 给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名

4 Настроить привязку

4.1 @ Компонент + @ Свойства конфигурации

Добавьте следующую конфигурацию в конфигурационный файл application.properties:

mypet.name=hellomicki
mypet.age=3

Новый класс сущности Pet

  • @Component: компонент в контейнере
  • @ConfigurationProperties: соответствующий файл конфигурации
package App.bean;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "mypet")
public class Pet {
    
    

	private String name;
	private int age;

	public String getName() {
    
    
		return name;
	}

	public void setName(String name) {
    
    
		this.name = name;
	}

	public int getAge() {
    
    
		return age;
	}

	public void setAge(int age) {
    
    
		this.age = age;
	}

	@Override
	public String toString() {
    
    
		return "Pet{" +
				"name='" + name + '\'' +
				", age=" + age +
				'}';
	}
}

Автоматическая инъекция и переход добавлены в класс контроллера HelloController:

	@Autowired
	Pet pet;

	@RequestMapping("/pet")
	public Pet pet(){
    
    
		return pet;
	}

Запустите тест:
Выполнить тест

4.2 @ EnableConfigurationProperties + @ConfigurationProperties

В классе сущности используется только @ConfigurationProperties:

//@Component
@ConfigurationProperties(prefix = "mypet")
public class Pet {
    
    
	...
}

Добавьте комментарий к классу конфигурации MyConfig:

@EnableConfigurationProperties(Pet.class)

Класс Controller такой же, как и в 4.1, запустив тест, результат тот же:
Выполнить тест

рекомендация

отblog.csdn.net/Tiezhu_Wang/article/details/113837164