红泥小火炉


SpringBoot十五问

Nathaniel 715浏览 0条评论
首页/正文
分享到: / / / /

1.什么是SpringBoot?

SpringBoot是一个用来简化Spring应用的初始搭建和开发过程的框架。使用特定的方式来进行配置,使开发人员不再需要定义样板化的配置(Spring配置文件和web.xml)。

2.SpringBoot优点?

  • 减少开发,测试时间;
  • 使用javaConfig有助于避免使用XML;
  • 避免了大量的maven导入和版本冲突;
  • 内置服务器,使用更少的配置。

代码结构上需要注意的是代码所在的包必须是启动类所在包的子孙包,不能是同级包;

3.初始化设置为jar包的项目,如何更改为打war包?

  • 修改启动类:继承SpringBootServletInitializer;并重写其configure方法:
public class SpringbootApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);
    }
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder){
        return builder.sources(SpringbootApplication.class);
    }
    
}
  • 在pom.xml中添加以下坐标依赖:
<packaging>war</packaging>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </configuration>
</plugin>
  • 正常打包即可。

springboot默认主配置文件为application.properties或spring.properties;

4.什么是yml?和properties的区别是什么?

yml文件是一种直观的能够被电脑识别的数据序列化格式,是一种可读性高且容易被人阅读,容易和脚本语言交互,用来表达多级资源序列的编程语言。

与properties的主要区别:对多级属性,也就是key的显示方式不同,在输入时,只需要按照(.)的方式输出即可,冒号和值之间要求有一个空格,不同级别的属性之间要有两个空格的缩进。

这两个文件只有存在一个名称为application的。

5.什么是Springboot中的监视器?有什么作用?

Springboot中的监视器是Actuator;是一个可拔插模块,用于对工程进行监控,通过不同的将控制终端实现不同的监控功能。

# Actuator Web 访问端口
management.server.port=8081
# Actuator上下文名称
management.server.servlet.context-path=/spp
# Actuator路径
management.endpoints.web.base-path=/base

自定义info信息

# 自定义info信息
info.company.name=zhaoyangjue
info.compant.url=https://www.zhaoyangjue.site
info.company.addr=Shanxi China
info.auth.name=zhaoyangjue
info.auth.dep=development
# 从pom.xml中读取信息,需要使用默认的@符号
info.project.groupid=@project.groupId@
info.project.artifactid=@project.artifactId@
info.project.version=@project.version@
info.project.name=@project.name@

读取pom.xml中的文件信息需要在pom.xml中配置(build节点)如下资源位置信息:

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
            <include>**/*</include>
        </includes>
    </resource>
</resources>

mappings:查看当前工程中所有的URI与处理器的映射关系,以及详细的处理器方法及其映射规则。

beans:查看当前应用中所有的对象信息。

env:查看当前应用程序运行主机的所有软硬件环境信息。

单元测试,在测试类上添加@RunWith(SpringRunner.class)和@SpringBootTest注解;

6.如何动态切换开发和生产环境?

  • 可以创建多个application-{profile}的配置文件,在不同的文件中指定不同的启动端口和启动上下文,并在application.properties中配置spring.profiles.active来指定不同的环境,同时在对应的业务处理类上需要注明@profiles所属环境。

  • 也可以针对jar或者war,在启动时指定环境,特别使用于线上问题排查和定位;

    java -jar xxx.jar --spring.profiles.active=prod
    
  • 如果不想写多个配置文件,可以将多个配置文件在一个配置文件中进行配置,多组配置之间使用上个减号进行分隔,该方式只适用于yml作为配置文件的情况。

7.如何读取配置文件中的内容?

  • 如果是自定义的属性值,直接在类变量上添加@Value("${key}"),即可获取;

  • 读取自定义配置文件中的元素,使用@PropertySource标签,指定自定义配置文件的位置,并指定编码;改标签不能用于yml文件;同时需要注意,如果自定义配置文件和原有配置文件中有相同的属性值,则该标签不生效。

  • 如果自定义属性为一个对象或者一个数组或集合,则在对应的实体类上注明

    @PropertySource("classpath:myapp.properties")
    @ConfigurationProperties("对象名称或数组名称或集合")
    

8.如何在springboot下使用jsp?

  • 添加jsp引擎jasper依赖:
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
</dependency>
  • 将webapp注册为资源目录(一般上也将mybatis映射文件也一并注册)
<resource>
    <directory>src/main/java</directory>
    <includes>
        <include>**/*.xml</include>
    </includes>
