HelloWorld
需求:浏览器发送/hello请求,响应 Hello,Spring Boot
创建springboot项目
主程序类
@SpringBootApplication public class Boot01HelloworldApplication public static void main(String[] args) { SpringApplication.run(Boot01HelloworldApplication.class, args); } }
创建controller控制层
//@ResponseBody//发送浏览器 //@Controller//控制层 //结合体 @RestController public class HelloController { //@ResponseBody//返回浏览器字符串 @RequestMapping("/hello") public String hello(){return "hello,Spring Boot"; } }
简化配置
application.properties
#修改端口号 server.port=8888
了解自动配置原理
1.SpringBoot特点
1.1依赖管理
父项目做依赖管理
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
他的父项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
几乎声明了所有开发中常用的版本号,自动版本仲裁机制
开发导入starter场景启动器
1.见到很多spring-boot-starter-*:就某种场景 2.只要引入starter,这个场景的所有常规需要的依赖我们都自动引入 3.SpringBoot所有支持的场景
无需关注版本号,自动版本仲裁
可以修改版本号
1.查看spring-boot-dependencies里面规定当前依赖的版本 用的key 2.在当前项目里面重写配置 <properties> <mysql.version>5.1.43</mysql.version> </properties>
1.2自动配置
自动配好Tomcat
引入Tomcat依赖
配置Tomcat
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </dependency>
自动配好SpringMVC
引入SpringMVC全套组件
自动配好了SpringMVC常用组件(功能)
自动配好Web常见功能,如:字符编码问题
SpringBoot帮我们配置好了所有web开发的常见场景
默认的包结构
主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来
无需以前的包扫描配置
想要改变扫描路径,@SpringBootApplication(scanBasePackages = "com.example")//扫描指定包
或者:@ComponentScan()指定扫描路径
各种配置拥有默认值
默认配置最终都是映射到MultipartProperties
配置文件的值最终会绑定每个类上,这个类会在容器中创建对象
按需加载所有自动配置项
非常多的starter
引入了哪些场景这个场景的自动配置才会开启
SpringBoot所有的自动配置功能都在
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <version>2.0.0.RELEASE</version> <scope>compile</scope> </dependency>
....
容器功能
组件添加
@Configuration
基本使用
Full模式与Lite模式
最佳实战
配置 类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式
/** * 1.配置类里面使用Bean标注在方法上给容器注册组件,默认是单实例的 * 2.配置类本身也是组件 * 3. */ //@Configuration(proxyBeanMethods = true)//注入组件 @Configuration public class MyConfig { /** * 外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象 * @return */ @Bean//给容器中添加组件,以方法名作为id,返回类型就是组件类型,返回的值,就是组件在容器中保存的实例 public User user01(){ User zhangsan = new User("张三", 15); //user组件依赖per组件 zhangsan.setPet(per01()); return zhangsan; } @Bean("tom")//自定义组件名称 public Pet per01(){ return new Pet("二哈"); } }
主程序 :
/** * 主程序类 * @SpringBootApplicatio:这是一个springboo应用 */ //@SpringBootApplication(scanBasePackages = "com.example")//扫描指定包 @SpringBootApplication public class Boot01HelloworldApplication { public static void main(String[] args) { ConfigurableApplicationContext run = SpringApplication.run(Boot01HelloworldApplication.class, args); //查看容器组件 String[] names = run.getBeanDefinitionNames();//获取组件 for (String name : names) {//遍历输出 System.out.println("组件:"+name); } //从容器中获取组件 User user01 = run.getBean("user01", User.class); User user02 = run.getBean("user01", User.class); System.out.println("组件:"+(user01 == user02)); //获取配置类 MyConfig bean = run.getBean(MyConfig.class); // System.out.println(bean); //从配置类中获取组件 User user = bean.user01(); System.out.println(user); // User user011 = run.getBean("user01", User.class); Pet tom = run.getBean("tom", Pet.class); System.out.println("用户宠物:"+(user011.getPet() == tom)); } }
@Bean:注入容器
@Component:组件
@Controller:控制层(控制器 )
@Service:业务层 (业务逻辑组件)
@Repository:dao层(数据库层组件)
@Conditional
条件装配:满足Conditional指定的条件 ,则进行组件注入
/** * 1.配置类里面使用Bean标注在方法上给容器注册组件,默认是单实例的 * 2.配置类本身也是组件 * * 4.@Import({User.class, DBHelper.class})//导入组件 * 给容器中自动创建出这两个类型的组件,默认组件的名字就是全类名 * */ //@Configuration(proxyBeanMethods = true)//注入组件 @Import({User.class, DBHelper.class})//导入组件 @Configuration //条件装配 //@ConditionalOnBean(name = "tom") //有:全部注入 @ConditionalOnMissingBean(name = "tom")//没有:全部注入 public class MyConfig { /** * 外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象 * @return */ @Bean//给容器中添加组件,以方法名作为id,返回类型就是组件类型,返回的值,就是组件在容器中保存的实例 public User user01(){ User zhangsan = new User("张三", 15); //user组件依赖per组件 zhangsan.setPet(per01()); return zhangsan; } //@Bean("tom")//自定义组件名称 public Pet per01(){ return new Pet("二哈"); } }
主程序:
//判断是否有此组件 boolean tom1 = run.containsBean("tom"); System.out.println("容器中是否有此组件:"+tom1);
@ImportResource
需求:注入Spring的配置文件
@ImportResource("classpath:beans.xml") public class MyConfig {
主程序:
boolean bean = run.containsBean("user"); System.out.println("user:"+bean);
配置绑定
如何使用Java读取到properties文件中的内容,并且把它封装到JavaBean中,以随时使用:(开启此注解无需在sql层中开启此注解@Component)
@EnableConfigurationProperties(Car.class)//开启属性配置功能(要绑定的对象) 1.开启对象配置绑定功能 2.把这个对象这个组件自动注册到容器中 public class MyConfig {
自动配置原理入门
引入加载自动配置类
1.@SpringBootConfiguration
@Configuration:代表当前就是一个配置类
2.@ComponentScan
指定扫描哪些:Spring注解;
3.@EnableAutoConfiguration:启用自动配置
@AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class}) public @interface EnableAutoConfiguration {
1.@AutoConfigurationPackage
自动配置包
@AutoConfigurationPackage
@Import({AutoConfigurationPackages.Registrar.class})//给容器中导入一个组件 public @interface AutoConfigurationPackage {
//利用Registrar给容器中导入一系列组件
//将指定的一个包下的所有组件导入进来 主程序所在包下
2.@Import({AutoConfigurationImportSelector.class})
利用方法给容器中导入组件
@Import({User.class, DBHelper.class})//导入组件 public class MyConfig {
最佳实践SpringBoot应用如何编写
引入场景依赖
官方文档
查看自动配置了哪些(选做)
自己分析,引入场景对应的自动配置一般都生效了
配置文件中debug=true可以开启配置报告
true:开启
false:不开启
是否需要修改
参照文档修改配置项
分析,xxx类绑定了配置文件哪些
自定义加入或者替换组件
@Bean,@Component
最佳实践-Lombok简化开发
Lombok用标签方式代替构造器,get/setter,toString()等鸡肋代码
springboot已经管理Lombok。引入依赖
<!-- 简化代码开发(set get toString) --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
如何安装:IDEA中File--Plugins,搜索安装Lombok插件
使用:
@Data @ToString @NoArgsConstructor//无参 //@AllArgsConstructor//有参 @EqualsAndHashCode//eq和hash方法 public class User {
简化日志开发
@Slf4j//日志 //@ResponseBody//发送浏览器 //@Controller//控制层 //结合体 @RestController public class HelloController { //@ResponseBody//返回浏览器字符串 @RequestMapping(value = "/hello") public String hello(@RequestParam("name") String name){ log.info("请求进来了...."); return "hello,Spring Boot"+ "你好" + name; } }
最佳实践-dev-tools
Spring Boot包括一组额外的工具,可以让应用程序开发体验更加愉快。spring-boot devtools模块可以包含在任何项目中,以提供额外的开发时功能--链接
每当类路径上的文件发生更改时,使用spring-boot-devtools的应用程序就会自动重新启动。当在IDE中工作时,这可能是一个有用的功能,因为它为代码更改提供了非常快速的反馈循环。默认情况下,类路径上指向某个目录的任何条目都会受到更改监控。请注意,某些资源(如静态资产和视图模板)不需要重新启动应用程序--链接
触发重新启动
由于DevTools监视类路径资源,触发重新启动的唯一方法是更新类路径。导致类路径更新的方式取决于您正在使用的IDE:
在Eclipse中,保存修改后的文件会导致类路径更新并触发重新启动。
在IntelliJ IDEA中,构建项目(构建->构建项目)(快捷方式:Ctrl+F9)具有相同的效果
依赖:
<!-- 热部署启动 Ctrl + F9 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
在IDEA中,项目或者页面修改以后:Ctrl+F9。
配置文件-yaml的用法
同以前的properties用法
YAML是“YAML Ain’t Markup Language”(YAML 不是一种标记语言)的递归缩写,在开发这种语言时,YAML的意思其实是“Yet Another Markup Language”(仍是一种标记语言)
非常适合用来做以数据中心的配置文件
基本语法
key:value:kv之间有空格
大小写敏感
使用缩进表示层级关系
缩进不允许使用tab,只允许空格
缩进的空格数不重要,只要相同层级的元素左对齐即可
'#'表示注释
字符串无需加引号,如果要加,单引号,双引号" "表示字符串内容会被转义,不转义
数据类型
字面量:单个的,不可再分的值,date、boolean、string、number、null
k : v
对象:键值对的集合,map,hash,set,object
#行内写法: k: {k1:v1,k2:v2,k3:v3} #或 k: k1: v1 k2: v2 k3: v3
数组:一组按次序排序的值,array,list,queue
#行内写法: k: [v1,v2,v3] #或者 k: - v1 - v2 - v3
实例:
@Data public class Person { private String userName; private Boolean boss; private Date birth; private Integer age; private Pet pet; private String[] interests; private List<String> animal; private Map<String, Object> score; private Set<Double> salarys; private Map<String, List<Pet>> allPets; } @Data public class Pet { private String name; private Double weight; }
用yaml表示以上对象
person: userName: zhangsan boss: false birth: 2019/12/12 20:12:33 age: 18 pet: name: tomcat weight: 23.4 interests: [篮球,游泳] animal: - jerry - mario score: english: first: 30 second: 40 third: 50 math: [131,140,148] chinese: {first: 128,second: 136} salarys: [3999,4999.98,5999.99] allPets: sick: - {name: tom} - {name: jerry,weight: 47} health: [{name: mario,weight: 47}]
SpringMVC自动配置概览
Spring Boot为Spring MVC提供了自动配置,可以很好地与大多数应用程序配合使用。(大多场景我们都无需自定义配置)
自动配置在Spring的默认设置之上添加了以下功能:
包含ContentNegotiatingViewResolver和BeanNameViewResolver bean。
内容协商视图解析器和BeanName视图解析器
Support for serving static resources, including support for WebJars (covered later in this document)).
静态资源(包括webjars)
Automatic registration of Converter, GenericConverter, and Formatter beans.
自动注册 Converter,GenericConverter,Formatter
Support for HttpMessageConverters (covered later in this document).
支持 HttpMessageConverters (后来我们配合内容协商理解原理)
Automatic registration of MessageCodesResolver (covered later in this document).
自动注册 MessageCodesResolver (国际化用)
Static index.html support.
静态index.html 页支持
Custom Favicon support (covered later in this document).
自定义 Favicon
Automatic use of a ConfigurableWebBindingInitializer bean (covered later in this document).
自动使用 ConfigurableWebBindingInitializer ,(DataBinder负责将请求数据绑定到JavaBean上)
标签:SpringBoot,配置,class,自动,User,组件,public,入门 From: https://www.cnblogs.com/qihaokuan/p/17457729.html