Qing 1 year ago
parent
commit
26fea081a8

+ 14 - 5
springboot-demo/src/main/java/com/sf/config/MyAutoConfig.java

@@ -3,12 +3,16 @@ package com.sf.config;
 import com.sf.bean.Computer;
 import com.sf.config.other.OtherAutoConfig1;
 import com.sf.config.other.OtherAutoConfig2;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.context.annotation.ImportCandidates;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
 import org.springframework.context.annotation.ImportSelector;
 import org.springframework.core.io.support.SpringFactoriesLoader;
 import org.springframework.core.type.AnnotationMetadata;
+import org.springframework.util.StringUtils;
 
 import java.util.List;
 
@@ -29,11 +33,16 @@ public class MyAutoConfig {
         public String[] selectImports(AnnotationMetadata importingClassMetadata) {
             // 加载我们编写的spring.factories文件
             // com.sf.config.MyAutoConfig$MyImportSelector=\
-            //  com.sf.config.MyAutoConfig.OtherAutoConfig1,\
-            //  com.sf.config.MyAutoConfig.OtherAutoConfig2
-            List<String> factoryNames = SpringFactoriesLoader.
-                    loadFactoryNames(MyImportSelector.class, null);
-            return factoryNames.toArray(new String[0]);
+            //  com.sf.config.MyAutoConfig.OtherAutoConfig1,com.sf.config.MyAutoConfig.OtherAutoConfig2
+//            List<String> factoryNames = SpringFactoriesLoader.loadFactoryNames(MyImportSelector.class, null);
+            List<String> factoryNames = ImportCandidates.load(MyImportSelector.class, null).getCandidates();
+            List<String> configurations = ImportCandidates.load(AutoConfiguration.class, null).getCandidates();
+            System.out.println(">>>>>>>>>>>>>>>>>");
+            configurations.forEach(System.out::println);
+            System.out.println(">>>>>>>>>>>>>>>>>");
+//            List<String> factoryNamesAuto = SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class, null);
+//            return factoryNames.toArray(new String[0]);
+            return StringUtils.toStringArray(factoryNames);
         }
     }
 

+ 20 - 0
springboot-demo/src/main/java/com/sf/config/VegetablesYamlConfig.java

@@ -0,0 +1,20 @@
+package com.sf.config;
+
+import com.sf.config.factory.YamlPropertySourceFactory;
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+
+@Data
+@Configuration
+@ConfigurationProperties(prefix = "vegetablesbak")
+@PropertySource(value = "classpath:config/vegetablesBak.yml",
+        factory = YamlPropertySourceFactory.class)
+public class VegetablesYamlConfig {
+    private String potato;
+    private String eggplant;
+    private String greenpeper;
+}
+
+

+ 27 - 0
springboot-demo/src/main/java/com/sf/config/factory/YamlPropertySourceFactory.java

@@ -0,0 +1,27 @@
+package com.sf.config.factory;
+
+import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
+import org.springframework.core.env.PropertiesPropertySource;
+import org.springframework.core.env.PropertySource;
+import org.springframework.core.io.support.EncodedResource;
+import org.springframework.core.io.support.PropertySourceFactory;
+
+import java.io.IOException;
+import java.util.Properties;
+
+// PropertySource注解 提供以工厂方式创建bean
+// spring提供一个yaml相关的类 YamlPropertiesFactoryBean
+// 我们通过工厂中提供的方法参数 encodedResource获取资源(数据),然后将资源设置到yaml的bean对象中
+//   再将bean对象的数据转化为Properties  最后取出yml中数据
+public class YamlPropertySourceFactory implements PropertySourceFactory {
+
+    @Override
+    public PropertySource<?> createPropertySource(String name, EncodedResource encodedResource)
+            throws IOException {
+        YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
+        factory.setResources(encodedResource.getResource());
+
+        Properties properties = factory.getObject();
+        return new PropertiesPropertySource(encodedResource.getResource().getFilename(), properties);
+    }
+}

+ 2 - 0
springboot-demo/src/main/java/com/sf/config/other/OtherAutoConfig1.java

@@ -2,7 +2,9 @@ package com.sf.config.other;
 
 import com.sf.bean.Computer;
 import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 
+//@Configuration
 public class OtherAutoConfig1 {
     @Bean("oneComputer")
     public Computer computer() {

+ 2 - 0
springboot-demo/src/main/java/com/sf/config/other/OtherAutoConfig2.java

@@ -2,7 +2,9 @@ package com.sf.config.other;
 
 import com.sf.bean.Computer;
 import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 
+//@Configuration
 public class OtherAutoConfig2 {
     @Bean("twoComputer")
     public Computer computer() {

+ 2 - 0
springboot-demo/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -0,0 +1,2 @@
+com.sf.config.other.OtherAutoConfig1
+com.sf.config.other.OtherAutoConfig2

+ 4 - 0
springboot-demo/src/main/resources/config/vegetablesBak.yml

@@ -0,0 +1,4 @@
+vegetablesbak:
+    eggplant: 茄子
+    greenpeper: 青椒
+    potato: 土豆

+ 9 - 0
springboot-demo/src/test/java/com/sf/YamlTests.java

@@ -1,6 +1,8 @@
 package com.sf;
 
+import com.sf.config.VegetablesYamlConfig;
 import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.test.context.SpringBootTest;
 
@@ -14,4 +16,11 @@ public class YamlTests {
     public void test(){
         System.out.println(lines);
     }
+
+    @Autowired
+    private VegetablesYamlConfig yamlConfig;
+    @Test
+    public void testConfig(){
+        System.out.println(yamlConfig);
+    }
 }