Spring Boot企業(yè)常用的starter示例詳解
SpringBoot簡(jiǎn)介#
Spring Boot是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化新Spring應(yīng)用的初始搭建以及開發(fā)過(guò)程。該框架使用了特定的方式來(lái)進(jìn)行配置,從而使開發(fā)人員不再需要定義樣板化的配置。通過(guò)這種方式,Boot致力于在蓬勃發(fā)展的快速應(yīng)用開發(fā)領(lǐng)域(rapid application development)成為領(lǐng)導(dǎo)者。
Spring Boot讓我們的Spring應(yīng)用變的更輕量化。比如:你可以僅僅依靠一個(gè)Java類來(lái)運(yùn)行一個(gè)Spring引用。你也可以打包你的應(yīng)用為jar并通過(guò)使用java -jar來(lái)運(yùn)行你的Spring Web應(yīng)用。
Spring Boot的主要優(yōu)點(diǎn):
- 為所有Spring開發(fā)者更快的入門
- 開箱即用,提供各種默認(rèn)配置來(lái)簡(jiǎn)化項(xiàng)目配置
- 內(nèi)嵌式容器簡(jiǎn)化Web項(xiàng)目
- 沒有冗余代碼生成和XML配置的要求
在下面的代碼中只要有一定基礎(chǔ)會(huì)發(fā)現(xiàn)這寫代碼實(shí)例非常簡(jiǎn)單對(duì)于開發(fā)者來(lái)說(shuō)幾乎是“零配置”。
SpringBoot運(yùn)行#
開發(fā)工具:jdk8,IDEA,STS,eclipse(需要安裝STS插件)這些都支持快速啟動(dòng)SpringBoot工程。我這里就不快速啟動(dòng)了,使用maven工程。學(xué)習(xí)任何一項(xiàng)技術(shù)首先就要精通HelloWord,那我們來(lái)跑個(gè)初體驗(yàn)。
首先只用maven我們創(chuàng)建的maven工程直接以jar包的形式創(chuàng)建就行了,首先我們來(lái)引入SpringBoot的依賴
首先我們需要依賴SpringBoot父工程,這是每個(gè)項(xiàng)目中必須要有的。
<!--引入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>
我們啟動(dòng)WEB模塊當(dāng)然必須要引入WEB模塊的依賴
<dependencies> <!--引入SpringBoot-WEB模塊--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
我們需要編寫一個(gè)SpringBoot啟動(dòng)類,SpringbootFirstExperienceApplication.java
@SpringBootApplication public class SpringbootFirstExperienceApplication { public static void main(String[] args) { SpringApplication.run(SpringbootFirstExperienceApplication.class, args); } }
到了這里我們直接把他當(dāng)成SpringMVC來(lái)使用就行了,不過(guò)這里默認(rèn)是不支持JSP官方推薦使用模板引擎,后面會(huì)寫到整合JSP。這里我就不寫Controller了。
@SpringBootApplication:之前用戶使用的是3個(gè)注解注解他們的main類。分別是@Configuration,@EnableAutoConfiguration,@ComponentScan。由于這些注解一般都是一起使用,spring boot提供了一個(gè)統(tǒng)一的注解@SpringBootApplication。
注意事項(xiàng):我們使用這個(gè)注解在不指定掃描路徑的情況下,SpringBoot只能掃描到和SpringbootFirstExperienceApplication同包或子包的Bean;
SpringBoot目錄結(jié)構(gòu)#
在src/main/resources中我們可以有幾個(gè)文件夾:
templates:用來(lái)存儲(chǔ)模板引擎的,Thymeleaf,F(xiàn)reeMarker,Velocity等都是不錯(cuò)的選擇。
static:存儲(chǔ)一些靜態(tài)資源,css,js等
public:在默認(rèn)SpringBoot工程中是不生成這個(gè)文件夾的,但是在自動(dòng)配置中我們可以有這個(gè)文件夾用來(lái)存放公共的資源(html等)
application.properties:這個(gè)文件名字是固定的,SpringBoot啟動(dòng)會(huì)默認(rèn)加載這些配置在這里面可以配置端口號(hào),訪問路徑,數(shù)據(jù)庫(kù)連接信息等等。這個(gè)文件非常重要,當(dāng)然官方中推出了一個(gè)yml格式這是非常強(qiáng)大的數(shù)據(jù)格式。
整合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> <!--引入數(shù)據(jù)庫(kù)驅(qū)動(dòng)--> <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,雖然說(shuō)是“零配置”但是這些必要的肯定要指定,否則它怎么知道連那個(gè)數(shù)據(jù)庫(kù)?
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"; } }
這里我們直接返回一個(gè)文本格式。
@RestController#
在上面的代碼中我們使用到這個(gè)注解修改我們的Controller類而是不使用@Controller這個(gè)注解,其實(shí)中包含了@Controller,同時(shí)包含@ResponseBody既然修飾在類上面那么就是表示這個(gè)類中所有的方法都是@ResponseBody所以在這里我們返回字符串在前臺(tái)我們會(huì)以文本格式展示,如果是對(duì)象那么它會(huì)自動(dòng)轉(zhuǎn)換成json格式返回。
整合JSP#
在創(chuàng)建整合JSP的時(shí)候指定要選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我們只需要啟動(dòng)我們SpringBoot已經(jīng)集成好的模塊即可。
添加依賴:
<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> <!--啟動(dòng)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>
啟動(dòng)JPA組件后直接配置數(shù)據(jù)庫(kù)連接信息就可以使用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
實(shí)體類: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> <!--引入對(duì)JDBC的支持--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!--引入對(duì)logging的支持--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency> <!-- SpringBoot MyBatis啟動(dòng)器 --> <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 數(shù)據(jù)連接池地址############## #spring.datasource.type=com.alibaba.druid.pool.DruidDataSource #指定我們的mapper.xml位置 mybatis.mapper-locations=classpath:com/simple/springboot/mybatis/dao/mapper/*.xml #entity.class 指定我們實(shí)體類所在包位置 mybatis.type-aliases-package=com.simple.springboot.mybatis.entity
當(dāng)然這里還有很多屬性如果想要使用可以參考官方文檔。到了這里其他就不寫了,把他當(dāng)作SSM使用就ok。
注意事項(xiàng):在我們的Dao層接口中一定要在類上加上注解@Mapper否則無(wú)法掃描到。
AOP功能使用#
在我們SpringBoot中使用AOP非常簡(jiǎn)單。
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 { /** * 定義一個(gè)切入點(diǎn) * @author:SimpleWu * @Date:2018年10月12日 */ @Pointcut(value="execution(* com.simple.springboot.util.*.*(..))") public void aop(){} /** * 定義一個(gè)前置通知 * @author:SimpleWu * @Date:2018年10月12日 */ @Before("aop()") public void aopBefore(){ System.out.println("前置通知 SpringBootAspect....aopBefore"); } /** * 定義一個(gè)后置通知 * @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); } /** * 環(huán)繞通知 * @author:SimpleWu * @throws Throwable * @Date:2018年10月12日 */ @Around("aop()") public void around(ProceedingJoinPoint invocation) throws Throwable{ System.out.println("SpringBootAspect..環(huán)繞通知 Before"); invocation.proceed(); System.out.println("SpringBootAspect..環(huán)繞通知 After"); } }
任務(wù)調(diào)度#
SpringBoot已經(jīng)集成好一個(gè)調(diào)度功能。
@Component public class ScheduledTasks { private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); /** * 任務(wù)調(diào)度,每隔5秒執(zhí)行一次 * @author:SimpleWu * @Date:2018年10月12日 */ @Scheduled(fixedRate = 1000) public void reportCurrentTime() { System.out.println("現(xiàn)在時(shí)間:" + dateFormat.format(new Date())); } }
然后啟動(dòng)的時(shí)候我們必須要在主函數(shù)類上加上注解:@EnableScheduling(翻譯過(guò)來(lái)就是開啟調(diào)度)
/** * SpringBoot使用任務(wù)調(diào)度 * @EnableScheduling標(biāo)注程序開啟任務(wù)調(diào)度 * @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
進(jìn)入cd /etc/rabbitmq/ 創(chuàng)建vim rabbitmq.config
[{rabbit, [{loopback_users, []}]}].
這里的意思是開放使用,rabbitmq默認(rèn)創(chuàng)建的用戶guest,密碼也是guest,這個(gè)用戶默認(rèn)只能是本機(jī)訪問,localhost或者127.0.0.1,從外部訪問需要添加上面的配置。如果沒有找到清除日志
rm rabbit\@rabbit@localhost-sasl.log
最好還是直接sudo rabbitmqctl set_user_tags root administrator ,給root用戶賦值管理員權(quán)限
RabbitMQ,基本操作
# 添加開機(jī)啟動(dòng)RabbitMQ服務(wù) systemctl enable rabbitmq-server.service # 查看服務(wù)狀態(tài) systemctl status rabbitmq-server.service # 啟動(dòng)服務(wù) systemctl start rabbitmq-server.service # 停止服務(wù) systemctl stop rabbitmq-server.service # 查看當(dāng)前所有用戶 rabbitmqctl list_users # 查看默認(rèn)guest用戶的權(quán)限 rabbitmqctl list_user_permissions guest # 由于RabbitMQ默認(rèn)的賬號(hào)用戶名和密碼都是guest。為了安全起見, 先刪掉默認(rèn)用戶 rabbitmqctl delete_user guest # 添加新用戶 rabbitmqctl add_user username password # 設(shè)置用戶tag rabbitmqctl set_user_tags username administrator # 賦予用戶默認(rèn)vhost的全部操作權(quán)限 rabbitmqctl set_permissions -p / username ".*" ".*" ".*" # 查看用戶的權(quán)限 rabbitmqctl list_user_permissions username
如果只從命令行操作RabbitMQ,多少有點(diǎn)不方便。幸好RabbitMQ自帶了web管理界面,只需要啟動(dòng)插件便可以使用。
rabbitmq-plugins enable rabbitmq_management
訪問: http://服務(wù)器IP:15672
整合RabbitMq
導(dǎo)入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> <!--設(shè)置JAVA版本--> <properties> <java.version>1.8</java.version> </properties> <!--引入依賴--> <dependencies> <!--啟動(dòng)RabbitmQ--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <!--啟動(dòng)WEB--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--啟動(dòng)TEST--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
設(shè)置application.properties配置文件
spring.application.name=springboot-rabbitmq #RabbitMq所在服務(wù)器IP spring.rabbitmq.host=192.168.197.133 #連接端口號(hào) spring.rabbitmq.port=5672 #用戶名 spring.rabbitmq.username=root #用戶密碼 spring.rabbitmq.password=123456 # 開啟發(fā)送確認(rèn) spring.rabbitmq.publisher-confirms=true # 開啟發(fā)送失敗退回 spring.rabbitmq.publisher-returns=true spring.rabbitmq.virtual-host=/
創(chuàng)建RabbitMq隊(duì)列初始化類,初始化隊(duì)列
/** * @author SimpleWu * @Date 2019-05-17 * 該類初始化隊(duì)列 */ @Configuration public class RabbitMqInitialization { /** * 創(chuàng)建隊(duì)列 隊(duì)列名字為SayQueue * @return */ @Bean public Queue SayQueue() { return new Queue("SayQueue"); } }
創(chuàng)建生產(chǎn)者
/** * @author SimpleWu * @Date 2019-05-17 * 生產(chǎn)者 */ @Component public class SayProducer { @Autowired private RabbitTemplate rabbitTemplate; public void send(String name){ String sendMsg = "hello: " + name + " " + new Date(); //指定隊(duì)列 this.rabbitTemplate.convertAndSend("SayQueue", sendMsg); } }
創(chuàng)建消費(fèi)者
@RabbitListener:當(dāng)監(jiān)聽到隊(duì)列 SayQueue 中有消息時(shí)則會(huì)進(jìn)行接收并處理
@RabbitHandler :標(biāo)注在類上面表示當(dāng)有收到消息的時(shí)候,就交給 @RabbitHandler 的方法處理,具體使用哪個(gè)方法處理,根據(jù) MessageConverter 轉(zhuǎn)換后的參數(shù)類型
/** * @author SimpleWu * @Date 2019-05-17 * 消費(fèi)者 * queues 指定監(jiān)聽的隊(duì)列 */ @Component @RabbitListener(queues = "SayQueue") public class SayConsumer { @RabbitHandler public void process(String hello) { System.out.println("SayConsumer : " + hello); } }
創(chuàng)建接口進(jìn)行測(cè)試
@RestController public class SayController { @Autowired private SayProducer sayProducer; @RequestMapping("/send/{name}") public String send(@PathVariable String name){ sayProducer.send(name); return "Send Succcess SimpleWu"; } }
啟動(dòng)類就用IDEA默認(rèn)生成的就好了。
http://10.192.132.22:8080/send/First 發(fā)送請(qǐng)求
消費(fèi)者接受消息:SayConsumer : hello: First Tue May 07 17:57:02 CST 2019
注:在傳輸對(duì)象時(shí)一定要序列化
整合郵件發(fā)送#
導(dǎo)入依賴
<!--啟動(dòng)郵箱發(fā)送依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
配置Properties文件
#根據(jù)類型配置 spring.mail.host=smtp.qq.com spring.mail.port=465 spring.mail.username=450255266@qq.com #對(duì)于qq郵箱而言 密碼指的就是發(fā)送方的授權(quán)碼 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 #是否用啟用加密傳送的協(xié)議驗(yàn)證項(xiàng) #注意:在spring.mail.password處的值是需要在郵箱設(shè)置里面生成的授權(quán)碼,這個(gè)不是真實(shí)的密碼。
spring.mail.host 需要根據(jù)不同的郵箱類型配置不同的服務(wù)器地址
發(fā)送郵箱
/** * @author SimpleWu * @data 2019=05-17 * 發(fā)送郵件 */ @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("標(biāo)題:發(fā)送Html內(nèi)容"); 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);//設(shè)置true發(fā)送html郵件 //帶附件 //FileSystemResource fileSystemResource=new FileSystemResource(new File("D:\2019-05-07.pdf")); //helper.addAttachment("郵箱附件",fileSystemResource); javaMailSender.send(message); } catch (MessagingException e) { e.printStackTrace(); } } }
注:最好使用異步接口發(fā)送郵件,并且發(fā)送郵件的服務(wù)器為單獨(dú)部署。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
- 手?jǐn)]一個(gè) spring-boot-starter的全過(guò)程
- 聊一聊帶智能提示的spring-boot-starter
- 使用SpringBoot自定義starter的完整步驟
- SpringBoot自動(dòng)配置之自定義starter的實(shí)現(xiàn)代碼
- springboot自定義redis-starter的實(shí)現(xiàn)
- SpringBoot2.1.x,創(chuàng)建自己的spring-boot-starter自動(dòng)配置模塊操作
- SpringBoot如何實(shí)現(xiàn)starter原理詳解
- SpringBoot啟動(dòng)器Starters使用及原理解析
- springboot自定義starter實(shí)現(xiàn)過(guò)程圖解
- Spring boot創(chuàng)建自定義starter的完整步驟
- 如何手寫一個(gè)Spring Boot Starter
相關(guān)文章
Springboot整合thymleaf模板引擎過(guò)程解析
這篇文章主要介紹了Springboot整合thymleaf模板引擎過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11Java實(shí)現(xiàn)將文件或者文件夾壓縮成zip的詳細(xì)代碼
這篇文章主要介紹了Java實(shí)現(xiàn)將文件或者文件夾壓縮成zip的詳細(xì)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11java 正則,object中兩個(gè)方法的使用(詳解)
下面小編就為大家?guī)?lái)一篇java 正則,object中兩個(gè)方法的使用(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08SpringBoot+TestNG單元測(cè)試的實(shí)現(xiàn)
本文主要介紹了SpringBoot+TestNG單元測(cè)試的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07