Springboot面试题

SpringBoot

SpringBoot是spring的简化版,但不是功能增强版,遵守约定大于配置原则

启用SpringBoot的优缺点

  1. 优点:

    • 远离xml配置,自动配置spring及第三方功能,同时也支持修改默认值

    • 提供大型项目中常见的非功能性特性,如嵌入服务器,安全,指标,健康检测,外部配置等,简化项目开发

    • 使用starter依赖,简化构建配置,避免jar包版本冲突

  2. 特色功能:

    • 起步依赖,将具备某种功能的所有依赖坐标都打包到一起,并提供了一些默认的功能

    • 自动配置,springboot自动配置是一个运行时过程,运行时才决定应该用哪个,不该用哪个,该过程是spring自动完成的

  3. 缺点:

    1. 迭代快,不同版本差异大

    2. 封装太深,不容易精通

    3. 一旦出现错误,调试困难

SpringBoot注解

  1. 特有注解

    1. @SpringBootApplication

      在启动类上使用的注解,表明是一个springboot应用,是一个组合注解,包含几个注解之和:

      1. @SpringBootConfiguration

        代表本身是一个配置类,同时可以加载内置的配置文件

      2. @EnableAutoConfiguration

        启用SpringBoot内置的自动配置功能,开启这个注解之后,SpringBoot就会根据当前类路径下的包、类来自动配置SpringBean和上下文。

      3. @ComponentScan

        对Application类所在的package及该包下的子路径进行自动组件扫描

  2. 常用注解

    1. 组件类注解:

      • @Component
      • @Controller
      • @RestController
      • @Service
      • @Repository
    2. 配置相关注解

      • @ComponentScan:扫描组件

      • @Configuration:作为配置类,支持在内部添加配置,在顶部启用功能。

      • @Bean:标记在方法上,注册组件

      • @ConfigurationProperties:标记在bean类上,配合下面的@EnableConfigurationProperties一起使用

      • @EnableConfigurationProperties:标记在配置类中

        @ConfigurationProperties(prefix = "my")
        public class MyProperties {
            private String name;
            private int age;
        
            // 省略 getter 和 setter 方法
        }
        
        @Configuration
        //在配置类上注明,启用某个类的ConfigurationProperties,而且指定了具体使用哪个类的属性,注意这个@EnableConfigurationProperties可以省略
        @EnableConfigurationProperties(MyProperties.class)
        public class MyConfiguration {
            // 这里可以定义其他的 Bean 或配置
        }
        
        @Component
        public class MyComponent {
        
            private final MyProperties myProperties;
        
            @Autowired //这个@Autowire是可以省略的
            public MyComponent(MyProperties myProperties) {
                this.myProperties = myProperties;
            }
        
            public void printProperties() {
                System.out.println("Name: " + myProperties.getName());
                System.out.println("Age: " + myProperties.getAge());
            }
        }
        
      • @AutoConfigureAfter:用在自动配置类上面,表示该自动配置类需要在另外一个指定的自动配置类配置完之后才可以生效。如 Mybatis 的自动配置类,需要在数据源自动配置类之后。

      • @AutoConfigureBefore:与@AutoConfigureAfter注解相反,表示该自动配置类需要在另外一个指定的自动配置类配置之前才可以生效;

        @Configuration
        public class MyAutoConfiguration1 {
            // 自动配置类的内容
        }
        
        @Configuration
        @AutoConfigureAfter(MyAutoConfiguration1.class)
        public class MyAutoConfiguration2 {
            // 自动配置类的内容
        }
        
      • @Import:Spring 3.0后新增的注解,用来导入一个或者多个@Configuration注解修饰的类,在SpringBoot里面应用很多;

        @Configuration
        public class MyConfiguration1 {
            @Bean
            public MyBean myBean() {
                return new MyBean();
            }
        }
        
        
        //下面四种方法都可以直接使用myBean这个SpringBean了
        
        @Configuration
        @Import(MyConfiguration1.class)
        public class MyConfiguration2 {
            // 这里可以定义其他的 Bean 或配置
        }
        
        
        @Configuration
        public class MyConfiguration2 {
        
            private final MyBean myBean; // 引入MyConfiguration1中定义的Bean
        
            // 通过构造函数注入MyBean
            public MyConfiguration2(MyBean myBean) {
                this.myBean = myBean;
            }
        
            // 这里可以定义其他的 Bean 或配置
        }
        
        
        @Configuration
        public class MyConfiguration2 {
        
            private MyBean myBean;
        
            // setter 方法
            public void setMyBean(MyBean myBean) {
                this.myBean = myBean;
            }
        
            // 这里可以定义其他的 Bean 或配置
        }
        
        
        @Configuration
        public class MyConfiguration2 {
        
            @Autowired
            private MyBean myBean;
        
            // 这里可以定义其他的 Bean 或配置
        }
        
      • @ImportResource:Spring 3.0后新添的注解,用于导入外部 XML 配置文件中定义的 Bean 到当前的配置类中。这对 SpringBoot兼容老项目非常有用。

        <beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.springframework.org/schema/beans
                                http://www.springframework.org/schema/beans/spring-beans.xsd">
        
            <bean id="myBean" class="com.example.MyBean"/>
        
        </beans>
        
        @Configuration
        @ImportResource("classpath:my-beans.xml")
        public class MyConfiguration {
        
            // 引入的 myBean Bean 可以直接在这里使用
            @Autowired
            private MyBean myBean;
        
            // 这里可以定义其他的 Bean 或配置
        }
        
    3. 请求相关注解

      • @RequestBody:接受前端传递过来的JSON格式请求参数,并将参数自动转为Java格式;

      • @RequestMapping:处理请求地址映射,可用于类或方法上。用于类上表示该类中所有的请求方法都以该地址作为父路径;用在方法上用于设置该请求的具体URL地址;

      • @GetMapping@PostMapping@DeleteMapping@PutMapping等:相当于@RequestMapping(method=RequestMethod.Get\Post\Put\Delete等),也是组合注解;

      • @ResponseBody:表示该方法的返回结果直接写入到HTTP response body中,一般可以将结果转为JSON格式;

      • @RequestParam:用于接受表单格式请求参数的注解,相当于 request.getParameter();

      • @PathVariable:接受动态的路径变量参数;

    4. 注入相关注解

      • @AutoWired:根据类型进行对象的注入;
      • @Qualifier:根据名称进行对象的注入;
      • @Resource(name=”name”,type=”type”):既可以根据类型,又可以根据名称进行对象的注入。当没有括号里的内容时,默认是根据名称注入。
    5. 全局异常处理

      • @ControllerAdvice

        @ControllerAdvice 是 Spring MVC 中的一个注解,用于定义全局的控制器增强(Controller Advice)。它允许您在应用程序的所有控制器中共享相同的处理逻辑或异常处理逻辑,并使其更容易维护和管理。

      • @ExceptionHandler(Exception.class)

        作用在方法上,将该方法作为处理某个异常的方法:

        @ControllerAdvice
        public class GlobalExceptionHandler {
        
            @ExceptionHandler(Exception.class)
            public ModelAndView handleException(Exception ex) {
                //如果使用了默认的视图解析器,并且配置了前缀为 /WEB-INF/views/,后缀为 .jsp,那么 "error" 就会被解析为 /WEB-INF/views/error.jsp 这个 JSP 页面。
                ModelAndView modelAndView = new ModelAndView("error");
                //<p>${errorMessage}</p>这种jsp的el表达式,用于获取modelAndView的errorMessage,如果使用的是jsp平级的Thymeleaf、Freemarker 等可能会有不同的方式
                modelAndView.addObject("errorMessage", "An error occurred: " + ex.getMessage());
                return modelAndView;
            }
        
            @ExceptionHandler(MyCustomException.class)
            @ResponseBody
            public String handleCustomException(MyCustomException ex) {
                return "Custom Exception: " + ex.getMessage();
            }
        }
        

