1.启动类必须在controller的包上面,否则会出现无法找到“/”路径的错误。
2.@Controller和@RestController的区别
(1)@Controller需要返回html和jsp页面,如果我们在Controller方法中需要返回JSON、XML或者我们自己定义的类型到页面中,那么就需要使用@ResponseBody注解该方法。
(2)@ResponseBody,返回的是JSON、XML或其他文本。因此用@RestController注解相当于@Controller注解的类里面的每个方法都加上了@ResponseBody注解。
3.@RestController里面的方法返回的文本一般通过ajax请求就可以获取到了。
4.配置文件一般写在Application.property中,通过使用的话,在类中的变量直接使用类似@Value("${com.ken.number}")注入值即可。
5.在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:
application-dev.properties:开发环境
application-test.properties:测试环境
application-prod.properties:生产环境
至于哪个具体的配置文件会被加载,需要在application.properties文件中通过spring.profiles.active属性来设置,其值对应{profile}值。
6.Spring Boot的工程结构
(1)root package结构:com.example.myproject
(2)应用主类 Applicationi.java置于root package下,通常我们会在应用主类中做一些框架配置扫描等操作,我们放在root package下,可以帮助程序减少手工配置来加载到我们希望被Spring加载的内容。
(3)实体(Entity)与数据访问层(Repository)置于com.example.myproject.domain包下
(4)逻辑层(Service)置于com.example.myproject.service包下
(5)Web层(Web)置于com.example.myproject.web包下
com
+- example
+- myproject
+- Application.java
|
+- domain
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- web
| +- CustomerController.java
|
(6)resources目录结构
1.static:保存所有的静态资源,如js css images
2.templates:保存所有的模板页面(Spring Boot默认使用嵌入式的Tomcat,默认不支持JSP页面),可以使用模板引擎(freemarker、thymeleaf)
3.application.properties:Spring Boot应用的配置文件,可以修改默认配置。
7.spring JPA reopository @Query查询的是类名,是需要大写的,而不是表名,小写开头
···
public interface StudentRepository extends CrudRepository
Student findByName(String name);
Student findByNameAndId(String name, Integer id);
//这里的Student是类要用大写,不是数据库表的小写开头的student
@Query("from Student u where u.name=:name")
Student findStudent(@Param("name") String name);
}
···
8.但是在如果使用的是JdbcTemplate查询语句里面的是小写的表名,而不是类名
@Component
public class StudentServiceImpl implements StudentService{
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public void create(String name,int id) {
jdbcTemplate.update("insert into student(name,id) values(?,?)",name,id);
}
@Override
public void deleteByName(String name) {
jdbcTemplate.update("delete from student where name = ?",name);
}
@Override
public Integer getUserCount() {
Integer count = (Integer) jdbcTemplate.queryForObject("select count(1) from student", Integer.class);
return count;
}
@Override
public void deleteAllUsers() {
jdbcTemplate.update("delete from student");
}
9.spring-boot-starter-parent主要是管理spring应用的默认依赖。
10.@SpringbootApplication 注解的是启动类
在这个注解里面有@AutoConfiguration配置注解,启用自动配置
@AutoConfiguration里面有@AutoConfigurationPackage,这个注解的左右时将主配置类(@SpringBootApplication标注的类)的所在包以及所有子包里面的所有组件扫描到spring容器里面。
11.@EnableAutoConfiguration:开启自动配置功能
--| @AutoConfigurationPackage 自动配置包
--|@Import(AutoConfigurationPackages.Registrar.class) 控制导入的组件(取到主配置类
@SpringBootApplication注解的类的包名,扫描该包以及下级包的所有组件到Spring容器中)
--|@import(EnableAutoConfigurationImportSelector.class) EnableAutoConfigurationImportSelector:导入哪些组件的选择器,将需要导入的组件以全类名的方式返回,这些组件会被添加到容器中。根据引入的starters,调用自动配置类,将相关依赖的jar包引入进来
AutoConfigurationImportSelector.getAutoConfigurationEntry->getCandidateConfigurations() ->SpringFactoriesLoader.loadFactoryNames() ->loadSpringFactories();
这些类都在spring-boot-autoconfigure-2.2.6.RELEASE里面的META-INF/spring.factories路径里面
12.spring boot单元测试
(1)配置文件里面的prefix必须是小写,否则编译会不通过
person:
name: Ken
age: 28
map: {k1: v1, k2: v2}
list:
- test1
- test2
dog:
name: 旺财
age: 10
13.使用@Configuration注解,替换掉之前的xml配置文件,能在@Configuration注解的类中使用@Bean,将新的bean对象添加到spring的容器ApplicatioinContex中。
14@PropertySource在spring component中引入配置文件,并将值设置component中的属性
15.如何查找Spring boot中application.properties可以配置哪些属性
- 首先,ctrl+shift+t 搜索*AutoConfiguration.java类
@Configuration(proxyBeanMethods = false)
@AutoConfigureBefore(JmsAutoConfiguration.class)
@AutoConfigureAfter({ JndiConnectionFactoryAutoConfiguration.class })
@ConditionalOnClass({ ConnectionFactory.class, ActiveMQConnectionFactory.class })
@ConditionalOnMissingBean(ConnectionFactory.class)
@EnableConfigurationProperties({ ActiveMQProperties.class, JmsProperties.class })
@Import({ ActiveMQXAConnectionFactoryConfiguration.class, ActiveMQConnectionFactoryConfiguration.class })
public class ActiveMQAutoConfiguration {
}
-然后在里面找到@EnableConfigurationProperties(*Properties.class)注解的properties类,在里面找到已经默认配置好的配置类,里面的属性值就是可以在application.properties里配置的属性
@ConfigurationProperties(prefix = "spring.activemq")
public class ActiveMQProperties {
/**
* URL of the ActiveMQ broker. Auto-generated by default.
*/
private String brokerUrl;
/**
* Whether the default broker URL should be in memory. Ignored if an explicit broker
* has been specified.
*/
private boolean inMemory = true;
/**
* Login user of the broker.
*/
private String user;
/**
* Login password of the broker.
*/
private String password;
/**
* Time to wait before considering a close complete.
*/
private Duration closeTimeout = Duration.ofSeconds(15);
/**
* Whether to stop message delivery before re-delivering messages from a rolled back
* transaction. This implies that message order is not preserved when this is enabled.
*/
private boolean nonBlockingRedelivery = false;
/**
* Time to wait on message sends for a response. Set it to 0 to wait forever.
*/
private Duration sendTimeout = Duration.ofMillis(0);
}
16.spring boot中的配置类有需要在一定的条件下才能生效,里面有很多的@Condition注解,只有Condition为true时,配置类才会加载到容器中,相关配置才会生效。
如果需要查看当前的spring boot应用使用了哪些配置类,在application.properties文件中设置debug = true,就可以在控制台中看到生效的配置类
17.spring框架默认使用的日志系统是common-logging,而spring boot 使用的是logback。
日志的级别由低到高依次有:trace->debgug->info->warn->error,springboot默认的输出日志级别是info。这个可以在配置文件里面设置 logging.level来进行修改。
18.不同的框架如hibernate、spring、mybatis都会使用不同的日志框架,但是它们都可以使用转换jar包,包名和类名都是跟之前的日志系统一致,但是实际上调用的还是slf4j接口,最后可以统一成只调用一个日志实现系统。
19.日志配置文件,如logback.xml,会自动被日志框架识别,无法使用profile等高级功能,但是如果后面加上 -spring的话,如logback-spring.xml,会被spring框架识别,并且可以使用高级功能。
20.SpringBoot通过WebMvcAutoConfiguration默认配置好了SpringMVC。自动配置的东西包括
- 视图解析器 viewResolver
- 转换器converter(类型转换器) 格式器formater(日期格式器)
- http消息转换器 httpMessageConverter(Spring用来转换http的请求和响应对象)
21.如何修改默认SpringMVC的默认配置
模式:
(1)SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean @Component),如果没有用户配置的才自动配置。如果有些组件可以有多个(ViewResolver),将使用用户配置和默认配置的组合起来。
22.spring boot引入mybatis一定要添加版本号,否则会无法引入依赖
23.RequestParam 和RequestBody分别适用于表单提交以及json提交方式过来的数据
24.使用网页发送http://localhost:8001/payment/create?serial=9001 请求,服务器端接收的参数是字符串,不用@RequestBody能将参数转换为json对象接收。
但是如果用RestTemplate发起请求调用,如果,controller参数没有用@RequestBody注解,就无法接收到数据