1. 程式人生 > 資訊 >晶瑩透亮 / 香甜可口,正泓琥珀核桃仁 1 斤 19.99 元

晶瑩透亮 / 香甜可口,正泓琥珀核桃仁 1 斤 19.99 元

SpringBoot-WD版本

Properties或者yml配置檔案中的值和元件之間屬性的關聯。

  1. 需要全部的名稱,直接是在屬性上面@Value("${hello.controller.content}").

        //@Value("${demo.druid.driver}")
        String driver;
    
  2. @ConfigurationProperties 放在類上,其實就是把這個類變成了弄屬性的類了。

    @ConfigurationProperties(prefix = "demo.druid")
    
    • 如果需要在yml中寫配置的時候有提示,需要加入這個依賴。
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <optional>true</optional>
            </dependency>
    
    • 屬性中其他資料型別的在yml中的賦值問題。

      Properties中的寫法:
      #list的兩種寫法
      my.file.list1=data1,data2,data3
      my.file.list2[0]=data1
      my.file.list2[1]=data2
      my.file.list2[2]=data3
      
      #map的兩種寫法
      my.file.map1.key1=value1
      my.file.map1.key2=value2
      my.file.map1.key3=value3
      
      my.file.map2[key1]=value1
      my.file.map2[key2]=value2
      my.file.map2[key3]=value3
      
      #javabean → 和map是一樣的
      my.file.file-detail.param1=songge
      my.file.file-detail.param2=18
      #my.file.file-detail[param1]=songge
      #my.file.file-detail[param2]=18
      
      
      元件在中的屬性問題。
      @Data
      @Component
      @ConfigurationProperties(prefix = "my.file")
      public class FileProperties {
          String basePath; //d:/spring/file/
          String jpgPath;//d:/spring/file/jpg/
          String pngPath;//d:/spring/file/png/
          String xmlPath;//d:/spring/file/xml/
      
          Integer maxFile;
          boolean saved;
      
          List list1;
          List list2;
      
          Map map1;
          Map map2;
          FileDetail fileDetail;
      }
      
    • 配置中的引用問題

      my:
        file:
          base-path: e:/springx/file/
          jpg-path: ${my.file.base-path}jpg/
          png-path: ${my.file.base-path}png/
          xml-path: ${my.file.base-path}xml/
      
  3. @ConfigurationProperties(prefix="demo1.druid")直接標註在配置類上。使屬性和properties中的屬性值是直接關聯的。在需要用的地方,直接是@EnableConfigurationProperties(FileProperties.class)。就可以把這個類引進來。

    配置類:
    @Data
    @ConfigurationProperties(prefix = "demo1.druid")
    public class FileProperties {
        String basePath; //d:/spring/file/
        String jpgPath;//d:/spring/file/jpg/
        String pngPath;//d:/spring/file/png/
        String xmlPath;//d:/spring/file/xml/
        String driver;
        String url;
        String username;
        String password;
        Integer maxFile;
        boolean saved;
        List list1;
        List list2;
        Map map1;
        Map map2;
        FileDetail fileDetail;
    }
    
    
    載入的配置類:
    @Data
    @Configuration
    @EnableConfigurationProperties(FileProperties.class)
    public class DruidConfig {
        FileProperties fileProperties;
        public DruidConfig(FileProperties fileProperties) {
            this.fileProperties = fileProperties;
        }
        //@Value("${demo.druid.driver}")
    
        @Bean
        public DataSource dataSource() {
            DruidDataSource dataSource = new DruidDataSource();
            dataSource.setDriverClassName(fileProperties.driver);
            dataSource.setUrl(fileProperties.url);
            dataSource.setUsername(fileProperties.username);
            dataSource.setPassword(fileProperties.password);
            return dataSource;
        }
    }
    

多個配置檔案協調

  • 如下在yml中,也可以寫在不同的配置檔案中,不同的配置檔案中的名字,application-beta.yml。

    啟用:spring.profiles.active

    spring:
      profiles:
        active: alpha,context
    ---
    #spring.profiles作為key指定配置檔案的名字
    spring:
      profiles: alpha
    server:
      port: 8081
    
    ---
    spring:
      profiles: beta
    server:
      port: 8082
    ---
    spring:
      profiles: dev
    server:
      port: 8083
    
    ---
    spring:
      profiles: context
    server:
      servlet:
        context-path: /demo2
    
  • 引入額外的properties檔案:@PropertySource(value="classpath:db.properties")

  • 引入額外的spring配置檔案:@ImportResource(value="classpath:beans.xml")

springboot的配置問題

主要是約定大於配置:

@ConditionalOn 當滿足條件時其他註解生效

@ConditionalOnMissing 當缺少條件時,其他註解生效

//@EnableWebMvc  //意味著全面接管SpringMVC的配置,也就是說配置檔案是無效的
@Configuration   //做的是補充,他是和配置檔案是結合的。

SpringBoot的註解拓展

  1. @SpringBootApplication
    作用:預設掃描啟動類所在的包下的所有層級的子包。
    可以拆分為三個,並且制定掃描的包:
    @SpringBootConfiguration

    @EnableAutoConfiguration
    
    @ComponentScan(basePackages = "com.msb")
    
