spring boot 學習筆記(一)

學習連接:http://www.cnblogs.com/ityouknow/category/914493.html

定義

spring boot 是由pivotal 團隊提供的權限框架,設計目的是用來簡化新的spring應用的初始搭建以及開發過程,該框架使用了特定的方式來進行設置,從而使開發人員不在須要定義樣板化的配置。所以,spring boot 不是新的框架,是默認設置了不少框架的使用方式,就像maven 整合了全部的jar包,spring boot 整合了一部分的框架。css

優點

簡單,快速,方便html

原有web項目前端

  • 1,配置 web.xml,加載 spring 和springMVC
  • 2,配置數據庫鏈接,配置spring事務
  • 3,配置加載配置文件的讀取,開啓註解掃描。
  • 4,配置日誌文件

學習

  • 熱部署 devtools
  • json註解,jsonFromat 等
  • service 配置 port 等
  • config 配置 對照
  • jpa配置 自動生成類等

thymeleaf 模板

thymeleaf (saimei leifu) 介紹

thymeleaf 是一款用於渲染XML/XHTML/HTML5內容的模板模板引擎,相似JSP,velocity,FreeMaker等,它能夠輕易的與spring MVC 等Web框架進行集成,做爲Web應用的模板引擎。與其餘模板引擎相比。thymeleaf 最大的特色是可以直接再瀏覽器中打開並正確的顯示模板頁面,而不須要啓動整個web應用。 和 velocity ,fremaker,beetle 這類的模板到底好在哪裏?thymeleaf是不一樣的,由於它使用了天然的模板技術,這覺得着thymeleaf的模板語法不會破壞文檔的結構,模板依舊是有效的xml文檔,模板還能夠做爲工做原型,thymeleaf會在運行期替換掉靜態值,velocity與freemarker則是連續的文本處理器。vue

  • Velocity:

    $messagejava

  • FreeMarker:

    ${message}mysql

  • Thymeleaf:

    Hello World!web

因爲thymeleaf 使用XML DOM 解析器,所以它並不適合處理大規模的XML文件redis

URl

url 在web應用模板中佔據十分重要的地位,須要注意的是thymeleaf 對於url的處理是經過語法,@{。。。}來處理的,thymeleaf 支持決定路徑。spring

Thymeleafsql

條件求值

<a th:href="@{/login}" th:unless=${session.user != null}>Login

for 循環

<td th:text="${prod.name}">Onions</td> <td th:text="${prod.price}">2.41</td> <td th:text="${prod.inStock}? #{true} : #{false}">yes</td>

頁面即原型

在web 開發過程當中,先後端的配合,須要修改模板,靜態資源文件等, 但實際上前端工程師的職責更多應該關注與頁面非後端,使用jsp,veloctiy 等傳統的java模板引擎很那作到這一點,biubiu渲染之後才能看到結果,thymeleaf 從根本上顛覆了這一過程,經過書信進行模板渲染。

過濾器 filter 過濾器

filters用於記錄調用日誌,排除xss威脅的字符,執行權限驗證等。SpringBoot 自動添加OrderedCharacterEncodingFilter和HiddenHttpMethodFilter,咱們也能夠自定義filter

1, 實現Filter接口,實現Filter方法。 2, 添加@Configuration 註解,將自定義Filter 加入過濾鏈

自定義 Property

1,配置在application.properties中 > * com.neo.title=螺旋 * com.meo.description=囉嗦 2,自定義配置類 @Component public class NeoProprtties { @Value private String title; @Value private String description; }

數據庫

jpa sun官方提出的java持久化規範,它爲java開發人員提供了一種對象/關係映射工具來管理java應用中的關係數據,住喲啊爲了簡化現有的持久化開發工做和整合prm技術,結束現有的,hibernate,TopLink,JDO等orm框架各自爲營局面,吸取了他們的有點,具備
易於使用,伸縮性強的有點。與spring 結合緊密。
> jpa 是一套規範,不是一套產品。hibernate,topLink,JDO 他們是一套產品。

spring data jpa 是spring 基於orm框架,jpa規範基礎上封裝的一套jpa應用框架,可以使開發者使用簡易代碼訪問數據和操做數據,提供crud的經常使用功能。
 

mysql  ,spring data jpa 是利用Hibernate 生成各類自動化的sql ,crud 等
1,添加java包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> 2,添加配置文件 > spring.datasource.url=jdbc:mysql://localhost:3306/test

spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jpa.properties.hibernate.hbm2ddl.auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa.show-sql= true

