创建项目,配置你的pom文件(这部分有经验的可跳过)
springBoot这样创建可以自动导入pom依赖,非常省事(要选择Spring Initializr)
勾选自己需要用到的(如spring Web, Lombok)
pom文件
starter为一组依赖,导入starter相当于导入了相关场景的所有依赖,功能非常强大
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
这里推荐一个依赖,在开发网络项目当中非常方便,
devtools,每次程序运行中更改代码只要Ctrl+F9就可以在运行时更改,不用重新运行(或者构建 构建项目)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
常用注解(先解释用法,后面一行代码看懂)
1:@SpringBootApplication//声明这是一个springBoot应用,要在有main方法的类头注解
2:@RestController//等于@ResponseBody(作用是告诉Spring Boot,这个方法的返回值应该直接写入HTTP响应的body中)和@Controller(声明这是一个Controller类)两个注解,@RestController要在contraller类头注解
3:@Configuration(proxyBeanMethods = true)//告诉SpringBoot这是一个配置类。这个(proxyBeanMethods = true)后面会讲。
4:@Import//给容器自动创建这些类型的组件(默认组件名为全类名),可以是自己创建的
5@Component//将组件加到容器当中,通常在自己创建的实体类上注解
6@EnableConfigurationProperties()//在括号中写入XX.class 相当于在实体类XX上加了@Component(自动注册到容器),但是有点区别:(用该注解时)无法用main通过run.getBean("xx",XX.class)找到XX组件.通常在配置类当中注解。
7@Conditional//这类注解:在特定条件下才会执行eg:@ConditionalOnMissingBean(找不到组件)@ConditionalOnJava(判断当前的 Java 版本是否满足特定的条件)
8@Bean()//添加("")可以使组件名由方法或类变为特点名,在MainApplication的打印语句当中有user01和tom两个组件
9@Autowired//自动注入
10:@RequestMapping()//处理 HTTP 请求的一个核心注解。它用于映射 web 请求(如 URL 路径、HTTP 方法、请求参数等)到特定的处理器方法(即控制器中的方法),在controller类文件当中使用
11:@Slf4j//注解:可以通过日志而非控制台,打印日志
下面一行代码学会使用
先创建如下文件结构(MainApplication一般为创建好的Main类,只要在同级目录下创建bean,config,controller包即可,java文件创建出不用写)
在Car类:
@Component
@ConfigurationProperties(prefix = "mycar")
@Data//导入lombok才能用
@ToString//导入lombok才能用
public class Car {
private Integer price;
private String brand;
}
@Component在Spring 容器会在启动时自动扫描并识别这个类,然后将其创建为一个 bean 实例,并添加到 Spring 的应用上下文中,这样其他的 bean 就可以通过依赖注入来引用它。
在application.properties文件当中写入
mycar.brand=BYD mycar.price=1000
通过@ConfigurationProperties(prefix = "mycar")就可以给car注入属性,诞生一个组件mycar
在controller类当中:
@RestController
public class HelloController {
@Autowired
Car mycar;
@RequestMapping("/car")
public Car mycar(){
return mycar;
}
然后在main类头添加@SpringBootApplication注解
这时运行程序,打开浏览器输入http://localhost:8080/car
浏览器就会显示
那么你就成功了第一步(使用springBoot打开网页,显示自己创建的组件)。
在HelloController类中再写
@Slf4j//注解:可以通过日志
@RestController
public class HelloController {
@RequestMapping("/hello")
public String handle01(@RequestParam("name") String name){//未在Main配置@ComponentScan不能放在比主文件(这里MainApplication)目录级别高的地方,可以放在主文件同级子文件下
//有(@RequestParam("name") String name)就必须向url当中传递参数 http://localhost:8888/hello?name=ws
log.info("进来了。。。");//通过@Slf4j注解
return "hello, Spring boot2你好啊"+name;
}
@Autowired
Car mycar;
@RequestMapping("/car")
public Car mycar(){
return mycar;
}
这时使用
localhost:8080/hello?name=666访问浏览器,会出现
每次刷新网站日志都会更新
那么你就成功了第二步(使用日志,以及访问特点路径资源)
组件
在Spring Boot中,组件通常指的是构成应用程序的各个部分,这些部分协同工作以实现特定的功能。这些组件可以是配置类、控制器、服务、仓库、实体类等,也可以是自己创建后注入的类。
Pet类:
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Pet {
private String Name;
}
User类:(当中有个Pet类对象)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private int age;
private Pet pet;
}
Myconfig类:
@Configuration(proxyBeanMethods = true) //告诉SpringBoot这是一个配置类.proxyBeanMethods = true 在MainApplication当中有解释
@Import({User.class, DBHelper.class})//给容器自动创建这些类型的组件(默认组件名为全类名),可以是自己创建的
@EnableConfigurationProperties(Car.class)//注解作用:相当于在实体类上加了@Component(自动注册到容器),但是有区别:(用该注解时)我在main方法下不能通过Car.class找到car组件
//1开启属性配置,2将car这个组件自动注册到容器当中。这时在(这里为Car,class)实体类当中无需添加@Component注入到容器
//@ImportResource("classpath:beans.xml")//可以导入之前的配置文件之类的,我运行有问题
public class Myconfig {
@Autowired
Pet pet;
@ConditionalOnMissingBean(name = "tom")//该注解:当组件当中有tom时下面这一堆才会生效
//@Conditional()这类注解:在特定条件下才会执行eg:@ConditionalOnMissingBean @ConditionalOnJava
@Bean//给容器添加组件,以方法名作为组件的id,返回类型为组件类型,返回的值为组件在容器中的实例
public User user01(){
User user = new User("ws", 20,pet);
user.setPet(MyPet());
return user;
}
@Bean("tom")//添加("tom")可以使组件名(MyPet)变为tom,在MainApplication的打印语句当中有user01和tom两个组件
public Pet MyPet(){
return new Pet("tomcat");
}
}
MainApplication类:
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
//1,返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//2.查看容器里面的组件
String[] names =run.getBeanDefinitionNames();
for (String name : names){
System.out.println(name);
}
//3,从容器当中获取组件
Pet tom01 = run.getBean("tom",Pet.class);
Pet tom02 = run.getBean("tom",Pet.class);
// tom01 和tom02 为一个组件
Myconfig bean =run.getBean(Myconfig.class);//可以打印出,配置类本身也是组件
// 如果在@Configuration(proxyBeanMethods = true),user和user2相等,保持组件单实例
// 若为false,就不相等,每次调用都会产生一个新对象。组件依赖问题
User user =bean.user01();
User user2 =bean.user01();
// 组件依赖
// user和user2当中获取的pet在proxyBeanMethods = true时相同,为false时不同
// 这是springBoot2最大的更新
// proxyBeanMethods为true是springBoot每次都会检查组件是否存在,但效率慢。false不会检查,但每次创建新的会影响组件之间的依赖
// Boolean ws = run.containsBean("ws");//检查是否有beans.xml文件当中的组件
boolean mycar = run.containsBean("car");//在yml当中注入属性,在car实体类当中将组件注入容器
// Car car = run.getBean("car", Car.class);//当在myconfig使用@EnableConfigurationProperties(Car.class)时,取消car的@component就会找不到该组件
// System.out.println(car);
}
}
这里需要知道在Config类当中用注解@Configuration(proxyBeanMethods = true)
为true时容器中的同一类组件永远只有一个,即组件依赖
此处为springBoot2最大的更新