Springboot总结

springboot其宣传,约定优于配置。其核心是自动装配,运用SPI机制。配置在spring.factoris文件中的配置类。启动时自动装载。核心注解@EnableAutoConfiguration。
@Import注解,EnableAutoConfigurationImportSelector.class为导入配置选择器,参数为选择器,实现ImportSelector接口。

@SpringBootConfiguration // 配置类
@EnableAutoConfiguration // 自动装配 按需加载
最终读取spring的配置文件:META-INF/spring.factories







@ComponentScan // 扫描组件

简单的说 springboot 的自动装载机制就是通过配置@EnableAutoConfiguration 将配置为@Configuration 下的@Bean 方法加载到 spring 容器中,这个过程就是 spring 自动装载机制。首先 springboot 自动装配功能是为了满足啥?是为了满足其他的插件进行扩展,因为有很多外部的 bean 我们没法管理,也不知道具体包的路径,这个时候 springboot 提供了自动装配功能,让我们外部的类能够注入到 spring 项目中。第二,如果说这个是 springboot 的自动装配功能不如说是 spring 的自动装配功能。因为 springboot 使用了 spring3.1 出来的 ImportSelector 动态 bean 的装载实现的自动装载机制,同时使用了 META-INF/spring.factories 中的 SPI 机制实现了 spring 自动扫描到自动装载的 bean 的机制。后面再说几点,spring 发展是由 XML 文件到注解方式的一个循序渐进的过程,比如@Component 以及它的派生注解@Controller 等,最后 spring 直接把 XML 文件变成了@Configuration 注解,这样理解就可以理解成 springboot 自动装载机制是把外部的 xml 文件的 Bean 配置导入到了自己的项目中,让 Bean 在自己的项目中运行。而起到关键作用的@EnableAutoConfiguration 只是作为了一个中介者的作用。

常见面试题:
如何解决循环依赖
在2.6.0之前,Spring Boot会自动处理循环依赖的问题,而2.6.0版本以上开始检查循环依赖,存在该问题则会报错
如下配置避免报错,允许循环依赖可能会导致一些问题,比如在创建 bean 时的意外行为,因此应该只在确实需要并且理解其潜在副作用的情况下使用。

spring:
  main:
    allow-circular-references: true

可以使用如下方法解决循环依赖。
1、@Lazy,懒加载方式。
2、StringUtil.getBean,使用时获取实现类。

springboot扩展
在 Spring Boot 中,扩展功能可以通过多种方式实现,具体取决于你想要扩展的内容。下面是一些常见的扩展实现方式:

1. 自定义 Starter
Spring Boot Starter 是一组依赖的集合,可以通过创建自定义 Starter 来扩展 Spring Boot 的功能。

步骤:

创建一个新的 Maven 或 Gradle 项目。
在 pom.xml 或 build.gradle 中定义所需的依赖。
创建自动配置类,使用 @Configuration 注解进行标记。
使用 @ConditionalOnClass 、 @ConditionalOnMissingBean 等注解来控制自动配置的条件。
打包并发布到 Maven 仓库。
2. 自定义自动配置
通过自定义自动配置类,可以在 Spring Boot 启动时自动配置你的 Bean。

示例:

@Configuration
@EnableConfigurationProperties(MyProperties.class)
public class MyAutoConfiguration {
    
    @Bean
    @ConditionalOnMissingBean
    public MyService myService(MyProperties properties) {
        return new MyService(properties.getSomeProperty());
    }
}
  1. 使用 @Component 和 @Service
    可以通过创建自定义的组件或服务类来扩展应用的功能。

示例:

@Component
public class MyComponent {
    public void doSomething() {
        // 执行某些操作
    }
}
  1. 事件监听
    Spring Boot 支持事件驱动架构,可以通过发布和监听事件来扩展功能。
// 定义事件
public class MyEvent extends ApplicationEvent {
    public MyEvent(Object source) {
        super(source);
    }
}

// 发布事件
@Component
public class MyPublisher {
    @Autowired
    private ApplicationEventPublisher publisher;

    public void publish() {
        publisher.publishEvent(new MyEvent(this));
    }
}

// 监听事件
@Component
public class MyListener {
    @EventListener
    public void handleMyEvent(MyEvent event) {
        // 处理事件
    }
}
  1. 自定义过滤器和拦截器
    可以通过实现 Filter 或 HandlerInterceptor 接口来扩展请求处理的逻辑。

示例:

@Component
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
            throws IOException, ServletException {
        // 处理请求
        chain.doFilter(request, response);
    }
}

// 拦截器示例
@Component
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 
            throws Exception {
        // 处理请求前的逻辑
        return true;
    }
}
  1. 自定义配置属性
    可以通过定义配置属性类来集中管理应用的配置。
@ConfigurationProperties(prefix = "my")
public class MyProperties {
    private String someProperty;

    // getters and setters
}
  1. 使用 AOP(面向切面编程)
    可以通过 AOP 来对方法进行切面处理,实现横切关注点的逻辑。
@Aspect
@Component
public class MyAspect {
    @Before("execution(* com.example.service.*.*(..))")
    public void beforeMethod(JoinPoint joinPoint) {
        // 在方法执行前的逻辑
    }
}
posted @ 2021-07-09 17:12  倔强的老铁  阅读(136)  评论(0编辑  收藏  举报