簡化Spring應用開發的一個框架整個Spring技術棧的一個大整合css
J2EE開發的一站式解決方案html
martin fowler 總結說,微服務是一種架構風格java
一個應用應該是一組小型服務;能夠經過HTTP的方式進行互通react
每個功能元素最終都是一個可獨立替換和獨立升級的軟件單元。web
與之對應的是單體服務redis
詳細參照:spring
https://martinfowler.com/micr...
在maven的settings.xml配置文件的profiles標籤添加配置shell
<profile> <id>jdk-1.8</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties> </profile>
maven的相關配置json
一個功能:數組
瀏覽器發送Hello請求,服務器接受請求並處理,響應Hello World字符串
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @SpringBootApplication 來標註一個主程序,說明這是一個Spring Boot應用 */ @SpringBootApplication public class HelloWorldMainApplication { // spirng 應用啓動起來 public static void main(String[] args) throws Exception { SpringApplication.run(HelloWorldMainApplication.class, args); } }
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class HelloController { @ResponseBody @RequestMapping("/hello") public String hello() { return "hello world"; } }
mvn spring-boot:run
pom.xml中增長,內容
<build> <plugins> <!-- 這個插件,能夠將應用打包成一個可執行的jar包 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> </parent>
上述父項目的父項目是
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.5.9.RELEASE</version> <relativePath>../../spring-boot-dependencies</relativePath> </parent>
它來真正管理Spring Boot應用裏面的全部依賴版本,能夠稱之爲Spring Boot的版本仲裁中心,之後導入依賴默認不須要寫版本。
沒有在中心管理的依賴,天然須要聲明版本號。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
spring-boot-starter-web
spring-boot-starter : Spring Boot場景啓動器,幫咱們導入了web模塊正常運行所依賴的組件;
Spring Boot將全部的功能場景都抽取出來,作成一個個的starters(啓動器),只須要在項目裏引入這些starter,相關場景的全部依賴都會導入進來。須要什麼功能就導入什麼場景的啓動器
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @SpringBootApplication 來標註一個主程序,說明這是一個spring boot應用 */ @SpringBootApplication public class HelloWorldMainApplication { // spirng 應用啓動起來 public static void main(String[] args) throws Exception { SpringApplication.run(HelloWorldMainApplication.class, args); } }
@SpringBootApplication: Spring Boot應用標註在某個類上,說明這個類是Spring Boot的主配置類,Spring Boot應該運行這個類的main方法來啓動Spring Boot應用
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Configuration @EnableAutoConfiguration @ComponentScan public @interface SpringBootApplication
@Configuration
配置類上來標註這個註解
配置類----配置文件;配置類也是窗口中的一個組件,@Component
@EnableAutoConfiguration
咱們須要配置的東西,Spring Boot幫咱們自動配置:@EnableAutoConfiguration告訴srpingboot開啓自動配置功能;這樣自動配置才能生效
@Target(value=TYPE) @Retention(value=RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(value=EnableAutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration
@AutoConfigurationPackage
@Target(value=TYPE) @Retention(value=RUNTIME) @Documented @Inherited @Import(value=org.springframework.boot.autoconfigure.AutoConfigurationPackages.Registrar.class) public @interface AutoConfigurationPackage
@**Import**(value=org.springframework.boot.autoconfigure.AutoConfigurationPackages.Registrar.class)
spring 的底層註解@Import,給容器中導入一個組件;導入的組件由AutoConfigurationPackages.Registrar.class管理;做用是<u>將主配置類所在包及下全部子包裏面的全部組件掃描到Spring容器中</u>
@Import(value=EnableAutoConfigurationImportSelector.class)
給容器導入組件:EnableAutoConfigurationImportSelector.class,導入哪些組件的選擇器;將全部須要導入的組件以全類名的方式返回;這些組件就會被添加到容器中。
有了自動配置類,免去了手動編寫配置和注入功能組件等工做
Spring Boot在啓動的時候,從類路徑下的META-INFO/spring.factories中獲取EnableAutoConfiguration指定的值,將這些值做爲自動配置類導入到容器中,自動配置類生效,從而能夠進行自動配置工做;之前須要本身配置的東西,自動配置類代爲完成了。
J2EE的總體整合解決方案和自動配置都在spring-boot-autoconfigure-**(此處爲版本號).jar
IDE都支持使用Spring項目建立嚮導快速建立一個Spring Boot項目
選擇須要的模塊,嚮導會聯網建立Spring Boot項目
默認生成的Spring Boot項目:
resources文件夾中的目錄結構
Spring Boot使用一個全局的配置文件,配置文件名是固定的:
配置文件的做用:修改Spring Boot自動配置的默認值;Spring是底層都給咱們配置好
YAML
標記語言
之前配置文件大多使用xml文件,YAML以數據爲中心,比json、xml等更適合作配置文件
配置例子
server: port: 8081
key:(空格)value表示一對鍵值對(必須有空格)
以空格的縮進來控制層級關係;只要是左對齊的一列數據,都是同一層級的
server: port: 8081 path: /hello
屬性和值大小寫敏感
字面量:普通的值(數字,字符串,布爾)
直接寫 k: v
字符串默認不用加上單引號或者雙引號
雙引號:不會轉義字符串裏面的特殊字符,特殊字符會做爲自己想表示的意思
對象、Map(屬性和值)(鍵值對)
k:v在下一行來寫對象的屬性和值的關係;注意縮進
對象仍是k: v的方式
friends: lastName: Zhang age: 20
數組(List、 Set)
用-值表示數組中的一個元素
pets: - cat - dog - pig
yaml配置文件
person: lastName: zhangsan age: 18 boss: false birth: 2017/12/12 maps: {k1: v1, k2: v2} lists: - lisi - wangwu - zhaoliu dog: name: giggle age: 2
java bean
/** * 將配置文件中配置的每個屬性的值,映射到這個組件中 * @ConfigurationProperties :告訴Spring Boot將本類中的全部屬性和配置文件中相關的配置進行綁定 * perfix = "person" : 配置文件中哪一個下面的全部屬性進行一一映射 * 只要該組件是容器中的組件,才能使用容器中的功能 */ @Component @ConfigurationProperties(prefix = "person") public class Person { private String lastName; private Integer age; private Boolean boss; private Date birth; private Map<String, Object> maps; private List<Object> lists; private Dog dog; public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Boolean getBoss() { return boss; } public void setBoss(Boolean boss) { this.boss = boss; } public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } public Map<String, Object> getMaps() { return maps; } public void setMaps(Map<String, Object> maps) { this.maps = maps; } public List<Object> getLists() { return lists; } public void setLists(List<Object> lists) { this.lists = lists; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog = dog; } @Override public String toString() { return "Person{" + "lastName='" + lastName + '\'' + ", age=" + age + ", boss=" + boss + ", birth=" + birth + ", maps=" + maps + ", lists=" + lists + ", dog=" + dog + '}'; } }
單元測試
/** * Spring Boot 單元測試 * * 能夠在測試期間很文件的相似編碼同樣進行自動注入到容器當中 */ @RunWith(SpringRunner.class) @SpringBootTest public class HelloWorldMainApplicationTest { @Autowired Person person; @Test public void contextLoads() { System.out.println(person); } }
能夠導入配置文件處理器,之後編寫配置文件就有提示了
<!-- 導入配置文件處理器,配置文件進行綁定就會有提示--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的屬性 | 逐個指定 |
鬆散綁定(鬆散語法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303數據校驗 | 支持 | 不支持 |
複雜類型封閉(如map) | 支持 | 不支持 |
配置文件不論是yml仍是properties,兩種方式都能獲取到值;
若是隻是在某個業務邏輯中須要獲取一下配置文件中的某項值,就使用@Value;若是專門編寫了一個JavaBean來和配置文件進行映射,則使用@ConfigurationProperties
@Component @ConfigurationProperties(prefix = "person") @Validated public class Person { /** * <bean class="Person"> * <property name="lastName" value="字面量/${key}/#{SpEL}從環境變量、配置文件中取值" /> * </bean> */ //lastName必須是email @Email private String lastName; private Integer age; private Boolean boss; private Date birth; private Map<String, Object> maps; private List<Object> lists; private Dog dog; }
@PropertiesSource加載指定的配置文件
/** * @ConfigurationProperties(prefix="person) 默認從全局配置文件中獲取值 */ @Component @ConfigurationProperties(prefix = "person") @PropertySource(value = {"classpath:person.properties"}) public class Person { /** * <bean class="Person"> * <property name="lastName" value="字面量/${key}/#{SpEL}從環境變量、配置文件中取值" /> * </bean> */ private String lastName; private Integer age; private Boolean boss; private Date birth; private Map<String, Object> maps; private List<Object> lists; private Dog dog; }
@ImportResource:導入Spring的配置文件,讓配置文件裏面的內容生效
Spring Boot裏面沒有Spring的配置文件,咱們本身編寫的配置文件,也不能自動識別;
若是須要讓Spring的配置文件生效,加載進來,須要將@ImportResource加到配置類上
@ImportResource(locations = {"classpath:beans.xml"}) 導入spring配置文件使其生效,須要加在Spring配置類上
不來Spring配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="helloService" class="com.meituan.service.HelloService"></bean> </beans>
Spring Boot推薦給容器中添加組件的方式:推薦使用全註解的方式
配置類=========Spring配置文件
使用@Bean來給容器添加組件
/** * 指明當前類是一個配置類,用來替代以前的Spring配置文件 * 在配置文件中用<bean></bean>標籤添加組件 */ @Configuration public class MyAppConfig { //將方法的返回值添加到容器中,容器中這個組件默認的id就是方法名 @Bean public HelloService helloService() { return new HelloService(); } }
${random.value} ${random.int} ${random.int(max)} ${random.int(min,max)} ${random.long} ${random.long(max)} ${random.long(min,max)} ${random.uuid}
dog: name: ${person.last-name:hello}_giggle age: 2 last-name: zhangsan${random.uuid}
在主配置文件編寫的時候,文件名能夠是application-{profile}.properties/yml,實現動態切換;默認使用application.properties/yml中的配置
spring: profiles: active: dev --- server: port: 8081 spring: profiles: dev --- server: port: 8082 spring: profiles: prod
spring: profiles: active: dev
java -jar springboot.jar --spring.profile.active=dev
VM options: -Dspring.profiles.active=dev
Spring Boot啓動會掃描如下位置的application.properties或者application.yml文件做爲Spring Boot的默認配置文件
其中,file是指當前項目根目錄
1. Devtools global settings properties on your home directory (~/.spring-boot-devtools.properties when devtools is active). 2. @TestPropertySource annotations on your tests. 3. @SpringBootTest#properties annotation attribute on your tests. 4. Command line arguments. 5. Properties from SPRING_APPLICATION_JSON (inline JSON embedded in an environment variable or system property) 6. ServletConfig init parameters. 7. ServletContext init parameters. 8. JNDI attributes from java:comp/env. 9. Java System properties (System.getProperties()). 10. OS environment variables. 11. A RandomValuePropertySource that only has properties in random. 由jar包外向jar包內進行尋找,優先加載帶profile 12. **Profile-specific application properties outside of your packaged jar (application-{profile}.properties and YAML variants) 13. Profile-specific application properties packaged inside your jar (application-{profile}.properties and YAML variants) 再加載不帶profile 14. Application properties outside of your packaged jar (application.properties and YAML variants). 15. Application properties packaged inside your jar (application.properties and YAML variants).** 16. @PropertySource annotations on your @Configuration classes. 17. Default properties (specified using SpringApplication.setDefaultProperties).
自動配置原理(很是重要):
1)SpringBoot啓動的時候加載主配置類,開啓了自動配置功能
2)@EnableAutoConfiguration做用:
獲取候選的配置
SpringFactoriesLoader.loadFactoryNames() 掃描全部jar包類路徑下的文件:META-INF/spring.factories 將掃描到的文件內容,包裝成Properties對象 從Properties獲取到EnableAutoConfiguration.class(類名)對應的值,而後將其添加在容器中
將類路徑下 META-INF/spring.factories 裏面配置的全部EnableAutoConfiguration的值加入到容器中。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\ org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\ org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\ org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\ org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\ org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\ org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\ org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\ org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.ldap.LdapDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\ org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\ org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration,\ org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\ org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\ org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\ org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\ org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\ org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\ org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\ org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\ org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\ org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\ org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\ org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\ org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\ org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\ org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\ org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\ org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\ org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\ org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\ org.springframework.boot.autoconfigure.mobile.DeviceResolverAutoConfiguration,\ org.springframework.boot.autoconfigure.mobile.DeviceDelegatingViewResolverAutoConfiguration,\ org.springframework.boot.autoconfigure.mobile.SitePreferenceAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\ org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\ org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\ org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration,\ org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration,\ org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration,\ org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\ org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\ org.springframework.boot.autoconfigure.social.SocialWebAutoConfiguration,\ org.springframework.boot.autoconfigure.social.FacebookAutoConfiguration,\ org.springframework.boot.autoconfigure.social.LinkedInAutoConfiguration,\ org.springframework.boot.autoconfigure.social.TwitterAutoConfiguration,\ org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\ org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\ org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\ org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\ org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\ org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration,\ org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,\ org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration,\ org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration,\ org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration,\ org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration,\ org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration,\ org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,\ org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration,\ org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration
3) 每個自動配置類自動配置
4) 以HttpEncodingAutoConfiguration爲例解釋自動配置原理:
@Configuration //表示這是一個配置類,與之前編寫的配置文件同樣,能夠給容器中添加組件 @EnableConfigurationProperties({HttpEncodingProperties.class})//啓動指定類的ConfigurationProperties功能,將配置文件中對應的值和HttpEncodingProperties綁定起來,並加入到IOC容器中 @ConditionalOnWebApplication//Spring底層有@Conditional註解,根據不一樣的條件,若是知足指定的條件,整個配置類纔會生效,當前註解判斷是否爲Web應用,若是是,當前配置類生效; @ConditionalOnClass({CharacterEncodingFilter.class})//判斷當前項目是否存在CharacterEncodingFilter類,是SpringMVC中亂碼解決的過濾器 @ConditionalOnProperty( prefix = "spring.http.encoding", value = {"enabled"}, matchIfMissing = true ) //判斷配置文件中是否存在某個配置 public class HttpEncodingAutoConfiguration { //已經跟Spring配置文件映射起來了 private final HttpEncodingProperties properties; //只有一個有參構造器時,參數的值會從容器中拿 public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) { this.properties = properties; } /** * 若是生效,則將下列組件添加到容器中 */ @Bean @ConditionalOnMissingBean({CharacterEncodingFilter.class}) public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter(); filter.setEncoding(this.properties.getCharset().name()); filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST)); filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE)); return filter; } }
根據當前不一樣的條件判斷,決定這個配置類是否生效
一旦這個配置類生效,這個配置類就是給容器中添加各類組件;這些組件的屬性是從對應的Properties類中獲取的,而這些類的中的每個屬性,又是與配置文件綁定的
5) 全部在配置文件中能配置的屬性都在xxxxProperties類中封閉着,配置文件能配置什麼就能夠參照HttpEncodingProperties類
@ConfigurationProperties( prefix = "spring.http.encoding" ) public class HttpEncodingProperties
Spring Boot 精髓:
1)SpringBoot啓動會加載大量的自動配置類
2) 須要的功能有沒有SpringBoot默認寫好的自動配置類
3)再考察自動配置類中到底配置了哪些組件,若是已經有就不須要再配置了,若是沒有須要本身編寫配置類
4)給容器中自動配置類添加組件的時候,會從Properties類中獲取某些屬性,此時能夠在配置文件中指定這些屬性的值
xxxxAutoConfiguration:自動配置類,給容器添加組件
xxxxProperties:封閉配置文件中的相關屬性
@Conditional 派生註解
@Conditional擴展註解 | 做用(判斷是否知足當前指定條件) |
---|---|
@ConditionalOnJava | 系統的java版本是否符合要求 |
@ConditionalOnBean | 容器中存在指定Bean; |
@ConditionalOnMissingBean | 容器中不存在指定Bean; |
@ConditionalOnExpression | 知足SpEL表達式指定 |
@ConditionalOnClass | 系統中有指定的類 |
@ConditionalOnMissingClass | 系統中沒有指定的類 |
@ConditionalOnSingleCandidate | 容器中只有一個指定的Bean,或者這個Bean是首選Bean |
@ConditionalOnProperty | 系統中指定的屬性是否有指定的值 |
@ConditionalOnResource | 類路徑下是否存在指定資源文件 |
@ConditionalOnWebApplication | 當前是web環境 |
@ConditionalOnNotWebApplication | 當前不是web環境 |
@ConditionalOnJndi | JNDI存在指定項 |