3,hibernate.hbm2ddl.auto 參數的主要用於:自動建立、更新、驗證數據庫表結構4個值 > * create :每次加載hibernate時都會刪除上一次生成的表,而後根據model類從新生成新的表。就是沒有改變也會這樣執行。會致使數據庫文件丟失。 > * create-drop: 每次加載hibernate是根據model類生成表,可是sessionFactory已關閉,表就自動刪除。 > * update :最經常使用的,第一次加載hibernate時候根據model類會自動創建表的結構(要有創建好數據庫),之後加載hibernate 時根據model 類自動更新表結構,即便表表結構改變了單表中仍然存在不會刪除之前的行,要注意的是當部署到服務器後,表接口是不會被立刻創建起來的,是喲啊等應用第一次運行起來纔會。 > * validate : 每次加載hibernate時,驗證建立數據庫結構,只會和數據庫中的表進行比較,不會建立新表,可是會插入新值。 dialect 指, 指定生成表名的存儲引擎爲inneoDB show-sql 是否打印出自動生產的sql。 3,添加實體類和Dao > @Entity

public class User implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue private Long id; @Column(nullable = false, unique = true) private String userName; @Column(nullable = false) private String passWord; @Column(nullable = false, unique = true) private String email; @Column(nullable = true, unique = true) private String nickName; @Column(nullable = false) private String regTime; //省略getter settet方法、構造方法 }

dao 只要繼承jpaRepository 類就能夠。

public interface UserRepository extends JpaRepository<User, Long> { User findByUserName(String userName); User findByUserNameOrEmail(String username, String email);

entity 中不映射成列的字段須要加 @Transient 不加註解會被映射成列。

多數據源的支持

同源數據庫的多源支持

若是使用分佈式開發模式,不一樣的服務使用不一樣的數據庫,一個項目中有可能會使用多個數據源。所以須要配置多個數據源,spring data jpa 對多個數據源有很好的支持,實現主要分三步 1,配置多個數據源 2,不一樣實體類放入不一樣包內 3,聲明不一樣的包實體類指向不一樣的數據源,事務支持。

使用枚舉註解

咱們但願數據庫中存儲的是枚舉對應的String類型,而不是枚舉的索引值 @Enumerated(EnumType.STRING) @Column(nullable = true) private UserType type;

4,測試 註解,@RunWith(SpringJunit4ClassRunner.class) @SpringApplicationCinfiguration(Application.class)

spring data jpa 還有不少的功能,好比封裝好的分頁,能夠本身蒂尼sql,主從分離等。

Gradle 構建工具

spring 項目建議使用gradle進行構建項目相對 maven來說,gradle更簡潔。 並且 gradle 構建大型項目。吸取了maven和ant的特色。

Werbjars

Webjars 是一個神奇的東西,能夠以jar包的形式,使用前端的各類框架,組件。 webjars 是將客戶端資源達成jar包。以對資源進行統一的依賴管理。webjar包部署在maven 中央倉庫上。

  • 爲何使用,webjars 能夠像maven同樣提供給咱們前端的資源jar包,方便管理依賴。
  • 如何使用 WebJars主官網 查找對於的組件,好比Vuejs <dependency> <groupId>org.webjars.bower</groupId> <artifactId>vue</artifactId> <version>1.0.21</version> </dependency>
  • 頁面引入
  • <link th:href="@{/webjars/bootstrap/3.3.6/dist/css/bootstrap.css}" rel="stylesheet"></link>

spring Boot redis 的使用

redis 介紹

redis 是業界使用最普遍的內存數據存儲。相比 memcached redis支持更豐富的數據結構。例如,hashes list sets 等,支持數據持久化。redis還提供數據庫的一些特性,例如,事務,HA,主從庫等。redis 兼具了緩存系統和數據庫的一些特性,有豐富的應用場景。

如何使用

  • 引入spring -boot-starter- redis jar包

  • 添加配置文件 # REDIS (RedisProperties) Redis數據庫索引(默認爲0) spring.redis.database=0
    Redis服務器地址 spring.redis.host=192.168.0.58 Redis服務器鏈接端口 spring.redis.port=6379
    Redis服務器鏈接密碼(默認爲空) spring.redis.password=
    鏈接池最大鏈接數(使用負值表示沒有限制) spring.redis.pool.max-active=8
    鏈接池最大阻塞等待時間(使用負值表示沒有限制) spring.redis.pool.max-wait=-1
    鏈接池中的最大空閒鏈接 spring.redis.pool.max-idle=8
    鏈接池中的最小空閒鏈接 spring.redis.pool.min-idle=0
    鏈接超時時間(毫秒) spring.redis.timeout=0

  • 添加cache 配置類 @Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport{ }

