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());
}
}
- 使用 @Component 和 @Service
可以通过创建自定义的组件或服务类来扩展应用的功能。
示例:
@Component
public class MyComponent {
public void doSomething() {
// 执行某些操作
}
}
- 事件监听
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) {
// 处理事件
}
}
- 自定义过滤器和拦截器
可以通过实现 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;
}
}
- 自定义配置属性
可以通过定义配置属性类来集中管理应用的配置。
@ConfigurationProperties(prefix = "my")
public class MyProperties {
private String someProperty;
// getters and setters
}
- 使用 AOP(面向切面编程)
可以通过 AOP 来对方法进行切面处理,实现横切关注点的逻辑。
@Aspect
@Component
public class MyAspect {
@Before("execution(* com.example.service.*.*(..))")
public void beforeMethod(JoinPoint joinPoint) {
// 在方法执行前的逻辑
}
}