2019-08-11spring boot 实践

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, Long>{
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注解,就无法接收到数据

批注 2020-06-13 122750.png

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351