当前位置: 代码迷 >> 综合 >> [乐优商城学习记录]DAY01 学习springboot
  详细解决方案

[乐优商城学习记录]DAY01 学习springboot

热度:71   发布时间:2023-09-27 02:10:32.0

1 依赖部分

一般pom文件都有这个parent

 <!-- 所有的springboot的工程都以spring父工程为父工程 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.6.RELEASE</version></parent>

这个是springboot的最基本的依赖,包含如下信息:

  1. 对各种常用依赖(并非全部)的版本进行了管理
  2. 引入了很多基本的包了,不需要我们手动去引入

2 @EnableAutoConfiguration注解

可以配合

public static void main(String[] args) {SpringApplication.run(HelloController.class, args);}

就可以启动一个既像jar又像war的springboot项目
非常类似在linux里面运行 java -jar xxxxxx.jar

3 当你继续引入依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>

这时候,SpringBoot根据spring-boot-starter-web这个依赖自动引入对应的jar包,往spring容器里面添加很多bean和配置

4 @ComponentScan注解

当把psvm里面的SpringApplication.run(HelloController.class, args)
与@RestController分开的时候
项目就不行了
原因是:缺少了注解扫描@ComponentScan

配置组件扫描的指令。提供了类似与`<context:component-scan>`标签的作用
通过basePackageClasses或者basePackages属性来指定要扫描的包。
如果没有指定这些属性,那么将从声明这个注解的类所在的包开始,扫描包及子包

在项目使用的时候:一般启动类会放在一个比较浅的包目录中

5@SpringBootApplication注解

  • @SpringBootConfiguration 配置类,一般唯一的以示区分
  • @EnableAutoConfiguration:开启自动配置
  • @ComponentScan:开启注解扫描

6 java形式的配置类

6.1简单的配置属性用@Value

@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfiguration {@Value("${jdbc.url}")String url;@Beanpublic DataSource dataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl(url);.........return dataSource;}
}

简单类型的数据比如String,Int,Double,Boolean可以用@Value注解

6.2 复杂,万能的配置属性用@ConfigurationProperties

@ConfigurationProperties(prefix = "jdbc")
public class JdbcProperties {private String url;private String driverClassName;// getters 和 setters
}

默认会读取文件名为application.properties
使用3,参数注入

@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfiguration {@Beanpublic DataSource dataSource(JdbcProperties jdbcProperties) {// ...}
}

优点:
Relaxed binding:松散绑定
不严格要求属性文件中的属性名与成员变量名一致。支持驼峰,中划线,下划线等等转换,甚至支持对象引导。比如:user.friend.name,可以把配置文件映射成对象

7spring自动装配的底层原理

比较复杂,说不清楚
第一步,启动类

SpringApplication.run(LeyouItemServiceApplication.class, args)

第二步构造函数

public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources){getSpringFactoriesInstances(ApplicationContextInitializer.class)setInitializers(上面的返回值)
}

第三步 417行

private <T> Collection<T> getSpringFactoriesInstances(Class<T> type,Class<?>[] parameterTypes, Object... args) {Set<String> names = new LinkedHashSet<>(SpringFactoriesLoader.loadFactoryNames(type, classLoader));}

第四步
FACTORIES_RESOURCE_LOCATION的值是META-INF/spring.factories

private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {Enumeration<URL> urls = (classLoader != null ?classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
}

第五步
springboot会从依赖包里面找到这个文件
就扫描到这个文件里面的XXXXXXAutoConfiguration配置类文件
第六步 配置文件读取到spring里面,具体有很多细节,

@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass
@ConditionalOnMissingBean
@EnableConfigurationProperties

第七步总结
1引入starter
2修改application.yml
3有时候还可以自动写@Configuration和@Bean

8 配置拦截器

自定义一些MVC配置(包括:拦截器,格式化器, 视图控制器、消息转换器 等等),你应该让一个类实现WebMvcConfigurer,并且添加@Configuration注解

@Component
public class MyInterceptor implements HandlerInterceptor {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(myInterceptor).addPathPatterns("/**");}
}

9 一些需要查看的工具手册

SpringBoot启动器.txt
SpringBoot全局属性.md