@SpringBootApplication
public class Springboot04Application {
    public static void main(String[] args) {
        //返回一個spring容器
        ConfigurableApplicationContext context = SpringApplication.run(Springboot04Application.class, args);
        // 檢視所有元件的名
        String[] names = context.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }
}
  1. @Configuration

如果你在一個類上寫好了@component那麼這個類自動注入到容器中,並且是以空構造器的方式注入裡面。
但是還有一種就是通過配置類的方式。@Configuration 就是註明這個類就是配置類。

但是他標註的配置類,對於容器中注入bean的方式是有區別的。

/**
 * @Author: Ma HaiYang
 * @Description: MircoMessage:Mark_7001
 * MyConfig配置類本身也是一個spring容器中的bean
 * proxyBeanMethods=true 屬性,給MyConfig物件產生一個代理物件
 * 通過代理物件控制反覆呼叫MyConfig裡面的方法返回的是容器中的一個單例項
 * 如果proxyBeanMethods=false 那麼我們拿到的MyConfig物件就不是一個代理物件
 * 那麼這個時候反覆呼叫MyConfig中的方法返回的就是多例項
 *
 * proxyBeanMethods=false 稱之為Lite模式  特點啟動快
 * proxyBeanMethods=true  稱之為Full模式  特點依賴spring容器控制bean單例
 *
 */
@Configuration(proxyBeanMethods = true)
public class MyConfig {
    /*<bean id = "user1" class ="com.msb.pojo.User">... ...</bean>*/
    @Bean // 向容器中新增一個Bean,以方法名作為Bean的id,返回值型別作為元件的型別
    public User user1(){
        return new User("zhangsan", 10);
    }
    /*<bean id = "user2" class ="com.msb.pojo.User">... ...</bean>*/
    @Bean("user2") // 向容器中新增一個Bean,手動指定Bean的name屬性,返回值型別作為元件的型別
    public User getUser(){
        return new User("lisi", 11);
    }
}


測試部分:
@SpringBootApplication(scanBasePackages = "com.msb")
public class Springboot04Application {
    public static void main(String[] args) {
        //返回一個spring容器
        ConfigurableApplicationContext context = SpringApplication.run(Springboot04Application.class, args);
      
        System.out.println(context.getBean("user1"));
        System.out.println(context.getBean("user2"));
        User usera = context.getBean(MyConfig.class).getUser();
        User userb = context.getBean(MyConfig.class).getUser();
        System.out.println(usera==userb);
    }
}

總結:proxyBeanMethods=true的話,那麼下面的獲取部分,usera和userb是同一個例項。
    proxyBeanMethods=false的話,那usera和userb的獲取的不是同一個例項。


  1. @Import

    感覺這個註解是有點多餘啊,其實就是把類放入到容器裡面啊。明明@component就可以把類放入到容器裡,還需要這個幹嗎呢

    /*
    * @Import({User.class}) 在容器中自動建立Bean的註解
    * 通過傳入位元組碼,預設呼叫bean的無參構造器,向容器中存放一個Bean
    * 預設元件的名字就是類的全路徑名
    * @Import只要放到可以被掃描到的類之上就可以,不必非得是配置類或者Controller
    * */
    @Import({User.class})
    @Configuration(proxyBeanMethods = true)
    public class MyConfig {
    }
    
  2. @Conditional 條件裝配

    @Bean("user2")
    @ConditionalOnProperty(name = "aaa.b", havingValue = "y")
    public User getUser() {
        return new User(2, "lisi");
    }
//上面的這個的意思是,必須在yml彙總有aaa.b=y這麼個配置,才會注入user2到容器裡面。
//下面這個的意思是,容器裡必須有一個bean他的名字是user2才會把person注入到容器裡面。
    @Bean
    @ConditionalOnBean(name = "user2")
    public Person person() {
        return new Person(25, 175);
    }
  1. @ImportResource

    可以把原生的配置檔案中的bean,接入到我們的容器裡面。

    bean.xml檔案中的bean,弄到config檔案裡。

    @Configuration
    @ImportResource("classpath:beans.xml")
    public class MyConfig {
    }
    
    1. @ConfigurationProperties 把配置檔案中的值,弄到bean裡面來。

      • 方式一

        /*prefix字首,為配置檔案中對應的字首
        * 通過字首找到對應的配置資訊後,在根據屬性名去注入匹配的資料*/
        @ConfigurationProperties( prefix = "user")
        @Component
        public class User {
            private String uname;
            private int age;
        }
        
      • 方式二

        @ConfigurationProperties( prefix = "user")
        public class User {
            private String uname;
            private int age;
        }
        
        在類上注入值,但是在配置類上把這個bean注入
        @Configuration
        /*開啟了User的屬性自動配置功能並把User自動註冊到容器中
        * 這個時候,我們的User上就不用加@Component註解了
        * 適用於Bean來自於第三方JAR場景
        * */
        @EnableConfigurationProperties(User.class)
        public class MyConfig {
        }