依赖管理
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.7.12version>
parent>`
spring-boot-starter-parent的父项目:
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>2.7.12version>
parent>
在spring-boot-dependencies中几乎声明了所有开发中常用的依赖配置的版本号
例如对于数据库链接的依赖,spring-boot-dependencies中有以下配置
<mysql.version>8.0.33mysql.version> ...... <dependency> <groupId>com.mysqlgroupId> <artifactId>mysql-connector-jartifactId> <version>${mysql.version}version> <exclusions> <exclusion> <groupId>com.google.protobufgroupId> <artifactId>protobuf-javaartifactId> exclusion> exclusions> dependency>
只需要在maven项目的核心配置文件pom.xml中,重写需要的依赖版本,此时maven就会根据就近原则加载相应的依赖
例如对于链接mysql的依赖,只需在pom.xml中添加以下配置
<properties> <mysql.version>想要的版本号mysql.version> properties>
就某个开发场景而言只要我们引入相应的启动器,这个场景所需要的常规依赖都会帮我们自动引入
以web为例:
<dependencies> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency> dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
<version>2.7.12version>
<scope>compilescope>
dependency>
自动配置Tomcat
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-tomcatartifactId>
<version>2.7.12version>
<scope>compilescope>
dependency>
自动配置SpringMVC
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webartifactId>
<version>5.3.27version>
<scope>compilescope>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>5.3.27version>
<scope>compilescope>
dependency>
…
在主程序类中有以下固定写法
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
其中SpringApplication.run返回一个ConfigurableApplicationContext对象也就是IOC容器
我们可以通过以下方法查看IOC容器中已装配的组件
@SpringBootApplication public class MainApplication { public static void main(String[] args) { // 返回IOC容器 ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args); //获取已装配的组件名称 String[] beanDefinitionNames = run.getBeanDefinitionNames(); //输出 for(String name : beanDefinitionNames){ System.out.println(name); } } }
输出后可以看到包括视图解析器,文件上传,字符编码等,所有web开发所需要的基本组件
为什么只需要设置@Controller组件,springboot就可以帮我们扫描到我们自定义的组件
这是因为springboot所设定的默认规则 – 约定大于配置
只要我们的程序符合以下目录结构,那他就会帮我们自动扫描
com +- example +- myapplication +- MyApplication.java | +- customer | +- Customer.java | +- CustomerController.java | +- CustomerService.java | +- CustomerRepository.java | +- order +- Order.java +- OrderController.java +- OrderService.java +- OrderRepository.java
如果想要扫描别的位置那可以在@SpringBootApplication注解中设置属性scanBasePackages,例如:
@SpringBootApplication(scanBasePackages = "com.test")//扫描com.test下的所有组件
public class MainApplication {
public static void main(String[] args) {
// 返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//获取已装配的组件名称
String[] beanDefinitionNames = run.getBeanDefinitionNames();
//输出
for(String name : beanDefinitionNames){
System.out.println(name);
}
}
}
或者设置注解@ComponentScan(“包路径”),@SpringBootApplication就是包含这个注解的所以这两个注解不能同时使用
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-autoconfigureartifactId>
<version>2.7.12version>
<scope>compilescope>
dependency>
package com.ywj.boot.config;
import org.springframework.context.annotation.Configuration;
/**
* Author : YWJ
* Date : 2023/5/26
* Name : SpringBootDemo
*/
@Configuration // 告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {
}
package com.ywj.boot.config;
import com.ywj.boot.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Author : YWJ
* Date : 2023/5/26
* Name : SpringBootDemo
*/
@Configuration // 告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {
@Bean
// 也可使用@Bean("id")设置组件id
public User user01(){
return new User("张三",18);
}
}
@Import(User.class) // 导入一个User组件
@Configuration(proxyBeanMethods = true) // 告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {
@Bean
public User user01(){
return new User("张三",18);
}
}
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
// 返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//获取已装配的组件名称
String[] beanDefinitionNames = run.getBeanDefinitionNames();
//输出
for(String name : beanDefinitionNames){
System.out.println(name);
}
// 获取自定义的组件
User user01 = run.getBean("user01", User.class);
System.out.println(user01);
}
}
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
// 返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
// 获取配置类组件
MyConfig bean = run.getBean(MyConfig.class);
//通过配置类调用组件方法
User user = bean.user01();
User user1 = bean.user01();
System.out.println(user==user1); // ture
}
}
上述方法也是可以返回我们所配置的组件的,并且不管调用多少次他都是单例的,
这是因为在springboot2.0以后的版本中 注解@Configuration 中有一个属性proxyBeanMethods 默认为 true
proxyBeanMethods :是不是代理Bean的方法
如果@Configuration(proxyBeanMethods = true);此时就会使用代理对象调用配置类中的方法,
此时SpringBoot总会检查这个组件是否在容器中存在实例,如果存在则直接复用,因此它总是单例的
如果改成false则不通过代理对象调用,同时也不会是单例。
@Configuration(proxyBeanMethods = true) // 告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {
@ConditionalOnBean(name="李四")
@Bean
public User user01(){
return new User("张三",18);
}
}
@Import(User.class)
@Configuration
@ImportResource("classpath:beans.xml")
public class MyConfig {
@ConditionalOnBean(name="李四")
@Bean
public User user01(){
return new User("张三",18);
}
}
方法一
在组件类中添加以下注解
@Component
@ConfigurationProperties(prefix = “test”) 其中prefix是组件属性在配置文件中的前缀,例如test.name 中的test
通过在配置文件中设置相关Bean属性,然后将这些属性绑定到一个组件上
test.name=张三
test.age=789
package com.ywj.boot.pojo;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* Author : YWJ
* Date : 2023/5/26
* Name : SpringBootDemo
*/
@Component
@ConfigurationProperties(prefix = "test")
public class User {
private String name ;
private Integer age ;
public User() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
`
@RestController
public class HelloController {
@Autowired
User user ;
@RequestMapping("/user")
public User getUser(){
System.out.println(user);
return user;
}
}
方法二
在配置类中添加以下注解
@EnableConfigurationProperties(User.class) // 开启User的属性配置功能 // 将这个组件自动注册到容器中
同时在组件上添加以下注解
@ConfigurationProperties(prefix = “test”)
此时不在需要配置@Component注解
@SpringBootApplication是以下注解的一个组合注解
@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} )
@SpringBootConfiguration注解源码
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration @Indexed public @interface SpringBootConfiguration { @AliasFor( annotation = Configuration.class ) boolean proxyBeanMethods() default true; }
@EnableAutoConfiguration源码
@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({Registrar.class})
public @interface AutoConfigurationPackage {
String[] basePackages() default {};
Class<?>[] basePackageClasses() default {};
}
通过@Import导入组件registrar
而组件register会将该注解所标注类所在包下的所有组件导入容器
@Import({AutoConfigurationImportSelector.class})
debug=true
简化JavaBean开发
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sgAxZImw-1685180916916)(C:\Users\YWJ\AppData\Roaming\Typora\typora-user-images\image-20230527171704252.png)]
package com.ywj.boot.pojo;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* Author : YWJ
* Date : 2023/5/26
* Name : SpringBootDemo
*/
@Data
@ConfigurationProperties(prefix = "test")
public class User {
private String name ;
private Integer age ;
}
添加以下方法会在编译阶段创建相应的方法
@ToString : 生成toString
@AllArgsConstructor :生成所有参数的有参构造器
@NoArgsConstructor:生成无参构造
@EaualsAndHashCode :重写equals和hashcode
@Slf4j :记录日志,会自动注入一个Log对象,通过Log.info(“日志信息”)
热更新
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<optional>trueoptional>
dependency>
dependencies>
CTRL+F9
该方法对java代码来说是利用重新启动的
对静态页面来说是局部修改