Springboot Code 使用自定義 Starter

Springboot中自動裝配完成的功能及好處

幫我們去加載類似tomcat、redis等,還可以在實際開發中的應用一些公共的jar包(公共組件)等 。

舉個例子,比方說我們去開發一個Filter,要把這個Filter加載到應用程序中去(RegistrationBean );或者想使用一個服務,@Autowired 去注入jar裏面的一個bean,但是你直接注入是不行的,可能你需要先使用<bean/>標籤或者@Bean的註解。因爲我要把其他這個jar包的bean通過bean標籤或者註解寫入進來,就對我的代碼有了侵入,因爲假如這個jar包的名字改了,或者這麼bean我不用了(就像剛纔的filter),我除了剔除jar包,我還要修改很多依賴的代碼。也就是這樣公共包會顯得比較重。

有了自動裝配,比方說Filter,可以把filter的裝配自閉在一個jar包裏面,別人不想使用了,剔除相應jar就行。就像想使用@Autowired去注入別人bean,不需要自己寫<bean/>或者@Bean。直接@Autowired去使用就好。

簡單案例 —— 自定義Starter

先提交一個開發規範,對於包命名問題。

  • autoconfiguration:自動裝配的核心代碼。
  • starter:管理Jar。如果是Spring官方的,sping-boot-starter-xxx,如果是自定義,命名xxx-spring-boot-starter。

首先,我們做一個簡單獲取當前時間的工具類和一個filter(filter就簡單打印一個訪問時間),放在 util-spring-boot-autoconfigure

工程目錄大概如下,boot-application 依賴 starter, starter 依賴 autoconfigure:

在autoconfiguration中加入代碼:

public class DateUtil {

    public String getNowTime() {
        LocalDateTime localDate = LocalDateTime.now();
        return localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS"));
    }

}
public class MyFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        long start = System.currentTimeMillis();
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        filterChain.doFilter(servletRequest, servletResponse);
        long end = System.currentTimeMillis();
        System.out.println(request.getRequestURI() + "執行時間:" + (end - start));
    }
}

自定義DateConfig,把前面這兩個加載進來:

@Configuration
public class DateConfig {

    @Bean
    public DateUtil getDateUtil() {
        return new DateUtil();
    }

    @Bean
    public FilterRegistrationBean registerFilter() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new MyFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.setName("costFilter");
        filterRegistrationBean.setOrder(1);
        return filterRegistrationBean;
    }

}

方式一: 在spring.factories中寫入

org.springframework.boot.autoconfigure.EnableAutoConfiguration=util.spring.boot.autoconfigure.DateConfig

方式二:使用註解,核心通過實現ImportSelector

public class MyImport implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{DateConfig.class.getName()};
    }
}

自定義註解:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(MyImport.class)
public @interface EnableUtil {
}

這個時候,可以不需要再 spring.factories 中配置,但是需要在啓動類上增加修飾註解:

@SpringBootApplication
@EnableUtil
public class Start {
    public static void main(String[] args) {
        SpringApplication.run(Start.class, args);
    }
}

方式三:直接在啓動類上加@Import

@SpringBootApplication
@Import(DateConfig.class)
public class Start {
    public static void main(String[] args) {
        SpringApplication.run(Start.class, args);
    }
}

對比上面三種方式,第一種最好,因爲實現了零侵入,可插拔。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章