SPRING BOOT

114 阅读4分钟

SPRING BOOT

SpringBoot与Spring

SpringBoot=Spring+Boot,在Spring下需要维护bean、维护配置文件、维护依赖,SPringBoot把这些东西封装成脚手架,让程序员更专注业务开发

SpringBoot与SpringCloud的区别?

SpringCloud基于Spring,是微服务架构;而SpringBoot是加强版的快速开发的SPring

SpringBoot的核心注解有哪些,主要由哪几个注解组成?

  • 启动类中@SpringBootConfiguration:组合了@Configuration注解,实现配置类功能
  • @EnableAutoConfiguration 打开自动配置功能 也可以用exclude关闭特定功能
  • @ComponentScan:SPring组件扫描

SpringBoot支持哪些日志框架,默认使用哪个?

  • 支持log4j,logback,JAVA UTIL LOGGING
  • 默认logback

SpringBootStarter工作原理?

  • 首先SpringBoot就是各种starter组合起来的
  • 启动时,由@SpringBootApplication注解会自动去MAVEN中读取每个starter的spring.factories文件,这个文件里配置了需要创建的bean,然后自动注入到SpringContext中

SpringBoot自动配置的原理?

  • 在标有SpringBootApplication的启动类中有SpringBootConfiguration注解,是SpringBoot的主配置类,包含@EnableAutoConfiguration
  • EnableAutoConfiguration会从配置文件META-INF/Spring.properties中加载可能需要的自动配置类
  • 去重,将exlcude和excludeName里面不需要自动配置的类去掉
  • 过滤,将满足@Conditional条件的自动配置类返回,加载进Spring容器中去

运行SpringBoot由有哪几种方式?

  • 直接找到SpringBootApplication的main方法运行
  • 用maven插件运行
  • 打包丢到容器里运行

Spring需要独立的容器运行吗?

不需要 内置tomcat

SpringBoot实现热部署有几种方式?

  • spring loaded
  • spring boot dev tools

SpringBoot怎么使用事务?

  • 首先在配置类上@EnableTransactionManagement开启事务
  • 用事务的地方加@Transaction注解

Async异步调用方法

  • 在配置类上添加@EnableAsync
  • 在需要异步加载的上面加上@async注解,这个方法会在单独的线程里运行

如何在SpringBoot启动的时候运行一些指定的代码?

  • 实现ApplicationRunner接口或者CommandLineRunner里面的run方法

SpringBoot有几种读取配置的方式?

  • @Value
  • @ConfigurationProperties
  • @Environment
  • @PropertySource

什么是Java Config

  • 使用场景 p

    • 使用Java代码来配置bean对象
    • 一个配置类可以继承另一个配置类,自定义bean的时候只需要重写@bean修饰的方法
  • 常用的注解:

  • @Configuration修饰类

  • @ComponentScan

  • @bean

  • @EnableWEBMvc

  • @ImportSource导入指定的xml配置文件

Springboot加载配置的顺序

  • 服务中心nacos注册的bootstrap.yml
  • properties
  • yaml、yml
  • 系统环境变量
  • 命令行参数

SpringBoot是否可以用XML配置?

  • 官方不推荐XML配置,推荐properties或者yml或者Java bean
  • 可以通过@Importresource将自定义的xml配置文件加载进去

SpringBoot的核心配置文件是什么?bootstrap.properties和applicdation.properties的区别?

  • bootstrap.properties一般做Spring cloud的时候会用到,由父applicationcontext创建,会先加载 这个文件里的配置不会被覆盖,所以比如用nacos的时候,可以在远程拉取一些配置到这个文件中来
  • Application.properties 又当前applicationcontext加载,用于SpringBoot的自动化配置

什么是Spring profiles?

  • profiles机制能让开发者切换不同的配置文件
  • 允许通过dev test prod(正式环境)来注册bean,可以使用类似@Profile("dev")注解
  • 可以直接定义类似application.prod.yml,然后在application.yml中加上Spring.profiles.active=prod

SpringBoot多数据源拆分思路?

  • 在配置文件中配置两个配置源
  • 在Java使用分包mapper 接口,在resource下使用分包Mapper.xml
  • 通过@Configurationproperties注入不同的配置源信息,
  • 再将@MapperScan扫描到不同的mapper接口

SpringBoot多数据源事务如何管理

  • service层用@transactional(transactionManagerment=XXXX)来指定事务管理器
  • 实现分布式事务

Spring security框架

  • 在配置类上@EnableWebSecurity开启自动配置类
  • 继承WebSecurityConfigurationAdapter或者返回SecurityFilterChain
  • 身份验证、密码登录、授权等操作

Spring Security和JWT联用

  • 自定义JWT过滤器继承MVC的OncePerRequestFilter

  • 在继承WebSecurityConfigurationAdapter的配置类中添加这个过滤器

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    ​
        @Autowired
        private JwtTokenFilter jwtTokenFilter;
    ​
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.csrf().disable()
                .authorizeRequests()
                    .antMatchers("/public/**").permitAll() // 允许所有用户访问 /public 路径
                    .anyRequest().authenticated() // 其他请求需要身份验证
                .and()
                .addFilterBefore(jwtTokenFilter, UsernamePasswordAuthenticationFilter.class); // 在 UsernamePasswordAuthenticationFilter 之前添加 JWT 过滤器
        }
    }
    ​
    

Spring Boot中如何跨域

  • 直接在controller上使用@CrossOrigion
  • 自定义CorsFilter配置类
javaCopy codeimport org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
​
@Configuration
public class CorsConfig {
​
    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOrigin("*"); // 允许所有来源
        config.addAllowedMethod("*"); // 允许所有请求方法
        config.addAllowedHeader("*"); // 允许所有请求头
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

Spring Boot如何实现全局异常处理?

  • 自定义一些异常类,加上返回状态码、返回消息的细节
  • 使用@ControllerAdvice全局异常处理,使用@RestControllerAdvice【@ResponseBody+@ControllerAdvcide】
  • @ExceptionHandler指定报错类型

SpringBoot如何实现定时任务?

  • @EnableScheduling开启配置

  • @scheduled(fixRate)//每毫秒执行一次

  • @Scheduled(cron)

    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    ​
    @Component
    @EnableScheduling
    public class ScheduledTasks {
    ​
        @Scheduled(fixedRate = 5000) // 每隔5秒执行一次
        public void task1() {
            System.out.println("Task 1 executed at " + new Date());
        }
    ​
        @Scheduled(cron = "0 0 12 * * ?") // 每天中午12点执行
        public void task2() {
            System.out.println("Task 2 executed at " + new Date());
        }
    }
    ​
    

SpringBoot打的jar包·有什么作用?

SpringBoot打的jar包不能被引用,只能执行