Spring Boot:企業常用的 Starter以及實現


來源:cnblogs.com/SimpleWu/p/9798146.html
# 目錄
  • SpringBoot簡介

  • SpringBoot運行

  • SpringBoot目錄結構

  • 整合JdbcTemplate

  • @RestController

  • 整合JSP

  • 整合JPA

  • 整合MyBatis

  • AOP功能使用

  • 任務調度

  • 整合RabbitMq

  • 整合郵件發送


# SpringBoot簡介


Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。通過這種方式,Boot致力於在蓬勃發展的快速應用開發領域(rapid application development)成爲領導者。

Spring Boot讓我們的Spring應用變的更輕量化。比如:你可以僅僅依靠一個Java類來運行一個Spring引用。你也可以打包你的應用爲jar並通過使用java -jar來運行你的Spring Web應用。

Spring Boot的主要優點:

1、爲所有Spring開發者更快的入門
2、開箱即用,提供各種默認配置來簡化項目配置
3、內嵌式容器簡化Web項目
4、沒有冗餘代碼生成和XML配置的要求

在下面的代碼中只要有一定基礎會發現這寫代碼實例非常簡單對於開發者來說幾乎是“零配置”。

# SpringBoot運行


開發工具:jdk8,IDEA,STS,eclipse(需要安裝STS插件)這些都支持快速啓動SpringBoot工程。我這裏就不快速啓動了,使用maven工程。學習任何一項技術首先就要精通HelloWord,那我們來跑個初體驗。

首先只用maven我們創建的maven工程直接以jar包的形式創建就行了,首先我們來引入SpringBoot的依賴

首先我們需要依賴SpringBoot父工程,這是每個項目中必須要有的。
   
   
   
<!--引入SpringBoot父依賴--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> </parent> <!--編碼與JAVA版本--> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties>

   
   
   

我們啓動WEB模塊當然必須要引入WEB模塊的依賴
   
   
   
<dependencies> <!--引入SpringBoot-WEB模塊--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>

   
   
   

我們需要編寫一個SpringBoot啓動類,
   
   
   
SpringbootFirstExperienceApplication.java@SpringBootApplication public class SpringbootFirstExperienceApplication {
public static void main(String[] args) { SpringApplication.run(SpringbootFirstExperienceApplication.class, args); } }

到了這裏我們直接把他當成SpringMVC來使用就行了,不過這裏默認是不支持JSP官方推薦使用模板引擎,後面會寫到整合JSP。這裏我就不寫Controller了。

@SpringBootApplication:之前用戶使用的是3個註解註解他們的main類。分別是@Configuration,@EnableAutoConfiguration,@ComponentScan。由於這些註解一般都是一起使用,spring boot提供了一個統一的註解@SpringBootApplication。

注意事項:我們使用這個註解在不指定掃描路徑的情況下,SpringBoot只能掃描到和SpringbootFirstExperienceApplication同包或子包的Bean;


# SpringBoot目錄結構


SpringBoot目錄結構# 在src/main/resources中我們可以有幾個文件夾:

templates: 用來存儲模板引擎的,Thymeleaf,FreeMarker,Velocity等都是不錯的選擇。

static: 存儲一些靜態資源,css,js等

public: 在默認SpringBoot工程中是不生成這個文件夾的,但是在自動配置中我們可以有這個文件夾用來存放公共的資源(html等)

application.properties: 這個文件名字是固定的,SpringBoot啓動會默認加載這些配置在這裏面可以配置端口號,訪問路徑,數據庫連接信息等等。這個文件非常重要,當然官方中推出了一個yml格式這是非常強大的數據格式。

# 整合JdbcTemplate


引入依賴:
 <parent>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-parent</artifactId>  <version>1.5.2.RELEASE</version> </parent> <dependencies>        <!--引入WEB模塊-->  <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-web</artifactId>  </dependency>         <!--引入JDBC模塊-->  <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-jdbc</artifactId>  </dependency>         <!--引入數據庫驅動-->  <dependency>   <groupId>mysql</groupId>   <artifactId>mysql-connector-java</artifactId>  </dependency>  <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-test</artifactId>   <scope>test</scope>  </dependency> </dependencies>

   
   
   

配置application.properties,雖然說是“零配置”但是這些必要的肯定要指定,否則它怎麼知道連那個數據庫?
   
   
   
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver

   
   
   

使用方式:
   
   
   
