SpringBoot-配置文件创建Bean的过程

以添加一个媒体类型给日志记录为例
ygo.log.visible-content-type:application/test,application/test2

1、创建属性文件

/**
 * 日志属性配置
 *
 * @author jacksony
 * @since 1.2.0
 */
@Configuration
@ConfigurationProperties(prefix = "ygo.log")
public class LoggingProperties {

    /**
     * 可见的的contentType,多个以逗号分隔
     */
    @Getter
    @Setter
    private String visibleContentType;
}

2、创建需要为bean的门面类

/**
 * 可见的contentType门面
 *
 * @author jacksony
 * @since 1.0.2
 */
public class VisibleContentTypeFacade {

    @Getter(AccessLevel.PRIVATE)
    private List<MediaType> mediaTypes;

    public VisibleContentTypeFacade(String visibleContentType) {
        mediaTypes = new ArrayList<>();
        mediaTypes.addAll(VisibleContentType.defaultMediaTypes());
        addMediaTypeFrom(visibleContentType);
    }

    private void addMediaTypeFrom(String visibleContentType) {
        if (SGStringUtils.isBlank(visibleContentType)) {
            return;
        }

        String[] visibleContentTypes = visibleContentType.split(",");
        for (String contentType : visibleContentTypes) {
            mediaTypes.add(MediaType.valueOf(contentType));
        }
    }

    /**
     * 判断request.contentType是否为允许的MediaType类型
     * 如果是get类型则没有contentType
     * 如果是单元测试可能走Exception分支
     *
     * @param request http请求
     * @return true or false
     */
    public boolean isContentTypeVisible(HttpServletRequest request) {
        try {
            if (request == null || request.getContentType() == null) {
                return true;
            }
            return isContentTypeVisible(MediaType.valueOf(request.getContentType()));
        } catch (Exception ex) {
            return false;
        }
    }

    /**
     * 判断contentType是否为允许的MediaType类型
     * 如果是get类型则没有contentType
     * 如果是单元测试可能走Exception分支
     *
     * @param mediaType MediaType类型的contentType
     * @return true or false
     */
    public boolean isContentTypeVisible(MediaType mediaType) {
        boolean visible = false;
        for (MediaType type : getMediaTypes()) {
            if (type.includes(mediaType)) {
                visible = true;
            }
        }
        return visible;
    }
}

3、创建配置文件
创建门面类VisibleContentTypeFacade 的bean

/**
 * 日志配置
 *
 * @author jacksony
 * @since 1.2.0
 */
@Configuration
public class LoggingConfiguration {

    /**
     * 可见ContentType门面类
     * @param loggingProperties 日志配置属性
     * @return 可见ContentType门面类
     */
    @Bean
    public VisibleContentTypeFacade visibleContentTypeFacade(LoggingProperties loggingProperties) {
        return new VisibleContentTypeFacade(loggingProperties.getVisibleContentType());
    }
}

4、实际应用

@Autowired
public VisibleContentTypeFacade visibleContentTypeFacade;

//函数里面调用
val mediaType = MediaType.valueOf(response.getContentType() == null ? MediaType.ALL_VALUE :
                response.getContentType());
boolean visible = visibleContentTypeFacade.isContentTypeVisible(mediaType);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!以下是一个简单的示例,展示了如何手写一个Spring Boot Starter: 首先,创建一个 Maven 项目,并添加以下依赖项: ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.5.4</version> </dependency> </dependencies> ``` 接下来,创建一个自定义的自动配置类,用于配置你的 Starter: ```java @Configuration @EnableConfigurationProperties(MyStarterProperties.class) public class MyStarterAutoConfiguration { private final MyStarterProperties properties; public MyStarterAutoConfiguration(MyStarterProperties properties) { this.properties = properties; } // 在此处定义你的自动配置逻辑 @Bean public MyStarterService myStarterService() { return new MyStarterService(properties); } } ``` 然后,创建一个属性类,用于将外部配置绑定到属性上: ```java @ConfigurationProperties("my.starter") public class MyStarterProperties { private String message; // 提供 getter 和 setter } ``` 最后,创建一个自定义的服务类,该服务类将在你的 Starter 中使用: ```java public class MyStarterService { private final MyStarterProperties properties; public MyStarterService(MyStarterProperties properties) { this.properties = properties; } public void showMessage() { System.out.println(properties.getMessage()); } } ``` 现在,你的 Spring Boot Starter 已经准备就绪了!你可以将其打包并使用在其他 Spring Boot 项目中。在其他项目的 `pom.xml` 文件中,添加你的 Starter 依赖: ```xml <dependencies> <dependency> <groupId>com.example</groupId> <artifactId>my-starter</artifactId> <version>1.0.0</version> </dependency> </dependencies> ``` 然后,在你的应用程序中使用 `MyStarterService`: ```java @SpringBootApplication public class MyApplication implements CommandLineRunner { private final MyStarterService myStarterService; public MyApplication(MyStarterService myStarterService) { this.myStarterService = myStarterService; } public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } @Override public void run(String... args) throws Exception { myStarterService.showMessage(); } } ``` 这样,你就成功地创建了一个简单的 Spring Boot Starter!当其他项目引入你的 Starter 并运行时,将会输出预定义的消息。 当然,这只是一个简单的示例,真实的 Starter 可能包含更多的配置和功能。你可以根据自己的需求进行扩展和定制。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值