Spring Boot是一个开源的Java框架,它简化了基于Spring的应用程序的开发和部署。它提供了许多强大的特性和扩展接口,下面是16个常用的Spring Boot扩展接口的介绍:
💡CommandLineRunner
这个接口可以用来在Spring Boot应用程序启动时执行一些代码。你可以实现它来做一些初始化的工作或者其他需要在应用启动时执行的任务。
@Component
public class MyCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("Spring Boot应用程序启动时执行的代码");
// 在这里可以做一些初始化的工作或其他需要在启动时执行的任务
}
}
💡ApplicationRunner
与CommandLineRunner类似,这个接口可以在Spring Boot应用程序启动时执行一些代码。不同的是,它提供了更加灵活的方法参数,可以访问Spring应用程序上下文和应用程序参数。
@Component
public class MyApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("Spring Boot应用程序启动时执行的代码");
// 在这里可以访问Spring应用程序上下文和应用程序参数,并做一些初始化的工作
}
}
💡ServletContextInitializer
这个接口提供了一种初始化ServletContext的机制。你可以使用它来添加Servlet、Filter、Listener等到ServletContext中。
@Configuration
public class MyServletContextInitializer implements ServletContextInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
// 添加Servlet
servletContext.addServlet("myServlet", new MyServlet()).addMapping("/myservlet");
// 添加Filter
servletContext.addFilter("myFilter", new MyFilter()).addMappingForUrlPatterns(null, false, "/myfilter/*");
// 添加Listener
servletContext.addListener(new MyListener());
}
}
💡FilterRegistrationBean
这个类是Spring Boot对Filter的封装,你可以使用它来注册Filter,并设置Filter的顺序、URL匹配等。
@Configuration
public class MyFilterConfiguration {
@Bean
public FilterRegistrationBean<MyFilter> myFilterRegistration() {
FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new MyFilter());
registration.addUrlPatterns("/myfilter/*");
registration.setOrder(1);
return registration;
}
}
💡ServletRegistrationBean
这个类是Spring Boot对Servlet的封装,你可以使用它来注册Servlet,并设置Servlet的URL路径、加载顺序等。
@Configuration
public class MyServletConfiguration {
@Bean
public ServletRegistrationBean<MyServlet> myServletRegistration() {
ServletRegistrationBean<MyServlet> registration = new ServletRegistrationBean<>();
registration.setServlet(new MyServlet());
registration.addUrlMappings("/myservlet");
registration.setLoadOnStartup(1);
return registration;
}
}
💡HealthIndicator
这个接口用于定义应用程序的健康检查。你可以实现自定义的健康检查逻辑,并通过HTTP接口暴露给监控系统。
@Component
public class MyHealthIndicator implements HealthIndicator {
@Override
public Health health() {
// 自定义健康检查逻辑
if (isHealth()) {
return Health.up().build();
} else {
return Health.down().withDetail("Error", "Something went wrong").build();
}
}
private boolean isHealth() {
// 检查应用程序的健康状态,并返回相应的健康信息
return true; // 健康
}
}
💡MetricsExporter
这个接口用于导出应用程序的指标数据。你可以实现自定义的MetricsExporter接口,并将指标数据导出到各种监控系统。
@Component
public class MyMetricsExporter implements MetricsExporter {
@Override
public Map<String, Object> export() {
// 导出应用程序的指标数据
Map<String, Object> metrics = new HashMap<>();
metrics.put("metric1", getMetric1());
metrics.put("metric2", getMetric2());
// ...
return metrics;
}
private int getMetric1() {
// 获取指标数据1
return 100;
}
private float getMetric2() {
// 获取指标数据2
return 3.14f;
}
}
💡WebMvcConfigurer
这个接口用于配置Spring MVC的行为。你可以通过实现它来配置拦截器、消息转换器、视图解析器等。
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 添加拦截器
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/api/**");
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 配置消息转换器
converters.add(new MyMessageConverter());
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
// 配置视图解析器
registry.jsp("/WEB-INF/views/", ".jsp");
}
}
💡WebSecurityConfigurer
这个接口用于配置Spring Security的行为。你可以通过实现它来配置认证、授权、安全过滤器等。
@Configuration
@EnableWebSecurity
public class MyWebSecurityConfigurer extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// 配置安全规则
http.authorizeRequests()
.antMatchers("/api/admin/**").hasRole("ADMIN")
.antMatchers("/api/user/**").hasAnyRole("ADMIN", "USER")
.anyRequest().permitAll()
.and().formLogin().permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws
💡CommandLinePropertySource
这个接口用于从命令行参数中加载属性。你可以实现它来自定义命令行参数的解析和加载逻辑。
🌵1.实现PropertySource接口
public class CommandLinePropertySource extends PropertySource<String> {
public CommandLinePropertySource(String name, Map<String, Object> source) {
super(name, source);
}
@Override
public Object getProperty(String name) {
return this.source.get(name);
}
}
🌵2.实现EnvironmentPostProcessor接口
@Component
public class CustomEnvironmentPostProcessor implements EnvironmentPostProcessor {
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
Map<String, Object> map = new HashMap<>();
map.put("custom.property", "value");
environment.getPropertySources().addFirst(
new CommandLinePropertySource("customCommandLineProperties", map));
}
}
🌵3.通过@Value注入使用
@Component
public class MyBean {
@Value("${custom.property}")
private String customProperty;
//...
}
💡DataSourceInitializer
这个接口用于初始化数据库。你可以实现它来执行数据库脚本,创建表结构等。
🌵1.实现DataSourceInitializer接口
public class CustomDataSourceInitializer implements DataSourceInitializer {
@Override
public void initialize(DataSource ds) {
// 调用DataSource的初始化方法
ds.getConnection();
}
}
🌵2.在配置类中指定DataSourceInitializer
@Configuration
public class DataSourceConfig {
@Bean
public DataSourceInitializer dataSourceInitializer() {
return new CustomDataSourceInitializer();
}
}
🌵3.添加初始化的DataSource
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource() {
// 初始化和配置DataSource bean
}
}
这样Spring Boot在启动时会自动调用CustomDataSourceInitializer来初始化配置好的DataSource。
主要步骤是实现DataSourceInitializer接口,并在配置类中定义该bean,同时添加需要初始化的DataSource bean。
这样可以自定义DataSource的初始化逻辑,比如提前获取连接来验证连接信息等。
💡JmsListenerConfigurer
这个接口用于配置JMS消息监听器。你可以通过实现它来设置目的地、消息转换器等。
这是一个使用JmsListenerConfigurer来自定义JMS监听器配置的示例:
🌵1.实现JmsListenerConfigurer接口
@Component
public class CustomJmsListenerConfigurer implements JmsListenerConfigurer {
@Override
public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {
// 自定义注册JMS监听器
}
}
🌵2.注册JMS监听器
@Configuration
public class JmsConfig {
@Bean
public JmsListenerContainerFactory<?> factory(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
return factory;
}
@Bean
public JmsListenerEndpointRegistrar registrar() {
return new JmsListenerEndpointRegistrar();
}
}
🌵3.实现JMS监听器
public class MyJmsListener {
@JmsListener(destination = "someQueue")
public void onMessage(String msg) {
// handle message
}
}
通过JmsListenerConfigurer,我们可以全局定制JMS监听器的配置,比如设置concurrency、异常handler等。
主要步骤是实现JmsListenerConfigurer接口,并注入JmsListenerEndpointRegistrar bean。
💡OAuth2AuthorizationRequestResolver
这个接口用于解析OAuth2的授权请求。你可以实现它来处理授权请求的逻辑。
以下是使用OAuth2AuthorizationRequestResolver接口来自定义OAuth2客户端的授权请求处理过程的一个示例:
🌵1.创建授权请求处理器
public class CustomRequestResolver implements OAuth2AuthorizationRequestResolver {
@Override
public OAuth2AuthorizationRequest resolve(HttpServletRequest request) {
// 解析和处理授权请求
return authRequest;
}
}
🌵2.在配置类中声明处理器
@Configuration
@EnableOAuth2Client
public class OAuth2Config {
@Bean
public OAuth2AuthorizationRequestResolver authorizationRequestResolver() {
return new CustomRequestResolver();
}
}
🌵3.使用授权客户端
@RestController
public class TestController {
@Autowired
OAuth2AuthorizedClientService clientService;
@GetMapping("/users")
public String getUsers() {
// 使用授权客户端请求用户资源
}
}
主要思路是通过自定义的OAuth2AuthorizationRequestResolver解析授权请求,在授权完成后生成授权客户端保存到容器中。
这样可以自定义授权流程的相关处理,扩展OAuth2客户端的功能。
💡WebSocketMessageBrokerConfigurer
这个接口用于配置WebSocket消息代理。你可以通过实现它来配置消息代理、消息处理器等。
这里是一个使用WebSocketMessageBrokerConfigurer来自定义WebSocket消息代理的配置示例:
🌵1.实现WebSocketMessageBrokerConfigurer
@Configuration
public class CustomWebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
// 配置消息代理
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
// 注册STOMP端点
}
}
🌵2.添加处理器
@Configuration
public class WebSocketConfig {
@Bean
public CustomWebSocketConfig webSocketConfig() {
return new CustomWebSocketConfig();
}
}
🌵3.编写WebSocket服务
@Controller
public class WebSocketController {
@MessageMapping("/chat")
public void handleChat(Message msg) {
// 处理WebSocket请求
}
}
通过实现WebSocketMessageBrokerConfigurer接口,我们可以自定义消息代理的路由路径、 STOMP端点、消息处理器等配置。
这可以根据具体需求调整WebSocket消息流转相关的设置。
💡EmbeddedServletContainerCustomizer
这个接口用于自定义嵌入式Servlet容器。你可以通过实现它来配置Servlet容器的行为、监听器、Servlet等。
这里是一个使用EmbeddedServletContainerCustomizer接口来自定义嵌入式Servlet容器的示例:
🌵1.实现EmbeddedServletContainerCustomizer
@Component
public class CustomContainerCustomizer
implements EmbeddedServletContainerCustomizer {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.setPort(8888);
}
}
🌵2.添加定制器组件
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
🌵3.修改容器配置
server.port=8080
在应用启动时,CustomContainerCustomizer会被回调来修改容器的配置。
这里通过setPort方法将端口改为了8888,覆盖了配置文件中的8080端口。
通过实现该接口,可以根据需求修改容器的相关配置,如端口、上下文路径等。
💡CacheManagerCustomizer
这个接口用于定制缓存管理器。你可以通过实现它来配置缓存的行为、缓存策略等。
这里是一个使用CacheManagerCustomizer接口来自定义Spring Cache的示例:
🌵1.实现CacheManagerCustomizer
@Configuration
public class CustomCacheConfig implements CacheManagerCustomizer<ConcurrentMapCacheManager> {
@Override
public void customize(ConcurrentMapCacheManager cacheManager) {
cacheManager.setCacheNames(Collections.singleton("customCache"));
}
}
🌵2.声明缓存管理器
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public ConcurrentMapCacheManager cacheManager() {
return new ConcurrentMapCacheManager();
}
}
🌵3.使用自定义的缓存
@Cacheable("customCache")
public User findUser(String username) {
// ...
}
通过CacheManagerCustomizer,我们可以自定义ConcurrentMapCacheManager的配置,如缓存名称、过期规则等。
主要步骤是实现接口,并声明需要自定义的缓存管理器bean。
这样可以根据需要调整Spring Cache的缓存行为。