@Service public class EmployeeService { @Autowired private JdbcTemplate jdbcTemplate; public boolean saveEmp(String name,String email,String gender){ String sql = "insert into tal_employee values(null,?,?,?)"; int result = jdbcTemplate.update(sql, name,email,gender); System.out.println("result : " + result); return result > 0 ? true:false; } }

   
   
   

   
   
   
@RestController public class EmployeeController { @Autowired private EmployeeService employeeService; @RequestMapping("/save") public String insert(String name,String email,String gender){ boolean result = employeeService.saveEmp(name, email, gender); if(result){ return "success"; } return "error"; } }

   
   
   

這裏我們直接返回一個文本格式。

# @RestController


在上面的代碼中我們使用到這個註解修改我們的Controller類而是不使用@Controller這個註解,其實中包含了@Controller,同時包含@ResponseBody既然修飾在類上面那麼就是表示這個類中所有的方法都是@ResponseBody所以在這裏我們返回字符串在前臺我們會以文本格式展示,如果是對象那麼它會自動轉換成json格式返回。

# 整合JSP


在創建整合JSP的時候指定要選WAR,一定要選WAR。

引入依賴:
   
   
   
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> </parent> <dependencies> <!-- SpringBoot WEB組件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 整合JSP依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> </dependencies>

   
   
   

然後我們只需要配置試圖解析器路徑就可以了。
   
   
   
#配置試圖解析器前綴 spring.mvc.view.prefix=/WEB-INF/views/ #配置試圖解析器後綴 spring.mvc.view.suffix=.jsp

   
   
   

# 整合JPA


同樣的整合JPA我們只需要啓動我們SpringBoot已經集成好的模塊即可。

添加依賴:
   
   
   
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--啓動JPA組件--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies>

   
   
   

啓動JPA組件後直接配置數據庫連接信息就可以使用JPA功能。

Application.properties
   
   
   
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver

   
   
   

實體類:Employee.java
   
   
   
@Table(name="tal_employee") @Entity public class Employee implements Serializable{ @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; @Column(name="last_Name") private String lastName; private String email; private String gender; //get set 省略 }

   
   
   

EmployeeDao接口:
   
   
   
public interface EmployeeDao extends JpaRepository<Employee, Integer>{ }

   
   
   

EmployeeController.java:
   
   
   
@Controller public class EmployeeController { @Autowired private EmployeeDao employeeDao;
@ResponseBody @RequestMapping("/emps") public List<Employee> getEmployees(){ List<Employee> employees = employeeDao.findAll(); System.out.println(employees); return employees; } }

   
   
   

# 整合MyBatis


引入依賴:
   
   
   
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--引入對JDBC的支持--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!--引入對logging的支持--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency> <!-- SpringBoot MyBatis啓動器 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies>

   
   
   

配置application.properties
   
   
   
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver ##############datasource classpath 數據連接池地址############## #spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#指定我們的mapper.xml位置 mybatis.mapper-locations=classpath:com/simple/springboot/mybatis/dao/mapper/*.xml #entity.class 指定我們實體類所在包位置 mybatis.type-aliases-package=com.simple.springboot.mybatis.entity

   
   
   

當然這裏還有很多屬性如果想要使用可以參考官方文檔。到了這裏其他就不寫了,把他當作SSM使用就ok。

注意事項:在我們的Dao層接口中一定要在類上加上註解@Mapper否則無法掃描到。

# AOP功能使用


在我們SpringBoot中使用AOP非常簡單。
   
   
   
package com.simple.springboot.aop;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component;
@Aspect @Component public class SpringBootAspect { /** * 定義一個切入點 * @author:SimpleWu * @Date:2018年10月12日 */ @Pointcut(value="execution(* com.simple.springboot.util.*.*(..))") public void aop(){} /** * 定義一個前置通知 * @author:SimpleWu * @Date:2018年10月12日 */ @Before("aop()") public void aopBefore(){ System.out.println("前置通知 SpringBootAspect....aopBefore"); } /** * 定義一個後置通知 * @author:SimpleWu * @Date:2018年10月12日 */ @After("aop()") public void aopAfter(){ System.out.println("後置通知 SpringBootAspect....aopAfter"); } /** * 處理未處理的JAVA異常 * @author:SimpleWu * @Date:2018年10月12日 */ @AfterThrowing(pointcut="aop()",throwing="e") public void exception(Exception e){ System.out.println("異常通知 SpringBootAspect...exception .." + e); } /** * 環繞通知 * @author:SimpleWu * @throws Throwable * @Date:2018年10月12日 */ @Around("aop()") public void around(ProceedingJoinPoint invocation) throws Throwable{ System.out.println("SpringBootAspect..環繞通知 Before"); invocation.proceed(); System.out.println("SpringBootAspect..環繞通知 After"); } }

   
   
   

# 任務調度


SpringBoot已經集成好一個調度功能。
   
   
   
@Component public class ScheduledTasks { private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); /** * 任務調度,每隔5秒執行一次 * @author:SimpleWu * @Date:2018年10月12日 */ @Scheduled(fixedRate = 1000) public void reportCurrentTime() { System.out.println("現在時間:" + dateFormat.format(new Date())); } }

   
   
   

然後啓動的時候我們必須要在主函數類上加上註解:@EnableScheduling(翻譯過來就是開啓調度)
   
   
   
/** * SpringBoot使用任務調度 * @EnableScheduling標註程序開啓任務調度 * @author :SimpleWu * @Date:2018年10月12日 */
@SpringBootApplication @EnableScheduling public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }

   
   
   

# 整合RabbitMq


安裝RabbitMq 由於RabbitMQ依賴Erlang, 所以需要先安裝Erlang。
   
   
   
sudo yum install -y make gcc gcc-c++ m4 openssl openssl-devel ncurses-devel unixODBC unixODBC-devel java java-devel sudo yum install epel-release sudo yum install erlang sudo yum install socat

   
   
   

下載RabbitMQ,並且安裝
   
   
   
sudo wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.15/rabbitmq-server-3.6.15-1.el7.noarch.rpm sudo yum install rabbitmq-server-3.6.15-1.el7.noarch.rpm

   
   
   

進入cd /etc/rabbitmq/ 創建vim rabbitmq.config
   
   
   
[{rabbit, [{loopback_users, []}]}].

   
   
   

這裏的意思是開放使用,rabbitmq默認創建的用戶guest,密碼也是guest,這個用戶默認只能是本機訪問,localhost或者127.0.0.1,從外部訪問需要添加上面的配置。如果沒有找到清除日誌
   
   
   
rm rabbit\@rabbit@localhost-sasl.log

   
   
   

最好還是直接sudo rabbitmqctl set_user_tags root administrator ,給root用戶賦值管理員權限 RabbitMQ,基本操作
   
   
   
# 添加開機啓動RabbitMQ服務 systemctl enable rabbitmq-server.service # 查看服務狀態 systemctl status rabbitmq-server.service # 啓動服務 systemctl start rabbitmq-server.service # 停止服務 systemctl stop rabbitmq-server.service # 查看當前所有用戶 rabbitmqctl list_users # 查看默認guest用戶的權限 rabbitmqctl list_user_permissions guest # 由於RabbitMQ默認的賬號用戶名和密碼都是guest。爲了安全起見, 先刪掉默認用戶 rabbitmqctl delete_user guest # 添加新用戶 rabbitmqctl add_user username password # 設置用戶tag rabbitmqctl set_user_tags username administrator # 賦予用戶默認vhost的全部操作權限 rabbitmqctl set_permissions -p / username ".*" ".*" ".*" # 查看用戶的權限 rabbitmqctl list_user_permissions username

   
   
   

如果只從命令行操作RabbitMQ,多少有點不方便。幸好RabbitMQ自帶了web管理界面,只需要啓動插件便可以使用。
   
   
   
rabbitmq-plugins enable rabbitmq_management

   
   
   

訪問: http://服務器IP:15672
整合RabbitMq
導入Maven依賴
   
   
   
<!--SpringBoot2.x--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <!--設置JAVA版本--> <properties> <java.version>1.8</java.version> </properties> <!--引入依賴--> <dependencies> <!--啓動RabbitmQ--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <!--啓動WEB--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--啓動TEST--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>

   
   
   

設置application.properties配置文件
   
   
   
spring.application.name=springboot-rabbitmq #RabbitMq所在服務器IP spring.rabbitmq.host=192.168.197.133 #連接端口號 spring.rabbitmq.port=5672 #用戶名 spring.rabbitmq.username=root #用戶密碼 spring.rabbitmq.password=123456 # 開啓發送確認 spring.rabbitmq.publisher-confirms=true # 開啓發送失敗退回 spring.rabbitmq.publisher-returns=true spring.rabbitmq.virtual-host=/

   
   
   

創建RabbitMq隊列初始化類,初始化隊列
   
   
   
/** * @author SimpleWu * @Date 2019-05-17 * 該類初始化隊列 */ @Configuration public class RabbitMqInitialization {
/** * 創建隊列 隊列名字爲SayQueue * @return */ @Bean public Queue SayQueue() { return new Queue("SayQueue"); }
}

   
   
   

創建生產者
   
   
   
/** * @author SimpleWu * @Date 2019-05-17 * 生產者 */ @Component public class SayProducer {
@Autowired private RabbitTemplate rabbitTemplate;
public void send(String name){ String sendMsg = "hello: " + name + " " + new Date(); //指定隊列 this.rabbitTemplate.convertAndSend("SayQueue", sendMsg); } }

   
   
   

創建消費者 @RabbitListener:當監聽到隊列 SayQueue 中有消息時則會進行接收並處理 @RabbitHandler :標註在類上面表示當有收到消息的時候,就交給 @RabbitHandler 的方法處理,具體使用哪個方法處理,根據 MessageConverter 轉換後的參數類型
   
   
   
/** * @author SimpleWu * @Date 2019-05-17 * 消費者 * queues 指定監聽的隊列 */
@Component @RabbitListener(queues = "SayQueue") public class SayConsumer {
@RabbitHandler public void process(String hello) { System.out.println("SayConsumer : " + hello); }
}

   
   
   

創建接口進行測試
   
   
   
@RestController public class SayController {
@Autowired private SayProducer sayProducer;
@RequestMapping("/send/{name}") public String send(@PathVariable String name){ sayProducer.send(name); return "Send Succcess SimpleWu"; }
}

   
   
   

啓動類就用IDEA默認生成的就好了。http://10.192.132.22:8080/send/First 發送請求 消費者接受消息:SayConsumer : hello: First Tue May 07 17:57:02 CST 2019 注:在傳輸對象時一定要序列化


# 整合郵件發送


導入依賴
   
   
   
<!--啓動郵箱發送依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>

   
   
   

配置Properties文件

   
   
   
#根據類型配置spring.mail.host=smtp.qq.comspring.mail.port=465spring.mail.username=450255266@qq.com#對於qq郵箱而言 密碼指的就是發送方的授權碼spring.mail.password=看不見我-0-spring.mail.protocol=smtpspring.mail.properties.mail.smtp.auth=truespring.mail.properties.mail.smtp.ssl.enable=truespring.mail.default-encoding=UTF-8#是否用啓用加密傳送的協議驗證項#注意:在spring.mail.password處的值是需要在郵箱設置裏面生成的授權碼,這個不是真實的密碼。

   
   
   


   
   
   
spring.mail.host 需要根據不同的郵箱類型配置不同的服務器地址 發送郵箱
   
   
   
/** * @author SimpleWu * @data 2019=05-17 * 發送郵件 */ @Component public class EmailService { @Autowired private JavaMailSender javaMailSender;
public void sendSimpleMail(){ MimeMessage message = null; try { message = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom("[email protected]"); helper.setTo("[email protected]"); helper.setSubject("標題:發送Html內容");
StringBuffer context = new StringBuffer(); context.append("<p style='color:red'>"); context.append("Hello SpringBoot Email Start SimpleWu!!"); context.append("</p>"); helper.setText(context.toString(),true);//設置true發送html郵件
//帶附件 //FileSystemResource fileSystemResource=new FileSystemResource(new File("D:\2019-05-07.pdf")); //helper.addAttachment("郵箱附件",fileSystemResource); javaMailSender.send(message); } catch (MessagingException e) { e.printStackTrace(); } } }

   
   
   

注:最好使用異步接口發送郵件,並且發送郵件的服務器爲單獨部署。


     
     
     
      
           
           
           
題外話: 推薦一個GitHub項目 ,這個 GitHub 整理了上百本常用技術PDF,絕大部分核心的技術書籍都可以在這裏找到,GitHub地址:https://github.com/gsjqwyl/awesome-ebook(電腦打開體驗更好),地址閱讀原文直達。麻煩打個給個Star,持續更新中...


---END---

文末福利

本文分享自微信公衆號 - Java專欄(finishbug)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章