美文网首页
2019-08-11spring boot 实践

2019-08-11spring boot 实践

作者: zecan | 来源:发表于2020-06-13 12:28 被阅读0次

    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

    相关文章

      网友评论

          本文标题:2019-08-11spring boot 实践

          本文链接:https://www.haomeiwen.com/subject/hwujjctx.html