首页 » SEO优化 » php整点履行技巧_SpringBoot开拓单体应用三

php整点履行技巧_SpringBoot开拓单体应用三

访客 2024-12-08 0

扫一扫用手机浏览

文章目录 [+]

众所周知,CRUD是每个程序员的必经之路。
作为一个低级程序员,只要能够独立开拓出一个大略的CRUD系统即可,例如OA系统、CRM管理系统、基于表单的CRUD系统等。

大略来说,分布式开拓是后端供应接口,前端吸收信息进行渲染;单体开拓是后端供应数据,前端获取数据进行渲染。

php整点履行技巧_SpringBoot开拓单体应用三

从开拓流程来说,单体开拓和分布式开拓实质上并没有差异,只是用到的技能和思想上略有不同。

php整点履行技巧_SpringBoot开拓单体应用三
(图片来自网络侵删)

分布式开拓的实质:网络是不可靠的,我们须要办理做事之间的通信问题,例如做事崩溃了的办理方案,客户端如何去进行访问,做事的注册和创造等。

Swagger

什么是Swagger?

在前后端分离的项目当中,开拓职员的分工大概如下:

前端紧张专注于掌握层和视图层,由专业的前端团队进行开拓。
后端紧张专注于后端掌握层、做事层和数据访问层,由专业的后端团队进行开拓。

那么问题来了,前后真个交互一样平常都是通过API来进行的,关于API的约定该当如何处理呢?

在早期的时候,一样平常由后端编写协同文档,前端根据文档解析接口然后渲染视图。
但问题也很明显,前端和后端之间无法做到及时协商,终极可能导致问题集中爆发或者项目延时。

为理解决这些问题,Swagger应运而生。

什么是Swagger?

Swagger是一个规范和完全的框架,用于天生、描述、调用和可视化 RESTful风格的Web做事。
总体目标是使客户端和文件系统作为做事器以同样的速率来更新。
文件的方法,参数和模型紧密集成到做事器真个代码,许可API来始终保持同步。

Swagger的浸染紧张有两点:接口的文档在线自动天生和功能测试。

现在的开源项目中,都会集成Swagger。

Swagger的紧张特点

号称天下上最盛行的API框架。
Restful API自动天生文档,和代码对应。
直接运行测试接口,不须要下载postman了。
支持多种措辞,如Java、Php等。

Swagger官网地址::https://swagger.io/

集成Swagger

根本集成

1、导入Swagger2依赖。

<!--swaggger2依赖--><!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 --><dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version></dependency><!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui --><dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version></dependency>

2、编写Swagger配置类,注册Docket到Spring容器中,在主启动类上添加@EnableSwagger2开启配置使Swagger生效。

//Swagger配置类@Configuration public class SwaggerConfig { ​ // 注册bean Docket @Bean public Docket docket(){ return new Docket(DocumentationType.SWAGGER_2); } }​//主启动类@SpringBootApplication@EnableSwagger2 //使swagger生效,默认不开启public class SpringbootPlusApplication {​ public static void main(String[] args) { SpringApplication.run(SpringbootPlusApplication.class, args); }​}

3、启动项目进行测试,Swagger API文档默认访问地址:http://localhost:8080/swagger-ui.html

把稳在Controller的方法要求路径映射不要利用@RequestMapping来配置,该当直策应器具体要求方法的表明,如@GetMapping、@PostMapping等。
由于利用@RequestMapping配置在API文档上一个方法默认会天生七种要求的API文档信息,如下图所示。

配置Swagger

1、在SwaggerConfig类中配置文档信息,布局ApiInfo工具。

@Beanpublic Docket docket(){ return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo())//配置文档信息} //配置文档信息apiInfoprivate ApiInfo apiInfo(){​ Contact contact = new Contact("wunian", "https://www.jianshu.com/u/5e27029e243f", "1796608443@qq.com");​ return new ApiInfo( "SpringBoot-Plus接口文档信息",//文档标题 "所有的测试要求地址",//文档描述 "v1.0",//文档版本 "https://www.jianshu.com/u/5e27029e243f",//组织链接 contact, "Apache 2.0", "http://www.apache.org/licenses/LICENSE-2.0", new ArrayList<>());}

