晶瑩透亮 / 香甜可口,正泓琥珀核桃仁 1 斤 19.99 元
SpringBoot-WD版本
Properties或者yml配置檔案中的值和元件之間屬性的關聯。
-
需要全部的名稱,直接是在屬性上面@Value("${hello.controller.content}").
//@Value("${demo.druid.driver}") String driver;
-
@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/
-
@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的註解拓展
-
@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);
}
}
}
- @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的獲取的不是同一個例項。
-
@Import
感覺這個註解是有點多餘啊,其實就是把類放入到容器裡面啊。明明@component就可以把類放入到容器裡,還需要這個幹嗎呢
/* * @Import({User.class}) 在容器中自動建立Bean的註解 * 通過傳入位元組碼,預設呼叫bean的無參構造器,向容器中存放一個Bean * 預設元件的名字就是類的全路徑名 * @Import只要放到可以被掃描到的類之上就可以,不必非得是配置類或者Controller * */ @Import({User.class}) @Configuration(proxyBeanMethods = true) public class MyConfig { }
-
@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);
}
-
@ImportResource
可以把原生的配置檔案中的bean,接入到我們的容器裡面。
bean.xml檔案中的bean,弄到config檔案裡。
@Configuration @ImportResource("classpath:beans.xml") public class MyConfig { }
-
@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 { }
-
-