SpringBoot的第一个程序
项目结构(并不是一个完整的)
主程序
package com.jiangkun.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 主程序类
* @SpringBootApplication,这是一个SpringBoot应用
*/
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class,args);
}
}
配置文件pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jiangkun</groupId>
<artifactId>damo2</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
<dependencies>
<!-- web场景 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!-- 可执行的 直接打成jar包 可以直接运行 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
HelloController
package com.jiangkun.boot.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
//@RestController是@Controller+@ResponseBody
@Controller
public class HelloController {
@ResponseBody//注释这个是以字符串返回给浏览器
@RequestMapping("/hello")
public String handle01(){
return "Hello,Spring Boot 2 !";
}
}
application.properties
#服务器端口号的配置
server.port=8888
依赖管理
查看spring-boot-dependencies里面规定当前依赖的版本 用的key
<!--自定义版本-->
<properties>
<mysql.version>5.1.43</mysql.version>
</properties>
1、见到很多 spring-boot-starter-* *就某种场景
2、只要引入starter,这个场景的所有常规需要的依赖我们都自动引入
自动配置
主程序下的所有包都能扫描到(同包也可以)
如果放到了外面可以配置从哪扫描(改变扫描路径)
@SpringBootApplication(scanBasePackages="com.jiangkun.等")
或
//指定包扫描
@ComponentScan("")
@SpringBootApplication---->
{
@SpringBootConfiguration
@EnbleAutoConfiguration
@ComponentScan("主程序的包路径")
}
注解
添加组件
@Configuration //告诉SpringBoot是一个配置类 == 配置文件
@Component//组件
@Controller//控制器
@Service//业务逻辑组件
@Repository//数据库层组件
@Import()要写在容器中的组件上------导入组件
package com.jiangkun.boot.config;
import ch.qos.logback.core.db.DBHelper;
import com.jiangkun.boot.baen.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
/**
* 配置类里面使用@Bean标注在方法上给容器注册组件,默认是单实例的
* 配置类本身也是组件
* @Configuration(true)默认
* proxyBeanMethodes:代理bean的方法
* 如果是false 就不是一个对象(轻量级)
* Full模式
* 和
* Lite模式
* @Import({User.class, DBHelper.class})
* 给容器中自动创建出这两个类型的组件,默认组件的名字是全类名
*/
@Import({User.class, DBHelper.class})
//@Configuration//@Configuration 告诉SpringBoot是一个配置类 == 配置文件
@Configuration(proxyBeanMethods = true)
public class MyConfig {
/**
* 外部无论配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
* @return
*/
@Bean//给容器中添加组件,以方法名作为组件的id,返回类型就是组件的类型,返回的值,就是组件在容器中的实例
public User user01(){
return new User("jiangkun",18);
}
}
package com.jiangkun.boot;
import com.jiangkun.boot.baen.User;
import com.jiangkun.boot.config.MyConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
/**
* 主程序类
* @SpringBootApplication,这是一个SpringBoot应用
*/
@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 nane:names
) {
System.out.println(nane);
}
//3、从容器中获取组件
User user01 = run.getBean("user01",User.class);
System.out.println(user01);
MyConfig bean = run.getBean(MyConfig.class);
System.out.println(bean);
}
}
相当于
<?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="user01" class="com.jiangkun.boot.baen.User">
<property name="name" value="01"></property>
<property name="age" value="18"></property>
</bean>
</beans>
@Conditional
条件装配:满足Conditional指定的条件,则进行组件注入
package com.jiangkun.boot.config;
import ch.qos.logback.core.db.DBHelper;
import com.jiangkun.boot.baen.Jiangkun;
import com.jiangkun.boot.baen.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
/**
* 配置类里面使用@Bean标注在方法上给容器注册组件,默认是单实例的
* 配置类本身也是组件
* @Configuration(true)默认
* proxyBeanMethodes:代理bean的方法
* 如果是false 就不是一个对象(轻量级)
* Full模式
* 和
* Lite模式
* @Import({User.class, DBHelper.class})
* 给容器中自动创建出这两个类型的组件,默认组件的名字是全类名
*/
@Import({User.class, DBHelper.class})
//@Configuration//@Configuration 告诉SpringBoot是一个配置类 == 配置文件
@Configuration(proxyBeanMethods = true)
public class MyConfig {
/**
* 外部无论配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
* @return
*/
@ConditionalOnBean(name ="Tom" )//意思是有Tom组件时给容器注册user01
@Bean//给容器中添加组件,以方法名作为组件的id,返回类型就是组件的类型,返回的值,就是组件在容器中的实例
public User user01(){
return new User("jiangkun",18);
}
@Bean("Tom")
public Jiangkun jiangkun01(){
return new Jiangkun("江坤");
}
}
@ImportResource
原生配置文件引入
配置绑定
@Component + @ConfigurationProperties(prefix = "mycar")
第二种
@ConfigurationProperties(prefix = "mycar")+@EnableConfigurationProperties(Car.class) //开启car配置绑定功能 //把这个Car这个组件自动注册到容器中
1、@SpringBootConfiguration当前是一个配置类 2、@ComponentScan 指定扫描那些,spring注解 3、@EnableAutoConfiguration//开启自动配置的注解@AutoConfigurationPackage
自动配置包
@AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class)@Import(AutoConfigurationPackages.Registrar.class)给容器中导入一系列组件将指定包下的所有组件导入?MainApplications
@Import(AutoConfigurationImportSelector.class)
Lombok
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
在软件市场添加插件lombok
@Data//生成set和get方法 @ToString//生成tostring @AllArgsConstructor//有参构造器 @NoArgsConstructor//无参构造器@EqualsAndHashCode//重写hashCode
@Slf4j的使用
package com.jiangkun.boot.controller;
import com.jiangkun.boot.baen.Car;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
//@RestController是@Controller+@ResponseBody
@Slf4j
@Controller
public class HelloController {
@Autowired//自动注入
Car car;
@ResponseBody
@RequestMapping("/car")
// @ResponseBody
public Car car(){
return car;
}
@ResponseBody//注释这个是以字符串返回给浏览器
@RequestMapping("/hello")
public String handle01(){
log.info("请求进入.....");
return "Hello,Spring Boot 2 !";
}
}
dev-tools热更新
<!-- 热更新 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
真正的热加载要用付费的JRebel
spring Initailzr