SpringBoot配置文件

  1. 约定大于配置

    1. 意义:开发只需要配置不符合约定的部分,别的全部使用默认配置

    2. 常见约定:

      • resources文件夹中存放各种资源配置,变异后生成的class全部放到target文件夹中

      • 默认配置文件必须是application.yml或者application.properties

      • application.yml文件中属性都是有固定名字的

  2. SpringBoot的配置文件

    • .properties

      读取方式:

      1. @ConfigurationProperties

        @ConfigurationProperties(prefix = "my")
        public class MyProperties {
            private String name;
            private int age;
        
            // 省略 getter 和 setter 方法
        }
        
      2. @Value注解方式

        my.property=Hello, World!
        
        @Component
        @PropertySource("classpath:application.properties")
        public class MyBean {
        
            @Value("${my.property}")
            private String myProperty;
        
            public void doSomething() {
                System.out.println("myProperty: " + myProperty);
            }
        }
        

        @Value 注解和 @Autowired 注解是两种不同的注入方式,用来从外部属性文件或者配置中获取值并注入到 Spring 管理的 Bean 中。

      3. Environment

        @Configuration
        @PropertySource("classpath:application.properties")
        public class MyConfiguration {
        
            private final Environment env;
        
            public MyConfiguration(Environment env) {
                this.env = env;
            }
        
            public void someMethod() {
                String propertyValue = env.getProperty("my.property");
                System.out.println("Property value: " + propertyValue);
            }
        }
        
      4. PropertiesLoaderUtils

        public static void main(String[] args) {
            try {
                // 加载classpath中的properties文件
                ClassPathResource resource = new ClassPathResource("123.properties");
                
                // 使用PropertiesLoaderUtils加载properties文件到Properties对象中
                Properties properties = PropertiesLoaderUtils.loadProperties(resource);
                
                // 使用Properties对象获取属性值
                String value = properties.getProperty("my.property");
                System.out.println("Property value: " + value);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        

      注:可以结合@PropertySource进行使用,指定读取配置文件的位置,如果不使用这个注解,就默认从classpath进行读取。

    • .yml

      读取方式:

      1. @ConfigurationProperties

      2. @Value注解方式

      3. Environment

      4. PropertiesLoaderUtils

      注:@PropertySource无法进行使用,yml文件不支持这个注解,如果非要使用,只能是先使用YamlPropertySourceFactory工厂进行一个转换,将yml转换成properties。

      classpath是指虚拟机查找类文件和资源文件的路径,是一个包含多个目录和jar文件的集合。

    • JavaConfig配置类

      @Configuration
      @ComponentScan(basePackages = "com.yyg")
      @PropertySource("classpath:db.properties")
      @Import(OtherConfig.class)
      public class IocConfig {
      
          @Value("${jdbc.username}")
          private String name;
      
          @Value("${password}")
          private String password;
      
          @Value("${url}")
          private String url;
      
          @Value("${driverClassName}")
          private String driverClassName;
      
          @Bean
          public DruidDataSource dataSource() {
              DruidDataSource dataSource = new DruidDataSource();
              dataSource.setName(name);
              dataSource.setPassword(password);
              dataSource.setUrl(url);
              dataSource.setDriverClassName(driverClassName);
              return dataSource;
          }
      }
      

      注:方法参数的类型与容器中已有的 bean 类型相匹配,Spring 会自动将这些 bean 注入到方法中,不需要使用@Autowire;而如果作为成员变量,还是需要使用@Autowire的,因为对于方法参数,Spring 在调用方法时会自动为其传递所需的 bean 实例,因此不需要使用 @Autowired 注解。而对于成员变量,Spring 需要知道要注入哪个 bean 实例,因此需要使用 @Autowired 注解来告诉 Spring 容器需要自动注入哪个 bean。

      @Import导入的别的配置类,这个配置类中创建了SpringBean,无论是作为成员变量还是方法参数,都不需要再使用@Autowire进行注入了。原因:当使用 @Import 导入其他配置类时,被导入的配置类中的 bean 会被纳入到当前配置类的 Spring 上下文中,因此它们可以在当前配置类中直接使用,无需使用 @Autowired 进行注入。

      @Configuration
      @Import(MyConfiguration1.class)
      public class MyConfiguration2 {
      
          // MyBean 可以直接作为成员变量使用,无需 @Autowired 注解
          private MyBean myBean;
      
          // 也可以将 MyBean 作为方法参数,无需 @Autowired 注解
          @Bean
          public AnotherBean anotherBean(MyBean myBean) {
              this.myBean = myBean;
              return new AnotherBean(myBean);
          }
      }
      
    • xml配置文件

      SpringBoot中推荐使用的是Java配置和yml配置文件,而非 XML 配置,但并不是说SpringBoot不支持XML配置文件,在Spring Boot中也是可以使用 XML配置的,我们通过 @ImportResource 注解就可以引入一个 XML配置文件了。

  3. 配置文件加载顺序

    同时存在bootstrap.propertiesapplication.properties,或者同时存在bootstrap.ymlapplication.yml文件。

    bootstrap (. yml 或者 . properties):boostrap是由父ApplicationContext上下文加载的,所以会比applicaton优先加载,该配置在应用程序上下文的引导阶段就生效了。一般来说我们在 Spring Cloud Config 或者 Nacos 中会用到它,且 boostrap里面的属性不能被覆盖。
    application (. yml 或者 . properties): 是由ApplicatonContext加载,用于SpringBoot项目的自动化配置。

  4. 多环境配置

    在SpringBoot中,我们可以利用Spring Profiles机制来允许用户根据不同的环境来切换配置文件(dev,test,prod等)。

    目前使用比较多的方式就是配置多个 application-{profile}.yml 或者多个 application-{profile}.properties文件,

    使用profile属性在不同的环境之间进行切换,即 spring.profile.active= ${env:dev}属性,它的值决定了具体使用的是哪个环境的配置。例如 spring.profile.active=dev 时,我们使用的就是 application-dev.yml + application.yml 的配置。

    注:${env:dev}这个是环境变量key为dev的值,如果值是123,那么就会读application-123.yml的配置。

    当运行jar包的时,我们可以通过命令设置spring.profile.active=xxx来指定运行哪个环境,例如使用 dev 环境

    java -jar xxx.jar --spring.profiles.active=dev

  • 25
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值