把Spring Boot称为搭建程序的 脚手架 。其最主要作用就是帮我们快速的构建庞大的spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让我们关注于业务而非配置。
我们可以使用SpringBoot创建java应用,并使用java –jar 启动它,就能得到一个生产级别的web工程。
SpringBoot提供了一个名为spring-boot-starter-parent的工程,里面已经对各种常用依赖(并非全部)的版本进行了管理,我们的项目需要以这个项目为父工程,这样我们就不用操心依赖的版本问题了,需要什么依赖,直接引入坐标即可!
<modelVersion>4.0.0modelVersion>
<groupId>cn.itcast.springbootgroupId>
<artifactId>itcast-springbootartifactId>
<version>1.0-SNAPSHOTversion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.0.6.RELEASEversion>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
dependencies>
project>
@RestController
@EnableAutoConfiguration
public class HelloController {
@GetMapping("show")
public String test(){
return "hello Spring Boot!";
}
public static void main(String[] args) {
SpringApplication.run(HelloController.class, args);
}
}
这里没有配置任何的信息,如访问路径,tomcat端口都没有说明。这就是Springboot自动配置。
可以直接 localhost:880880/show 访问
引入启动器,只有有了启动器才能用相关注解实现相关功能。
@EnableAutoConfiguration
由于导入的启动器中使用了spring-boot-starter-parent启动器,它可以保证在自动导入依赖时不会冲突。
SpringBoot根据spring-boot-starter-web这个依赖自动引入的,而且所有的版本都已经管理好,不会出现冲突。
springboot如何“猜测”需要哪个依赖?
主要是通过引入的启动器,配置的bean来猜测。
一个springboot只能有一个main方法,来监听8080端口。对于多个业务操作,就无法启动。使用引导类来通过读取注解来启动。
一个springboot工程中都会在基包下创建一个引导类,一些springboot的全局注解
(@EnableAutoConfiguration注解)以及springboot程序的入口main方法都放在该类中。
@EnableAutoConfiguration
@ComponentScan
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
启动类:
@EnableAutoConfiguration 配置自动配置
@ComponentScan,运行引导类,会去扫描包中注解过的类,运行
如同spring的xml配置
通过basePackageClasses或者basePackages属性来指定要扫描的包。如果没有指定这些属性,那么将从声明这个注解的类所在的包开始,扫描包及子包
将从声明这个注解的类所在的包开始,扫描包及子包。而我们的@ComponentScan注解声明的类就是main函数所在的启动类,因此扫描的包是该类所在包及其子包。
一般启动类会放在一个比较浅的包目录中。
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
@SpringBootApplication 相当于@EnableAutoConfiguration和@ComponentScan注解,
说明该类是引导类
springboot彻底放弃了xml的使用,所以使用java纯代码的形式来配置
java配置主要靠java类和一些注解来达到和xml配置一样的效果,比较常用的注解有:
<dependency>
<groupId>com.github.drtranggroupId>
<artifactId>druid-spring-boot2-starterartifactId>
<version>1.1.10version>
dependency>
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/leyou
jdbc.username=root
jdbc.password=123
@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfiguration {
@Value("${jdbc.url}")
String url;
@Value("${jdbc.driverClassName}")
String driverClassName;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setDriverClassName(driverClassName);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
@Configuration :声明 JdbcConfiguration 是一个配置类。
@PropertySource :指定属性文件的路径是: classpath:jdbc.properties
@Value 为属性注入值。
@Bean将 dataSource() 方法声明为一个注册Bean的方法,Spring会自动调用该方法,将方法的返回值加入Spring容器中。相当于以前的bean标签
@ConfigurationProperties(prefix = "jdbc")
public class JdbcProperties {
private String url;
private String driverClassName;
private String username;
private String password;
// ... 略
// getters 和 setters
}
在JdbcConfiguration中使用这个属性:
@Autowired注入
@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfiguration {
@Autowired
private JdbcProperties jdbcProperties;
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(jdbcProperties.getUrl());
dataSource.setDriverClassName(jdbcProperties.getDriverClassName());
dataSource.setUsername(jdbcProperties.getUsername());
dataSource.setPassword(jdbcProperties.getPassword());
return dataSource;
}
}
这种方法就是简单的自动注入对象,通过类的get方法来获取相关数据,笨方法
构造函数注入
@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfiguration {
private JdbcProperties jdbcProperties;
public JdbcConfiguration(JdbcProperties jdbcProperties){
this.jdbcProperties = jdbcProperties;
}
@Bean
public DataSource dataSource() {
// 略
}
也同样是笨方法,连自动注入都不需要,创建出对象后,直接在构造方法中作为参数传入,来保证每次构建对象就会导入配置类。
@Bean方法的参数注入
@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfiguration {
@Bean
public DataSource dataSource(JdbcProperties jdbcProperties) {
// ...
}
}