<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] ## 1. @EnableConfigurationProperties、ConfigurationProperties > 1. @ConfigurationProperties注解主要用來把properties配置文件轉化為bean,并交由Spring IOC容器管理 > 2. @EnableConfigurationProperties注解的作用是@ConfigurationProperties注解生效。 > 3. 如果只配置@ConfigurationProperties注解,在IOC容器中是獲取不到properties配置文件轉化的bean的 > ### 1.1 @ConfigurationProperties定義配置轉換bean 1. ApplicationContextAware:獲取Spring資源 ~~~ /** * Created by dailin on 2018/5/2. * 繼承ApplicationContextAware,重寫setApplicationContext方法, * Spring自動給這個對象注入ApplicationContext,這樣就可以操控Spring資源了 */ @Component public class ContextUtil implements ApplicationContextAware { private ApplicationContext applicationContext; @Override public void setApplicationContext(org.springframework.context.ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } public ApplicationContext getApplicationContext() { return applicationContext; } } ~~~ @ConfigurationProperties(prefix = "spring.rocketmq") prefix = "spring.rocketmq" :配置的前綴 ~~~ import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; @Data @ConfigurationProperties(prefix = "spring.rocketmq") public class MQProperties { /** * config name server address */ private String nameServerAddress; /** * config producer group , default to DPG+RANDOM UUID like DPG-fads-3143-123d-1111 */ private String producerGroup; /** * config send message timeout */ private Integer sendMsgTimeout = 3000; /** * switch of trace message consumer: send message consumer info to topic: rmq_sys_TRACE_DATA */ private Boolean traceEnabled = Boolean.TRUE; /** * switch of send message with vip channel */ private Boolean vipChannelEnabled = Boolean.TRUE; } ~~~ ### 1.2 @EnableConfigurationProperties(MQProperties.class) > 1. @EnableConfigurationProperties注解是用來開啟對@ConfigurationProperties注解配置Bean的支持。也就是@EnableConfigurationProperties注解告訴Spring Boot 使能支持@ConfigurationProperties > 2. 使得被@ConfigurationProperties標注的MQProperties.class類生成對象,也可以不指定MQProperties.class ~~~ @Configuration @ConditionalOnBean(annotation = EnableMQConfiguration.class) @AutoConfigureAfter({AbstractMQProducer.class, AbstractMQPushConsumer.class}) @EnableConfigurationProperties(MQProperties.class) // 使配置注解生效,以便下邊可以注入到這個類對象中 public class MQBaseAutoConfiguration implements ApplicationContextAware { protected MQProperties mqProperties; @Autowired public void setMqProperties(MQProperties mqProperties) { this.mqProperties = mqProperties; } protected ConfigurableApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = (ConfigurableApplicationContext) applicationContext; } } ~~~ ## 2. @ComponentScan @ComponentScan(basePackages={"net.aexit"}) pringBoot在寫啟動類的時候如果不使用@ComponentScan指明對象掃描范圍,默認指掃描當前啟動類所在的包里的對象,如果當前啟動類沒有包,則在啟動時會報錯:Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package錯誤。 因為啟動類不能直接放在main/java文件夾下,必須要建一個包把它放進去或者使用@ComponentScan指明要掃描的 例如,如果你有個類用@Controller注解標識了,那么,如果不加上@ComponentScan,自動掃描該controller,那么該Controller就不會被spring掃描到,更不會裝入spring容器中,因此你配置的這個Controller也沒有意義。 ## 3. @Configuration @Configuration相當于以前的beans標簽,@Bean相當于xml的bean標簽 > 1. 從Spring3.0,@Configuration用于定義配置類,可替換xml配置文件。 > 2. 被注解的類內部包含有一個或多個被@Bean注解的方法,這些方法將會被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext類進行掃描,并用于構建bean定義,初始化Spring容器。 > 3. 被@Configuration標注的類會被實例成對象 1. MyConfig.class ~~~ @Configuration public class MyConfig { public MyConfig(){ System.out.println("初始化MyConfig..."); } } ~~~ 2. CommonFig.class ~~~ @Configuration public class CommonFig { public CommonFig(){ System.out.println("CommonFig 初始化..."); } } ~~~ 兩個配置被實例化了 ![](images/screenshot_1525255735892.png ## 4.根據不同的條件創建bean ### 4.1 @ConditionalOnBean 1. @ConditionalOnBean起到創建bean的過濾功能,不能創建bean 2. 當容器里有指定Bean的條件下,再依靠其他注解來創建bean ~~~ @ConditionalOnBean(MyConfig.class) public class CommonFig { public CommonFig(){ System.out.println("CommonFig 初始化..."); } } ~~~ ~~~ @RequestMapping(value = "/get", method = RequestMethod.GET) @ResponseBody public CommonFig get(Model model) { CommonFig bean = contextUtil.getApplicationContext().getBean(CommonFig.class); System.out.println(bean); return bean; } ~~~ 此時沒有MyConfig對象,所以不會創建CommonFig對象,所以調用CommonFig對象的方法報錯 ~~~ org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.aixin.lovetocar.tuna.springboot.config.CommonFig' available at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:353) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:340) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1092) ~~~ 此時創建對象 ~~~ @Configuration public class MyConfig { private String configName = "tuna"; public MyConfig(){ System.out.println("初始化MyConfig..."); } ~~~ 還是報錯(還是沒有生成CommonFig對象) ~~~ org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.aixin.lovetocar.tuna.springboot.config.CommonFig' available at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:353) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:340) ~~~ 修改CommonFig,增加@Configuration注解 ~~~ @Configuration @ConditionalOnBean(MyConfig.class) public class CommonFig { public CommonFig(){ System.out.println("CommonFig 初始化..."); } } ~~~ 成功! ![](https://box.kancloud.cn/2d8792e8bb679260f3e91f723bc20fc7_1091x48.png) **說明@ConditionalOnBean注解起到過濾的作用,不會生成bean;而@Configuration可以生成bean** #### annotation //當有這個注解所標識的bean生成時,才創建bean ~~~ @Configuration @ConditionalOnBean(annotation = TestAnnotation.class) public class CommonFig2 { public CommonFig2(){ System.out.println("CommonFig2 初始化..."); } } ~~~ 報錯,沒有這個bean ~~~ org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.aixin.lovetocar.tuna.springboot.config.CommonFig2' available at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:353) ~~~ **添加這個依賴的注解** ~~~ @TestAnnotation public class AnnotationTest { } ~~~ 還是報錯么有創建對象 修改AnnotationTest,讓他成為bean ~~~ @TestAnnotation @Component public class AnnotationTest { } ~~~ 成功了 ~~~ com.aixin.lovetocar.tuna.springboot.config.CommonFig2$$EnhancerBySpringCGLIB$$a5e55e1e@4c4643b4 ~~~ ![](https://box.kancloud.cn/d287e120ce0256ceebc338c4fa7ac175_1180x168.png) 除了自己自定義Condition之外,Spring還提供了很多Condition給我們用 @ConditionalOnBean(僅僅在當前上下文中存在某個對象時,才會實例化一個Bean) @ConditionalOnClass(某個class位于類路徑上,才會實例化一個Bean) @ConditionalOnExpression(當表達式為true的時候,才會實例化一個Bean) @ConditionalOnMissingBean(僅僅在當前上下文中不存在某個對象時,才會實例化一個Bean) @ConditionalOnMissingClass(某個class類路徑上不存在的時候,才會實例化一個Bean) @ConditionalOnNotWebApplication(不是web應用) ## 5. @SpringBootApplication 包掃描規則 掃描 與@SpringBootApplication所在包同級及其子集下的所有包。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看