содержание
0 Документ по началу работы
https://www.yuque.com/atguigu/springboot/qb7hy2
1 Управление зависимостями
Обычно используемые зависимости и их номера версий объявлены в SpringBoot. Вы можете объявить необходимые зависимости непосредственно в pom.xml, без номера версии:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
Зависимость импорта выглядит следующим образом:
если вам нужно изменить версию, проверьте формат объявления номера версии в родительской зависимости и измените
его в pom.xml, чтобы изменить его в соответствии с его форматом:
<properties>
<mysql.version>5.1.43</mysql.version>
</properties>
Зависимости импорта следующие:
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, запустив тест, результат тот же: