controller包是自己创建的
spingboot主程序
package com.example.boot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication //加上这个注解,表示这是一个SpringBoot应用 public class Boot302DemoApplication { public static void main(String[] args) { SpringApplication.run(Boot302DemoApplication.class, args); } }
com.example.boot下创建controller包-再在该包下创建一个HelloController类
@ResponseBody //获取的是文本,而不是跳转页面的
@Controller
这两个注解相当于一个@RestController
运行主类
运行结果:
在浏览器中输入localhost:8080/haha
以上一个简单的Springboot项目测试完成
SpringBoot摒弃XML配置方式,改为全注解驱动
@Configuration、@SpringBootConfiguration
@Bean、@Scope
@Controller、 @Service、@Repository、@Component
@Import
@ComponentScan
举例:
新建bean包,再包下创建User和Cat两个类
新建config包,再该包下创建AppConfig类
User和Cat类下的内容
User类
package com.example.boot.bean; public class User { private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Cat类
package com.example.boot.bean; public class Cat { private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
AppConfig类
package com.example.boot.config; import com.example.boot.bean.User; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @description * @author: Admin * @create: 2023/12/7 9:35 */ @Configuration //这是一个配置类,代替之前的配置文件 public class AppConfig { //组件在容器中的名字是方法名 @Bean //该注解替代之前的bean标签,就是在ioc.xml里的配置的标签 public User user01(){ var user=new User(); user.setId(1L); user.setName("小苏"); return user; } }
ioc.xml里的配置信息
运行主类:
再运行结果中查询user01
举例:
运行主类,再主类的结果中查询hahaha
与@Configuration注解差不多
@Import也是放在配置类中的
如果注解指定的条件成立,则触发指定行为
@ConditionalOnXxx
举例常见的
@ConditionalOnClass:如果类路径中存在这个类,则触发指定行为
@ConditionalOnMissingClass:如果类路径中不存在这个类,则触发指定行为
@ConditionalOnBean:如果容器中存在这个Bean(组件),则触发指定行为
@ConditionalOnMissingBean:如果容器中不存在这个Bean(组件),则触发指定行为
@ConfigurationProperties: 声明组件的属性和配置文件哪些前缀开始项进行绑定
@EnableConfigurationProperties:快速注册注解:
将容器中任意组件(Bean)的属性值和配置文件的配置项的值进行绑定
举例:
在配置文件(application.properties)中加入如下:
新建一个Pig类
Pig类
package com.example.boot.bean; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * @description * @author: Admin * @create: 2023/12/7 14:16 */ @ConfigurationProperties(prefix = "pig") //prefix后面的名字是application.properties里配置里自己写的 @Component public class Pig { private Long id; private String name; private Integer age; public Long getId() { return id; } public void setId(Long id) { this.id = id; } 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; } @Override public String toString() { return "Pig{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}'; } }
运行主类结果:
(乱码解决方法:File->Settings->File encofings中的编码格式都改为utf-8)
public static void main(String[] args) { //局部变量类型的自动推断 var ioc = SpringApplication.run(MainApplication.class, args); //1、获取容器中所有组件的名字 String[] names = ioc.getBeanDefinitionNames(); //2、挨个遍历: // dispatcherServlet、beanNameViewResolver、characterEncodingFilter、multipartResolver // SpringBoot把以前配置的核心组件现在都给我们自动配置好了。 for (String name : names) { System.out.println(name); } }
总结: 导入场景启动器、触发 spring-boot-autoconfigure这个包的自动配置生效、容器中就会具有相关场景的功能
思考:
1、SpringBoot怎么实现导一个starter、写一些简单配置,应用就能跑起来,我们无需关心整合
2、为什么Tomcat的端口号可以配置在application.properties中,并且Tomcat能启动成功?
3、导入场景后哪些自动配置能生效?
自动配置流程细节梳理:
1、导入starter-web:导入了web开发场景
2、主程序:@SpringBootApplication
3、xxxxAutoConfiguration自动配置类
4、写业务,全程无需关心各种整合(底层这些整合写好了,而且也生效了)
核心流程总结:
1、导入starter,就会导入autoconfigure包。
2、autoconfigure 包里面 有一个文件 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,里面指定的所有启动要加载的自动配置类
3、@EnableAutoConfiguration 会自动的把上面文件里面写的所有自动配置类都导入进来。xxxAutoConfiguration 是有条件注解进行按需加载
4、xxxAutoConfiguration给容器中导入一堆组件,组件都是从 xxxProperties中提取属性值
5、xxxProperties又是和配置文件进行了绑定
效果:导入starter、修改配置文件,就能修改底层行为。
框架的框架、底层基于Spring。能调整每一个场景的底层行为。100%项目一定会用到底层自定义
摄影:
普通开发:导入starter,Controller、Service、Mapper、偶尔修改配置文件
高级开发:自定义组件、自定义配置、自定义starter
核心:
最佳实战:
整合redis: