赞
踩
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里的配置信息
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
- <bean id="user" class="com.example.boot.bean.User">
- <property name="id" value="1"></property>
- <property name="name" value="zhangsan"></property>
- </bean>
- <bean id="cat" class="com.example.boot.bean.Cat">
- <property name="id" value="1"></property>
- <property name="name" value="Tom"></property>
- </bean>
-
- </beans>
运行主类:
再运行结果中查询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);
- }
-
- }
@SpringBootApplication
标注的类就是主程序类@ComponentScan("com.atguigu")
直接指定扫描的路径ServerProperties
绑定了所有Tomcat服务器有关的配置MultipartProperties
绑定了所有文件上传相关的配置spring-boot-starter-web
spring-boot-starter
,是所有starter
的starter
,基础核心starterspring-boot-starter
导入了一个包 spring-boot-autoconfigure
。包里面都是各种场景的AutoConfiguration
自动配置类spring-boot-autoconfigure
这个包,但是不是全都开启的。
总结: 导入场景启动器、触发 spring-boot-autoconfigure
这个包的自动配置生效、容器中就会具有相关场景的功能
思考:
1、SpringBoot怎么实现导一个starter
、写一些简单配置,应用就能跑起来,我们无需关心整合
2、为什么Tomcat的端口号可以配置在application.properties
中,并且Tomcat
能启动成功?
3、导入场景后哪些自动配置能生效?
自动配置流程细节梳理:
1、导入starter-web
:导入了web开发场景
starter-json
、starter-tomcat
、springmvc
spring-boot-starter
,核心场景启动器。spring-boot-autoconfigure
包。spring-boot-autoconfigure
里面囊括了所有场景的所有配置。spring-boot-autoconfigure
下写好的所有配置类。(这些配置类给我们做了整合操作),默认只扫描主程序所在的包。2、主程序:@SpringBootApplication
@SpringBootApplication
由三个注解组成@SpringBootConfiguration
、@EnableAutoConfiguratio
、@ComponentScan
spring-boot-autoconfigure
包中官方写好的配置类@EnableAutoConfiguration
:SpringBoot 开启自动配置的核心。
@Import(AutoConfigurationImportSelector.class)
提供功能:批量给容器中导入组件。spring-boot-autoconfigure
下 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件指定的autoconfigure
包下的142 xxxxAutoConfiguration
类导入进来(自动配置类)142
个自动配置类142
个自动配置类都能生效@ConditionalOnxxx
,只有条件成立,才能生效3、xxxxAutoConfiguration
自动配置类
@EnableConfigurationProperties(ServerProperties.class)
,用来把配置文件中配的指定前缀的属性值封装到 xxxProperties
属性类中server
开头的。配置都封装到了属性类中。xxxProperties
。xxxProperties
都是和配置文件绑定。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:
spring-boot-starter-data-redis
@EnableConfigurationProperties(RedisProperties.class)
RedisAutoConfiguration
给容器中放了 StringRedisTemplate
StringRedisTemplate
StringRedisTemplate
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。