SpringBoot企業常用的starter


SpringBoot企業常用的starter

Editor:SimpleWu

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目錄結構

在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.com
spring.mail.port=465
spring.mail.username=450255266@qq.com
#對於qq郵箱而言 密碼指的就是發送方的授權碼
spring.mail.password=看不見我-0-
spring.mail.protocol=smtp
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.ssl.enable=true
spring.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("450255266@qq.com");
            helper.setTo("450255266@qq.com");
            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();
        }
    }
}

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM