**
常用註解
**
springBoot
@ComponentScan 指定一個包名 掃描這個包和子包
不指定的話就進行默認掃描 :自動掃描主程序所在的包和子包 所以我們一般直接定義主程序所在的包的子包
@Controller 聲明對象是控制器程序
@RestCOntroller是組合註解主要用於以數據返回的微服務中 相當於 @Controller和@Responsbody 因爲有這兩個作爲原註解
@EnableTransactionManagement 啓動事務管理器 @Transcational註解就可以起作用了
@MapperScan 掃描DAO 創建代理對象 進而注入service用的
springCloud
@Mapper註解寫在你的Mapper映射接口上面
@SpringBootApplication寫在主程序上面
@Configuration 寫在配置類上面 @Bean寫在配置類中的返回新的對象的方法上面
@EnableEurekaServer把當前微服務標記爲Eureka註冊中心 接收其他微服務的註冊
@EnableEurekaClient註冊該微服務到Eureka中
@LoadBalanced該註解寫在配置RestTemplate的配置類方法上來啓動ribbon負載均衡
@EnableFeignClients寫在主程序上來支持feign
@HystrixCommand(fallbackMethod=“你的方法”) @EnableCircuitBreaker //啓用對Hystrix熔斷機制的支持
@FeignClient(value="服務名",fallbackFactory=實現FallbackFactory的類.class) 實現服務降級
@EnableHystrixDashboard 加在主程序上啓動服務監控
@FeignClient(value=“服務名”)寫在接口上 來調用遠程服務
@EnableZuulProxy寫在主程序上啓動zuul路由訪問功能
**
SpringApplication源碼分析
**
我們在啓動SpringBoot的時候調用了SpringApplication.run(AtCrowdfundingApplication.class,args);
(1)這個方法的作用其實是在底層創建了一個對象 new SpringApplication(object數組).run(args);
SpringApplication springApplication = new SpringApplication(new Object[]{AtCrowdfundingApplication.class});
springApplication.run(args);所以我們可以用這句代碼替代上面的代碼
好處就是可以在springApplication.setxxx中自定義設置
(2)SpringApplication構造器:
調用了initialize()方法 把傳入的數組轉換成集合再轉換成linkedHashSet中
1 deduceWebEnvironment()判斷是否引入了web模塊是的話返回true
判斷Servlet ConfigurableWebApplicationContext兩個類是否存在 是就是web環境 纔會做web環境所需要的配置
2 setInitializer:拿6個工廠對象做底層實例對象的管理存放在initializers(LIST集合)裏面 傳入的參數是ApplicationContextInitializer.class
ApplicationContext 就是我們的IOC容器 在初始化的時候 需要我們工廠做一些bean對象生命週期的管理
首先獲取當前線程類的應用類加載器 然後獲取工廠類名進而創建工廠類對象
通過反射拿ApplicationContextInitializer的類名
從jar包中找到META-INF/spring.factories並且加載成properties 找鍵是ApplicationContextInitializer的值 就是上圖中的6個類名
通過反射創建對象
3 setListener把監聽器放在listeners(list集合)中 過程原理和上面是一樣的
4 deduceMainApplicationClass() 判斷主程序類是哪一個類
首先獲取異常棧 找到main方法 就可以找到主程序類並放回
(3)run方法 使用構造器初始化的成員變量
通過反射創建IOC容器並且進行初始化
**
SpringBootApplication註解
**
有很多原註解
@Target
@Retention
@Documented
@Inherited
@springBootConfiguration 這個註解又有一個@Configuration 說明兩個都可以用來聲明配置類
@EnableAutoCOnfiguration很重要 : @AUtoConfigurationPackage啓動自動掃描包
@Import(EnableAutoConfigurationImportSelector.class) 使用條件註解@Conditional...判斷你的運行環境(你引入的starter)來配置你需要的
**
SpringBOOT整合mybatis
需要application.yml配置文件
**
---
spring:
datasource:
name: mydb
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://127.0.0.1:3306/cc
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
mybatis:
mapper-locations: classpath*:/mybatis/mapper-*.xml
type-aliases-package: com.xx.**.bean
---表示分隔符
mybatis配置的是mapepr配置文件 可有可無 沒有的話就直接在dao接口中寫sql註解 簡單的sql可以這樣寫 複雜的例如動態sql可以用配置文件寫
**
SpringBOOT熱部署
**
只需要引入jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional><!-- 這個需要爲 true 熱部署纔有效-->
</dependency>
項目出現了devtools就說明可以支持熱部署了
**
SpringBOOT動態設置端口號
組合配置
**
創建application-test.properties文件 寫自己所要的端口號碼
在run as configuration配置中 program arguments填寫參數
--spring.profiles.active=test test名字可以自己起 就可以關聯了
原理是利用ConfigFileApplicationLIstener監聽器監聽有沒有spring.profiles.active參數 有就會通過這個參數啓動配置文件
原本application.properties中的配置還是可以起作用的 application-test.properties裏面有的配置就會覆蓋掉application.properties的
**
SpringBoot集羣
**
使用內置的tomcat配置集羣:
server.address=127.0.0.1 //只有本機可以直接訪問tomcat
server.tomcat.remote-ip-header=x-forwarded-for
server.tomcat.protocol-header=x-forwarded-proto
server.tomcat.port-header=X-Forwarded-Port
server.use-forward-headers=true
測試:
兩個項目 兩個配置文件 兩個端口號 啓動就行 使用nginx進行負載均衡
使用外置的tomcat配置集羣:
更改pom文件: <packaging>jar</packaging> 到 <packaging>war</packaging>
把tomcat模塊的依賴類庫設置成provided範圍 因爲我們使用的外部的tomcat 在部署的時候不需要內置的tomcat
將當前Application啓動類繼承SpringBootServletInitializer, 並重寫方法configure 此時就不需要原本的main方法了
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
builder.sources(Application.class);// Application爲啓動類
return super.configure(builder);
}
打成war包 放在tomcat文件夾的webapps下 名字是ROOT.war 運行的時候就會形成ROOT文件夾
**
springBoot集成redis
做session共享
**
放入依賴的jar包後 會有RedisAutoConfiguration配置類就會啓動
需要增加一個集成配置類 來啓動
@Configuration
@EnableRedisHttpSession
public class RedisSessionConfig {
}
當然要實現session共享 pojo對象要序列化
這樣就成功了 在session中存儲數據的時候就會存儲到redis中
**
springBoot集成健康監控
監控項目狀態
**
引入相關配置後 在http://ip:port/health查看健康狀態
up表示正在運行
可以在項目yml中間中定義:
就可以在info資源路徑中拿到: 項目名字 父工程描述信息 版本 springboot父版本
還有很多其他路徑~
**
Spring Cloud
**
(1)註冊中心 倒入Eurka Server
在主程序上加 @EnableEurekaServer
propertites配置
spring.application.name=eureka-server
server.port=1001
eureka.instance.hostname=127.0.0.1
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
服務項目要導入 Eurka Discovery
主程序要加入@EnableDIscoveryClient
spring.application.name=eureka-member-service
server.port=2001
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:1001/eureka/
客戶端項目 要導入 Eurka Discovery Feign
主程序 @EnableDIscoveryClient @EnableFeignClients啓動feign的方式進行遠程調用
spring.application.name=eureka-member-client
server.port=80
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/
service接口裏的方法要跟遠程的controller裏的方法聲明保持一樣 加上@FeignClient(遠程服務名字 可以在註冊中心或者配置文件中找到)
(2)ribbon負載均衡 在客戶端做 在我們客戶端找到多個遠程服務的時候就會使用ribbon進行輪詢
nginx是在服務器端做負載均衡~ Feign中已經內置了ribbon所以不需要額外的操作 但是redis要自己搭建一個服務器
(3)Hystrix 進行系統的容錯
熔斷器加在web端 主程序中加@EnableHystrix
增加熔斷方法 @HystrixCommand(fallbackMethod="你的熔斷方法")