2、配置哪些接口须要被扫描到文档中。

@Beanpublic Docket docket(){ return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.wunian.controller"))//设置扫描指定包下的类 .build();}

RequestHandlerSelectors类的所有静态方法解释:

any():扫描所有,项目的所有接口都会被扫描。
none():不扫描接口。
basePackage():根据包路径扫描。
withMethodAnnotation(GetMapping.class):通过方法表明扫描。
withClassAnnotation(Controller.class):通过类上的表明扫描。

3、设置哪些接口不被扫描。

@Beanpublic Docket docket(){ return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.wunian.controller"))//设置扫描指定包下的类 //配置path过滤要求,只扫描以/kuang开头的要求 .paths(PathSelectors.ant("/kuang/")) .build();}

PathSelectors类的所有静态方法解释:

ant(String antPattern):只扫描指定的路径下的要求。
any():任何要求都会被扫描。
none():不扫描要求。
regex(String pathRegex):通过正则表达式来匹配要求。

配置Swagger开关

如果我们要让swagger-ui页面只在test和dev环境下显示,prod环境不显示就须要配置enable(false)方法。

@Beanpublic Docket docket(){ return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .enable(false)//如果是false就无法在浏览器中访问swagger-ui.html .select() .apis(RequestHandlerSelectors.basePackage("com.wunian.controller"))// .paths(PathSelectors.ant("/kuang/")) .build();}

不过直接在enable方法中传入false也不得当,它该当是一个变量,我们可以通过Profiles类来获取限定的开拓环境,并且调用Environment工具的acceptsProfiles方法来判断当前环境是否是限定的开拓环境。

@Beanpublic Docket docket(Environment environment){ //设置要显示的swagger环境 Profiles of = Profiles.of("dev", "test"); //判断是否处于该环境 boolean isEnable=environment.acceptsProfiles(of); return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .enable(isEnable) //如果是false,就无法在浏览器中访问 .select() .apis(RequestHandlerSelectors.basePackage("com.wunian.controller")) .paths(PathSelectors.ant("/kuang/")) .build();}配置API分组

这个配置只须要理解即可,往后可以利用MyBatis-Plus一键天生。

@Beanpublic Docket docket1(){ return new Docket(DocumentationType.SWAGGER_2).groupName("group1");}​@Beanpublic Docket docket2(){ return new Docket(DocumentationType.SWAGGER_2).groupName("group2");}​@Beanpublic Docket docket3(){ return new Docket(DocumentationType.SWAGGER_2).groupName("group3");}

实体配置

1、新建一个实体类,类上利用@ApiModel表明来添加该实体类的描述信息,此表明实在便是注释,只不过它会被Swagger识别。

//和注释差不多,但是会被swagger识别@ApiModel("用户实体") //实体类的描述信息public class User {//只有在controller中返回值用到,这个类才会显示在swagger中​ @ApiModelProperty("用户名") private String username; @ApiModelProperty("密码") private String password;}

2、要求的接口配置,如果要在swagger-ui.html中看到实体类的配置,那么这个实体类一定是在要求的返回值或者泛型中,只有这样它才会被映射。

//只有返回值用到才会显示@GetMapping("/getUser")public User getUser(){ return new User();}

接口上的配置

在类上利用@Api表明来添加类的描述信息,在方法上利用@ApiOperation表明来添加方法的描述信息,在方法的形参上利用@ApiParam表明来添加参数的描述信息。

@Api(tags="Hello测试类") //类的描述信息@RestControllerpublic class HelloController {​ @GetMapping("/kuang/hello") public String hello(){ return "Hello Swagger"; }​ //只有返回值用到才会显示 @GetMapping("/getUser") public User getUser(){ return new User(); } // 后面我们自己开拓项目的时候,紧张是写方法注释和参数注释!
@ApiOperation("coding的接口") //方法和接口的描述信息 @PutMapping("/coding") public String coding(@ApiParam("用户名") String username){//参数的描述信息 return username; }}

Swagger接口文档的皮肤包(扩展)

1、默认的皮肤包: http://localhost:8080/swagger-ui.html

<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui --><dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version></dependency>

2、bootstrap-ui: http://localhost:8080/doc.html

<!-- https://mvnrepository.com/artifact/com.github.xiaoymin/swagger-bootstrap-ui --> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>swagger-bootstrap-ui</artifactId> <version>1.9.6</version> </dependency>

3、ui-layer:http://localhost:8080/docs.html

<!-- https://mvnrepository.com/artifact/com.github.caspar-chen/swagger-ui-layer - -><dependency> <groupId>com.github.caspar-chen</groupId> <artifactId>swagger-ui-layer</artifactId> <version>1.1.3</version> </dependency>

4、mg-ui: http://localhost:8080/document.html

<dependency> <groupId>com.zyplayer</groupId> <artifactId>swagger-mg-ui</artifactId> <version>1.0.6</version> </dependency>

异步任务

我们可以来仿照一个延时的异步处理要求。

1、在业务方法中添加@Async表明,此表明相称于见告Spring这是一个异步任务,默认利用线程池开启异步任务,效率很高。

@Servicepublic class AsyncService {​ //仿照一个延时的后台方法 @Async //见告spring这是一个异步方法,默认利用了线程池 public void hello(){ try{ Thread.sleep(3000); }catch(InterruptedException e){ e.printStackTrace(); } System.out.println("数据处理中......"); }}

2、在主启动类上添加@EnableAsync开启异步任务支持。

@SpringBootApplication@EnableSwagger2 //使swagger生效,默认不开启@EnableAsync //开启异步任务的支持public class SpringbootPlusApplication {​ public static void main(String[] args) { SpringApplication.run(SpringbootPlusApplication.class, args); }}

3、启动项目进行测试,页面如果涌现秒级刷新,解释测试成功。

定时任务

Cron表达式

操持任务,是指任务在约定的韶光实行已经操持好的事情,这只是表面的意思。
在Linux中,我们常常用到Cron做事器来完成这项事情。
Cron做事器可以根据配置文件约定的韶光来实行特定的任务。

实际上在分前面还有秒,范围在0-59之间。

一些分外符号的含义:

表示任意韶光。
-表示区间。
L表示末了。
?用在日或星期上,表示不愿定值、不限定值。
W表示事情日,这里的事情日指的是朝九晚五,双休和节假日。
#用于星期上,#后面的数字表示第几周,如果不存在这个周的值,则不实行。

这些分外符号实在不用刻意去影象,我们想要编写Cron表达式只须要去找在线天生Cron表达式的网站去生造诣好了。

常用的Cron表达式:

(1)0/2 ? 表示每2秒 实行任务 (1)0 0/2 ? 表示每2分钟 实行任务 (1)0 0 2 1 ? 表示在每月的1日的凌晨2点调度任务 (2)0 15 10 ? MON-FRI 表示周一到周五每天上午10:15实行作业 (3)0 15 10 ? 6L 2002-2006 表示2002-2006年的每个月的末了一个星期五上午10:15实行作 (4)0 0 10,14,16 ? 每天上午10点,下午2点,4点 (5)0 0/30 9-17 ? 朝九晚五事情韶光内每半小时 (6)0 0 12 ? WED 表示每个星期三中午12点 (7)0 0 12 ? 每天中午12点触发 (8)0 15 10 ? 每天上午10:15触发 (9)0 15 10 ? 每天上午10:15触发 (10)0 15 10 ? 每天上午10:15触发 (11)0 15 10 ? 2005 2005年的每天上午10:15触发 (12)0 14 ? 在每天下午2点到下午2:59期间的每1分钟触发 (13)0 0/5 14 ? 在每天下午2点到下午2:55期间的每5分钟触发 (14)0 0/5 14,18 ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 (15)0 0-5 14 ? 在每天下午2点到下午2:05期间的每1分钟触发 (16)0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发 (17)0 15 10 ? MON-FRI 周一至周五的上午10:15触发 (18)0 15 10 15 ? 每月15日上午10:15触发 (19)0 15 10 L ? 每月末了一日的上午10:15触发 (20)0 15 10 ? 6L 每月的末了一个星期五上午10:15触发 (21)0 15 10 ? 6L 2002-2005 2002年至2005年的每月的末了一个星期五上午10:15触发 (22)0 15 10 ? 6#3 每月的第三个星期五上午10:15触发

编写定时任务

1、编写Service,在定时方法上添加@Scheduled表明,该表明传入一个cron参数,此参数传入一个Cron表达式。

@Service //放到spring容器中public class ScheduledService {​ //事情中的定时任务都可以利用这样的方法 //秒 分 时 日 月 周几 @Scheduled(cron = "0 0-7") //每天每时每分整点实行 public void hello(){ System.out.println("Hello Scheduled"); }}

2、在主启动类上添加@EnableScheduling表明开启定时任务支持。

@SpringBootApplication@EnableSwagger2 //使swagger生效,默认不开启@EnableAsync //开启异步任务的支持@EnableScheduling//开启定时任务支持public class SpringbootPlusApplication {​ public static void main(String[] args) { SpringApplication.run(SpringbootPlusApplication.class, args); }}

3、启动项目进行测试,可以看到每一分钟的整点都会输出"Hello Scheduled"。

邮件任务

所有的网站,险些都有邮件收发功能。
我们这里以QQ邮箱为例,基于SpringBoot来实现发送邮件功能。

邮箱的开拓者权限获取 比较于其他邮箱,QQ邮箱较为繁芜,由于它有安全验证。
我们须要登录QQ邮箱去开启一下SMTP做事,详细操作步骤如下图所示。
然后我们就可以得到一个授权码了,它相称于我们的邮箱账号的密码,通过它可以登录我们的邮箱。
对付不同的邮箱系统,网站做事器地址是不一样的:

QQ邮箱:smtp.qq.com网易邮箱:smtp.163.com新浪邮箱:smtp.sina.com

测试

1、导入启动器,java中发送邮件的包是javax.mail,但是SpringBoot启动器中导入的包是jakarta.mail。

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>

2、配置发件人信息,详细的配置项可以查看MailProperties配置类。

#发件人的信息spring.mail.username=1234508334@qq.comspring.mail.password=mxhdobcadmkudacdspring.mail.host=smtp.qq.com#QQ比较分外,须要配置ssl安全连接,其他邮箱不须要配置spring.mail.properties.mail.smtp.ssl.enable=true

4、测试发送大略邮件和繁芜邮件。

@SpringBootTestclass SpringbootPlusApplicationTests {​ @Autowired JavaMailSender sender;​ @Test void sendMailTest(){//测试大略的邮件发送 //发送大略的邮件 SimpleMailMessage message = new SimpleMailMessage();//大略的邮件 message.setSubject("你收到了一份口试约请");//邮件主题 message.setText("才怪,测试邮件哦!
");​ message.setFrom("1234508334@qq.com");//发件人 message.setTo("1234508334@qq.com","abcd@163.com");//收件人 sender.send(message); //发送邮件 }​ @Test void sendMimeMailTest() throws MessagingException {//测试繁芜的邮件发送 //繁芜的邮件,通过一个赞助类来完成 MimeMessageHelper MimeMessage mimeMessage = sender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); //基本信息 helper.setSubject("支付宝到账提醒:尊敬的客户,您3月份..."); helper.setText("<h1 style='color:red'>支付宝到账1,0000,000元,请把稳查收!
</h1>",true); //发送附件 helper.addAttachment("1.jpg",new File("C:\\Users\\Administrator\\Desktop\\1.jpg"));​ helper.setFrom("1234508334@qq.com"); helper.setTo(new String[]{"1234508334@qq.com","abcd@163.com"}); sender.send(mimeMessage); //发送邮件 }}

标签:

相关文章

和田谷歌SEO公司助力企业拓展全球市场

越来越多的企业开始关注网络营销,尤其是谷歌SEO优化。在我国新疆和田地区,也有越来越多的企业开始意识到谷歌SEO的重要性,希望通过...

SEO优化 2025-03-31 阅读1 评论0

国际化媒体SEO步骤,打造全球影响力的关键

全球化已成为不可逆转的趋势。越来越多的企业开始将目光投向国际市场,希望通过国际化媒体传播自己的品牌形象和产品。SEO(搜索引擎优化...

SEO优化 2025-03-31 阅读1 评论0