</resource>
<resource>
    <directory>src/main/webapp</directory>
    <targetPath>META-INF/resources</targetPath>
    <includes>
        <include>**/*.*</include>
    </includes>
</resource>

9.如何整合springboot与Mybatis?

  • 引入整合依赖:
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.12</version>
</dependency>
  • 和整合spring与mybatis的步骤一致,在配置文件中指明mybatis中的相关配置:
mybatis.mapper-locations=classpath:site/zhaoyangjue/dao/*.xml
mybatis.type-aliases-package=site.zhaoyangjue.entity
# 数据库链接信息,可以在单独的配置文件中进行整合,也可以在该配置文件中进行配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8
spring.datasource.data-password=xxx
spring.datasource.data-username=root

10.如何开启事务?

在启动类上设置@EnableTransactionManagement,在对应的service层设置事务管理(@Transactional(rollbackFor = Exception.class),指明事务回滚的情况);

11.springboot中的日志采用的logback;性能要优于log4j;

12.如何在springboot中使用拦截器?

  • 定义拦截器:和springmvc中一样,实现HandlerInterceptor,并重写preHandle方法。
  • 定义配置文件类:继承WebMvcConfigurationSupport类,使用@Configuration标记成为配置文件类,并重写addInterceptors方法。
@Configuration
public class MyWebMvcConfiguration extends WebMvcConfigurationSupport {
  @Override
  protected void addInterceptors(InterceptorRegistry registry) {
    SomeInterceptor someInterceptor = new SomeInterceptor();
    registry.addInterceptor(someInterceptor)
        .addPathPatterns("/first/**")
        .excludePathPatterns("/second/**");
  }
}

13.如何在springboot中使用servlet和Filter?

注解方式:

  • 创建类继承HttpServlet,并在对应类上指明@WebServlet或@WebFilter;
  • 在启动类上添加@ServletComponentScan("site.zhaoyangjue.*"),servlet扫描注解;

配置方式:

  • 定义配置类:此处使用ServletRegistrationBean(如果是过滤器的话使用FilterRegistrationBean)作为容器;
@Configuration
public class MyServletApplication {
  @Bean
  public ServletRegistrationBean<MyServlet> getServletBean(){
    MyServlet myServlet = new MyServlet();
    return new ServletRegistrationBean<MyServlet>(myServlet,"/mysome");
  }
}

14.springboot的自动配置原理?

@EnableAutoConfiguration用于完成自动配置,是springboot的核心注解,@Import注解为引入对应的配置类:

  • AutoConfigurationImportSelector:在该类中有getCandidateConfigurations方法;其内部调用了SpringFactoriesLoader的loadFactoryNames方法;继续调用了loadSpringFactories方法,可以看到配置文件的来源为spring.factories文件;

  • AutoConfigurationPackage注解中引用了Registrar类。

  • yml文件的加载:启动类的 run()方法开始执行后会准备运行环境并注册监听器,在准备运行环境时会发 布环境准备事件,该事件会触发监听的执行,即监听器在监听到该事件后会加载配置文件。

15.如何自定义starter?

  • 自定义starter的名称应该遵循{name}-spring-boot-starter;
  • 创建starter主要业务逻辑类;
  • 定义配置属性封装类:在其上使用@ConfigurationProperties注解;
  • 定义自动配置类:使用@Configuration注解,@ConditionalOnClass(主要业务逻辑类.class);@EnableConfigurationProperties(配置属性封装类.class)。在内部的方法上创建bean:@Bean,@ConditionalOnMissingBean,@ConditionalOnProperty(prefix = "前缀",value = "enable",havingValue = "true")。
  • 创建META-INF下的spring.factories文件,固定的键:org.springframework.boot.autoconfigure.EnableAutoConfiguration;值为自动配置类的全限定名。
最后修改: © 著作权归作者所有
上一篇

评论列表

还没有人评论哦~赶快抢占沙发吧~

博客信息

  • 文章数目 12
  • 标签数目 7
  • 运行天数
  • 最后活动

广告