1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        徒手?jǐn)]了一個(gè)starter,同事直夸我666~

        共 6821字,需瀏覽 14分鐘

         ·

        2021-06-05 14:32


        點(diǎn)擊上方 Java旅途,選擇 設(shè)為星標(biāo)

        優(yōu)質(zhì)文章,每日送達(dá)



        大家好,我是大堯!

        Spring Boot starter原理

        Spring Boot 將常見(jiàn)的開(kāi)發(fā)功能,分成了一個(gè)個(gè)的starter,這樣我們開(kāi)發(fā)功能的時(shí)候只需要引入對(duì)應(yīng)的starter,而不需要去引入一堆依賴了!starter可以理解為一個(gè)依賴組,其主要功能就是完成引入依賴初始化配置。Spring 官方提供的starter 命名規(guī)范為 spring-boot-starter-xxx ,第三方提供的starter命名規(guī)范為 xxx-spring-boot-starter 。

        這里我們以 RocketMQ 的依賴 rocketmq-spring-boot-starter 來(lái)學(xué)習(xí) starter的原理。

        在項(xiàng)目中引入 rocketmq-spring-boot-starter 之后,實(shí)際上就引入了 rocketmq 的一些相關(guān)依賴。

        rocketmq-spring-boot 中有一個(gè)自動(dòng)裝配的類RocketMQAutoConfiguration ,我截取了其中的一小段代碼,一起來(lái)看看。

        @Configuration
        @EnableConfigurationProperties(RocketMQProperties.class)
        @ConditionalOnClass(
        {MQAdmin.class})
        @ConditionalOnProperty(prefix 
        "rocketmq", value = "name-server", matchIfMissing = true)
        @Import({MessageConverterConfiguration.classListenerContainerConfiguration.classExtProducerResetConfiguration.classRocketMQTransactionConfiguration.class})
        @AutoConfigureAfter(
        {MessageConverterConfiguration.class})
        @AutoConfigureBefore(
        {RocketMQTransactionConfiguration.class})

        public class RocketMQAutoConfiguration 
        {
            private static final Logger log = LoggerFactory.getLogger(RocketMQAutoConfiguration.class);

            public static final String ROCKETMQ_TEMPLATE_DEFAULT_GLOBAL_NAME =
                "rocketMQTemplate";

            @Autowired
            private Environment environment;

            @Bean(destroyMethod = "destroy")
            @ConditionalOnBean(DefaultMQProducer.class)
            @ConditionalOnMissingBean(name 
        = ROCKETMQ_TEMPLATE_DEFAULT_GLOBAL_NAME)
            public RocketMQTemplate rocketMQTemplate(DefaultMQProducer mqProducer,
                RocketMQMessageConverter rocketMQMessageConverter)
         
        {
                RocketMQTemplate rocketMQTemplate = new RocketMQTemplate();
                rocketMQTemplate.setProducer(mqProducer);
                rocketMQTemplate.setMessageConverter(rocketMQMessageConverter.getMessageConverter());
                return rocketMQTemplate;
            }
        }
        • @Configuration 說(shuō)明這是一個(gè)配置類,類中被@Bean注解了的方法,就是spring的一個(gè)bean,例如rocketMQTemplate。
        • @EnableConfigurationProperties,啟用被@ConfigurationProperties的bean,這里引入了 RocketMQProperties 。

        RocketMQProperties 就是需要在yml文件中寫入的屬性。

        @ConfigurationProperties(prefix = "rocketmq")
        public class RocketMQProperties {

            private String nameServer;

            private String accessChannel;

            private Producer producer;

            private Consumer consumer = new Consumer();
        }

        在Spring Boot項(xiàng)目啟動(dòng)的時(shí)候默認(rèn)只會(huì)掃描下級(jí)目錄下帶 @Configuration 注解的類,那么像本文中提到的 RocketMQAutoConfiguration 是如何掃描的呢?其實(shí)項(xiàng)目啟動(dòng)的時(shí)候會(huì)去加載項(xiàng)目中所有的 spring.factories 文件,然后加載對(duì)應(yīng)的配置類,因此我們就需要在 spring.factories 中只指定需要掃描的類。

        原理搞明白了,接下來(lái)我們就簡(jiǎn)單實(shí)現(xiàn)一個(gè)自己的starter!這個(gè)starter的主要作用就是給一個(gè)對(duì)象尾部拼接一個(gè)字符串!

        一、新建項(xiàng)目

        新建一個(gè)名為 javatip-spring-boot-starter 的項(xiàng)目,并且引入下面的依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        二、新增配置類

        配置類對(duì)應(yīng)的properties文件中的屬性為javatip.name;

        @ConfigurationProperties(prefix = "javatip")
        public class JavatipPorperties {

            private String name;

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }
        }

        三、新增拼接字符串的方法

        此方法主要就是為對(duì)象拼接一個(gè)固定的字符串

        public class StrUt {

            private String name;

            public String strTo(Object object){

                return object +"---"+ getName();
            }

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }
        }

        四、新增自動(dòng)配置類

        使用注解 @EnableConfigurationProperties 啟用 JavatipProperties 配置類

        使用注解 @Configuration 配合 @Bean 注冊(cè)一個(gè)拼接字符串的bean對(duì)象。

        @Configuration
        @EnableConfigurationProperties(JavatipPorperties.class)
        public class JavatipAutoConfiguration 
        {

            @Autowired
            private JavatipPorperties javatipPorperties;

            @Bean
            public StrUt strut(){
                StrUt strut = new StrUt();
                strut.setName(javatipPorperties.getName());
                return strut;
            }
        }

        五、新增配置發(fā)現(xiàn)文件

        在resources文件夾中新建 META-INF 文件夾,在 META-INF 文件夾中新建配置發(fā)現(xiàn)文件 spring.factories,并且將自動(dòng)配置類寫到文件里。

        org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.javatip.str.configuration.JavatipAutoConfiguration

        六、打包測(cè)試

        使用 mvn install 命令將項(xiàng)目打包推送到本地maven倉(cāng)庫(kù),然后新建一個(gè)測(cè)試項(xiàng)目,引入打包好的依賴。

        <dependency>
            <groupId>com.javatip</groupId>
            <artifactId>javatip-spring-boot-starter</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        application.yml 文件中寫入自動(dòng)拼接的字符串對(duì)應(yīng)的屬性 javatip.name 。

        javatip:
          name: Java旅途

        然后手寫一個(gè)測(cè)試類:

        @RestController
        public class Test {
            
            @Autowired
            private StrUt strUt;

            @GetMapping("test")
            public String test(){

                String str = strUt.strTo("who are you?");
                return str;
            }
        }

        運(yùn)行測(cè)試類后,頁(yè)面返回了

        who are you?---Java旅途

        這樣,一個(gè)簡(jiǎn)單的starter就寫好了,只要理解了starter的原理,實(shí)現(xiàn)起來(lái)就很簡(jiǎn)單,第一點(diǎn)就是starter相當(dāng)于一個(gè)依賴組,另一點(diǎn)就是starter可以完成初始化配置。

        < END >


        往期精選:

        阿里巴巴常用的15款開(kāi)發(fā)者工具,值得推薦

        大佬們是怎樣學(xué)習(xí)的

        別再糾結(jié)線程池大小/線程數(shù)量了,沒(méi)有固定公式的

        一個(gè)yml文件居然能玩出這么多花樣!


        點(diǎn)個(gè)在看 

        瀏覽 73
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            亚洲福利一区二区三区 | 天天干天天操综合 | 国产 精品 无码 怀孕软件 | 少妇被猛烈挺进爽爽视频 | 国产精品pans嫩模写真 | 中文字幕无码在线观看视频 | 国产久久精品 | 色av综合网站 | 天天射天天看天天操天天 | 97国内揄拍国内精品对白 |