目录
一、springboot的启动类
@SpringbootConfiguration注解的作用
/*//开启自动配置
@EnableAutoConfiguration
//加入包扫描
@ComponentScan*/
/**
* 以上常规的注解其实也是对springboot来说是一个侵入!
* 那么我们完全可以利用springbootApplication注解来代替
*
* 一个@SpringBootApplication(scanBasePackages="扫描路径")注解等同于三个注解:
*
* @SpringBootConfiguration,表示当前类完全可以作为配置类来使用。
* 相当于ssm时期的完全注解开发时的@Configuration。
*
* @EnableAutoConfiguration
*
* @ComponentScan("扫描路径"),如果不写默认就是扫描当前类所在包和他的子包。
*/
@SpringBootApplication
public class SpringbootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootDemoApplication.class, args);
}
}
项目结构:注意项目的启动类一定要放在项目工程的根包下。
二、controller层
控制层案例:使用restFul风格的请求实现对控制器方法的访问。
/**
* @author Dragon code!
* @create 2022-04-25 15:40
*/
@RestController
public class MyController {
//外部的请求不需要带上后缀例如.do
//对中央调度器的配置url-pattern内容指定为 "/"
//配成"/"的主要作用可以从外部向控制器发restFul风格的请求
//restFul风格的参数在url上用/代替原来的?
@RequestMapping("/hello/{id}")
public String hello(@PathVariable int id) {
System.out.println("id = " + id);
return "hello world";
}
}
三、springboot的配置文件
springboot采用的是自动配置的方式,它没有使用xml文件来写配置,使用的是java配置的方式。
下面来对源码进行跟踪:
在springboot中存在这一份依赖,用来实现自动化配置的功能。
找到:位于
package org.springframework.boot.autoconfigure.web.servlet下的类
上面这个类就是springboot的springmvc的自动配置类(mvc模块的配置类)
其实还有好多下面就不一一说明了,针对每一种配置都有它自己的配置类!
//表示当前是配置类
@Configuration
//基于web应用的配置
@ConditionalOnWebApplication(
type = Type.SERVLET
)
//表示如果依赖中有Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class这三个类的话
//那么该配置就要生效
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
//排除具有的内容,没有这个bean那么就生效
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
//执行顺序号,按顺序执行
@AutoConfigureOrder(-2147483638)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration {
public static final String DEFAULT_PREFIX = "";
public static final String DEFAULT_SUFFIX = "";
private static final String[] SERVLET_LOCATIONS = new String[]{"/"};
public WebMvcAutoConfiguration() {
}
//以下是springmvc中的某一个配置,其实还有好多
//jsp的视图解析器
@Bean
@ConditionalOnMissingBean({HiddenHttpMethodFilter.class})
@ConditionalOnProperty(
prefix = "spring.mvc.hiddenmethod.filter",
name = {"enabled"},
matchIfMissing = true
)
public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
return new OrderedHiddenHttpMethodFilter();
}
springboot中配置生效的条件
- 添加了相关的启动器
- 在配置文件中没有覆盖默认的配置的配置
下面演示通过配置类拿到连接对象的几种方法:
方式一:直接使用自定义配置类替换默认配置
前提:我们把默认配置里的配置给注释掉:
使用jdbc.properties配置文件
jdbc.driverClassName = com.mysql.jdbc.Driver
jdbc.userName = root
jdbc.password = abc123
jdbc.url = jdbc:mysql://localhost:3306/music?serverTimezone=Asia/Shanghai
JdbcConfig配置类
要给配置类加上PropertySource指定配置文件的位置,那么接下来就可以使用@Value注解给属性赋值了!
将我们的方法加上bean注解表示将方法放入bean容器进行管理,bean的id就是方法名。
/**
* @author Dragon code!
* @create 2022-04-25 16:54
*/
@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig {
@Value("${jdbc.driverClassName}")
private String driverClassName;
@Value("${jdbc.userName}")
private String userName;
@Value("${jdbc.password}")
private String password;
@Value("${jdbc.url}")
private String url;
@Bean
public DruidDataSource dataSource(){
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName(driverClassName);
druidDataSource.setUsername(userName);
druidDataSource.setPassword(password);
druidDataSource.setUrl(url);
return druidDataSource;
}
}
由于配置类中已经注册过方法的bean了,所以我们在controller类中可以直接自动注入然后拿到连接池对象
/**
* @author Dragon code!
* @create 2022-04-25 15:40
*/
@RestController
public class MyController {
//外部的请求不需要带上后缀例如.do
//对中央调度器的配置url-pattern内容指定为 "/"
//配成"/"的主要作用可以从外部向控制器发restFul风格的请求
//restFul风格的参数在url上用/代替原来的?
@Autowired
private DruidDataSource dataSource;
@RequestMapping("/test/{id}")
public String test(@PathVariable int id) {
System.out.println("id = " + id);
DruidPooledConnection connection = null;
try {
connection = dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println("connection = " + connection);
return "ok";
}
}
成功拿到连接池对象!
方式二:配置类里面再使用属性类,二者搭配使用
因为直接在配置类中写大量的value其实是非常的不美观的。
jdbcProperty属性类的重点在于@ConfigurationProperties注解,指定读取文件中属性的前缀是jdbc
那么他会自动到默认配置文件中拿到属性值并注入到属性中
但是要注意我们的属性名一定要和配置文件的名字保持一致!
/**
* @author Dragon code!
* @create 2022-04-25 17:07
*/
//jdbc的属性类
@ConfigurationProperties(prefix = "jdbc")
public class jdbcProperty {
private String driverClassName;
private String userName;
private String password;
private String url;
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
配置文件:此处演示properties配置方式
application.properties
jdbc.driverClassName= com.mysql.jdbc.Driver
jdbc.username = root
jdbc.password = abc123
jdbc.url = jdbc:mysql://localhost:3306/music?serverTimezone=Asia/Shanghai
配置类代码:
/**
* @author Dragon code!
* @create 2022-04-25 16:54
*/
@Configuration
//在配置类中引入属性类
@EnableConfigurationProperties(jdbcProperty.class)
public class JdbcConfig1 {
//自动注入属性类,属性注入,前提是要加@EnableConfigurationProperties(jdbcProperty.class)
@Autowired
private jdbcProperty jdbcProperty;
//构造方法注入
public JdbcConfig1(com.lay.boot1.config.jdbcProperty jdbcProperty) {
this.jdbcProperty = jdbcProperty;
}
@Bean
public DruidDataSource dataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName(jdbcProperty.getDriverClassName());
druidDataSource.setUsername(jdbcProperty.getUserName());
druidDataSource.setPassword(jdbcProperty.getPassword());
druidDataSource.setUrl(jdbcProperty.getUrl());
return druidDataSource;
}
}
使用yml配置文件的方法读取属性值:
server:
port: 8081
#spring:
# datasource:
# driver-class-name: com.mysql.jdbc.Driver
# password: abc123
# type: com.alibaba.druid.pool.DruidDataSource
# url: jdbc:mysql://localhost:3306/music?serverTimezone=Asia/Shanghai
# username: root
#
# #解决时差问题
# jackson:
# date-format: yyyy-MM-dd HH:mm:ss
# time-zone: GMT+8
jdbc:
driverClassName: com.mysql.jdbc.Driver
password: abc123
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/music?serverTimezone=Asia/Shanghai
username: root
结果是依然可以拿到对象,注意yml文件语法中只能使用空格不能使用tab键!