  • 自動根據方法生成緩存 @RequestMapping("/getUser") @Cacheable(value="user-key") value 值就是緩存到redis中的key

共享Session-spring-session-data-redis

分佈式系統中,sessiong共享有不少的解決方案,其中託管到緩存中應該是最經常使用的方案之一,

  • 引入依賴 spring-session-data-redis

  • session配置 @Configuration @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30) public class SessionConfig { } maxInactiveIntervalInSeconds :設置session失效時間,使用redis session 以後,原boot 的server.session.timeout 屬性再也不生效。

spring boot RabbitMQ

介紹

RabbitMQ 是實現高級消息隊列,AMQP的消息中間件的一種,起源於金融系統,在分佈是系統中存儲轉發消息,具備易用性,拓展性,高可用的特性,RabbitMQ 主要是覺得系統之間的雙向解耦而生,當生產者生成大量數據,消費者沒法快速的消費,就須要一箇中間件緩衝,保存這些數據。

AMQP,即 Advanced Message Queuing Protocel ,高級消息隊列協議。是應用層協議的一個開放版本,爲面向消息的中間件設計。消息中間件主要是用於組件之間的解耦,消費發送者無需知道消息執行者者,反之亦然,AMQP 主要特徵就是面向消息,隊列,路由(包括點對點和發佈,訂閱),可靠性,安全等特色。 -- 消息中間件主要是用於組件之間的解耦。

RabbitMQ 是一個開源的AMQP實現,服務端使用Erlang 語言編寫支持多種客服端,現有的語言基本偶支持。入Python,ruby。net java jms c PHP actionscript xmpp stomp。AJAX。用於在分佈式系統中儲存轉發信息,在易用性,拓展性,高可用性表現不俗。
#### 概念
一般的消息隊列,會有三個概念,發送者,接收者,隊列。RabbitMQ 在這個基本的概念上添加了一層,在發消息者 和 隊列中,叫交換器,exchange ,這樣就變成,發消息者把消息給交換器,交換器再經過策略把消息傳給隊列。

其中比較重要的概念有,虛擬主機,交換器,隊列 ,綁定
* 虛擬主機:一個虛擬主機持有一組交換機,隊列和綁定。用戶只能在虛擬主機的顆粒進行權限控制,若是想禁止A組訪問B組的交換機/隊列和綁定,必須爲A和B分別建立一個虛擬主機,每個RabbitMQ服務器都有一個默認的虛擬主機。
* 交換機 exchenge 用於轉發消息,可是不會存儲,所以須要Queue bind 。否則那exchange會直接丟棄producer發送過來的消息,這裏一個重要概念,路由鍵,消息到交換器,交換器會轉發到對應的隊列中,這個須要路由鍵控制。
* 綁定 交換機須要和隊列相綁定,多對多關係。

#### 交換機 Exchange
交換機的功能主要是接收消息並轉發到綁定的隊列中,交換機不存消息,在啓用ack模式後,交換機找不到隊列會返回錯誤。交換機有4終類型,direct ,topic,headers and fanout @ direct: direct 啓動先匹配,再投送。即再綁定的時候設置一個值,routing_key 消息的routing_key 匹配時,纔會投送到綁定的隊列中。 @ Topic : 按規則轉發消息 @ Headers : 設置 header attribute 參數類型的交換機。 @ fanout: 轉發消息到全部的綁定隊列 * direct exchange direct exchange 是RabbitMQ 默認的就交換機模式,最簡單的,根據key 找隊列。一個隊列上能夠綁定多個key。 * Topic Exchange Topic Exchange 轉發消息主要是通配符,隊列和交換機綁定會定義一種路由模式,路由鍵匹配上路由模式後才能經過交換機轉發消息。 這種交換機模式下: ** 路由鍵 必須是一串字符串,用英文句號隔開,好比,aaa.su ** 路由模式必須包含一個標識符 \*,\#, 主要用於匹配路由鍵制定位置的單詞,好比,aaa.b.*,能匹配的路由鍵就是 第一個單詞aaa,第三個單詞b。若是末尾是井號(\#),能夠匹配全部以此開頭的路由鍵。 ** 具體的代碼,第一參數 交換機, 第二參數 routing key 第三參數爲具體消息。 > rabbitTemplate.convertAndSend("testTopicExchange","key1.a.c.key2", " this is RabbitMQ!"); topic 和 direct 相似,匹配上支持了模式,在點分的 routing——key 模式中,通配符兩個,型號 表示一個詞,井號 表示多個或零個。 * Headers Exchange headers 也是根據規矩匹配,對比direct 和 topic 固定的是用routing key ,headers 是一個自定義匹配規則的類型,在隊列和交換機綁定時,會設定一組鍵值對規則,消息中也包括一組鍵值對,若是這些鍵值對,有一對或者所有匹配的時候,消息就會被投放到對應的隊列。 * Fanout Exchange fanout exchange 消息廣播模式,無論路由鍵或路由模式,會把消息發給全部綁定到它的隊列,若是配置了routing key 會被忽略。 #### springBoot 集成 RabbitMQ ##### 1,添加pom包 spring boot stater amqp 包 ##### 2,配置文件 > 配置Rabbitmq 的安裝地址,端口,以及帳戶信息。 spring.application.name=spirng-boot-rabbitmq spring.rabbitmq.host=192.168.0.86

spring.rabbitmq.port=5672 spring.rabbitmq.username=admin spring.rabbitmq.password=123456

3 隊列配置

public Queue queue(){ return new Queue(「hello」)}

發送 rabbitTemplate 是springBoot 提供的默認實現 public class helloSender{ @autowired private amqpTemplate rabbitTemplate;

public void send(){ string context = "hello" + new Date(); System.out.pringln("Sender:"+context); this.rabbitTemplate.convertAndSend("hello",context); }

}

--接收者 @Component @RabbitListener public class HelloReceiver { @RabbitHandler public void process(String hello){ System.out.println("Receiver :"+hello); } } --測試 @RunWith(SpringRunner.class) @SpringBootTest public class RabbitMqHelloTest{

@Autowired private HelloSender helloSender; @Test public void hello() throws Exception{ hrlloSender.send(); }

} -- 接收者和發送者必須一致 --發送者 public void send(User user){ system.out.println("Sender object: "+user.toString()); this.rabbitTemplate.convertAndSend("object",user); }

--接收者 @RabbitHandler public void process(User user){ system.out.println("Receiver object :" +user); } --Topic Exhange 能夠根據不一樣的routing key 自由綁定不一樣的隊列,須要對topic 規則配置。 @Configuration public class RopicRabbitConfig { final static String message = "topic.message"; final static String messages = "topic.messages";

@Bean public Queue queueMessage(){ return new Queue(TopicRabbitConfig.message); } @Bean public Queue queueMessages(){ return new Queue(TopicRabbitConfig.messages); } @Bean TopicExchange exchange(){ return new TopicExchange("exchange"); } @Bean Binding bindingExchangeMessage(Queue queueMessage,TopicExchange exchange){ return BindingBuilder.bind(queueMessage).to(exchange).with("topic.message"); } @Bean Binding bindingExchangeMessages (Queue queueMessages,TopicExchange exchange){ return BindingBuilder.bind(queueMessages).to(exchange).with("topic.#"); }

}

使用queueMessages 同時匹配兩個隊列,queueMessage只匹配「topic.message」 public void send1(){ String context = "hi ,i am message1"; System.out.println("Sender: "+context); this.rabbitTemplate.convertAndSend("exchange","topic.message",context); }

public void send2(){ String context = "hi i am message2"; System.out.println("Sender :"+context); this.rabbitTemplate.convertAndSend("exchange","topic.message",context);

} --Fanout Exchange Fanout 是咱們熟悉的廣播模式或者訂閱模式。給Fanout交換機發送消息,綁定了這個交換機的全部隊列都收到這個消息。 Fanout @Configuration public class FaoutRabbitConfig{ @Bean public Queue AMessage(){ return new Queue("fanout.A"); }

@Bean public Queue BMessage(){ return new Queue("fanout.B"); } @Bean public Queue CMessage(){ return new Queue("fanout.C"); } @Bean FanoutExchange fanoutExchange(){ return new FanoutExchange("fanoutExchange"); } @Bean Binding bindingExchangeA(Queue AMessage,FanoutExchange fanoutExchange){ return BindingBuilder.bind(Amessage).to(fanoutExchange); } @Bean Binding bindingExchangeB(Queue BMessage,FanoutExchange fanoutExchange){ return BindingBuilder.bind(Bmessage).to(fanoutExchange); } @Bean Binding bindingExchangeC(Queue CMessage,FanoutExchange fanoutExchange){ return BindingBuilder.bind(CMessage).to(fanoutExchange); }

}

spring boot 定時任務

pom 包引入

spring boot starter 包

啓動定時註解

啓動類上加@EnableScheduling 開啓定時 @SpringBootApplication @EnableScheduling public class Application{

public static void main(String[] args){ SpringApplication.run(Application.class,args); }

}

####建立定時任務實現類 @Component public class SchedulerTask{ private int count = 0;

@Scheduled(cron="*/6 * * * *?")--@Scheduled(fixedTate = 6000) private void pricess(){ System.out.println("this is scheduler task runing "+(count++)); }

}

相關文章
相關標籤/搜索