SpringBoot

SpringBoot

常常用到的模板

  1. html页面的模板
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<bodyL>

    <h1>good job</h1>
</bodyL>
</html>
  1. 配置连接到数据库
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql//localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

一、微服务阶段

一、自动装配的原理

二、分布式开发

三、SpringCloud微服务

☆基础的知识点

  1. 重点要了解其中的原理,让自己能够有更多的谈资,自己主导面试官

  2. you can “just run”

  3. <groupId>com.wk</groupId>
    <artifactId>HelloWorld</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    

    gav坐标↑

  4. 依赖不用写版本,

    spring-boot-dependencies 在父工程中,有版本的仓库

  5. 启动器:就是spirngboot的启动场景

  6. springboot所有自动配置都是在启动的时候扫描并加载的;spring.factories所有的自动配置类都在这里,但不一定生效,要判断条件是否成立,只要导入了对应的start,就有对应的启动器了,有了启动器,我们的自动装配就会生效,然后就配置成功了。

  7. 谈谈自己对springboot的理解,一是自动装配,二是run()方法

  8. 被@Component注解标识的类,会被纳入Spring容器中统一管理,好处是不用我们自己再new了,相当于注册了bean

  9. 在我们定义的属性上,可以加注解直接赋值,例如在pirvate String name;上面加上@Value(“wkwk”)就是给其赋值了

  10. @Autowired注解是视同byType方式,根据属性类型寻找bean,可以与Component联合使用

  11. 我们导入的东西,按shift+shift一定能搜到properties

  12. final关键词:如果用于修饰常量,那么该常量只能被赋值一次,之后便不会发生改变
    如果修饰一个引用类型,对其初始化后,不在指向其他的对象了,但是其自身的内容是可以改变的

  13. C=A>B ? 100 :200;
    这条语句的意思是,如果A>B的话,就将100赋给C,否则就将200赋给C

  14. 面试官问你你可以这样说,springboot是通过main方法下的SpringApplication.run方法启动的,启动的时候他会调用refshContext方法,先刷新容器,然后根据解析注解或者解析配置文件的形式祖册bean,而它是通过启动类的SpringBootApplication注解进行开始解析的,他会根据EnableAutoConfiguration开启自动化配置,里面有个核心方法ImportSelect选择性的导入,根据loadFanctoryNames根据classpash路径以MATA-INF/spring.factorces下面以什么什么EnableAutoConfiguration开头的key去加载里面所有对应的自动化配置,他并不是把这一百二十多个自动化配置全部导入,在他每个自动化配置里面都有条件判断注解,先判断是否引入相互的jar包,再判断容器是否有bean再进行注入到bean容器

  15. 在sb中,更新crud数据之后,自动提交

  16. java类必须要有无参构造函数才能实现自动装配,否则会报错运行不了。

  17. 用自定义的视图解析器,自定义的国际化视图解析器的方法名必须是 localeResolver

  18. 关于restful风格传参
    th:href=@{/emp/{id}(id=KaTeX parse error: Expected 'EOF', got '}' at position 15: {emp.getId()})}̲ th:href=@{/em…{emp.getId()})}
    th:href=@{/emp/+${emp.getId()}}

  19. 架构,就是为了解耦

All遇到的问题:

  1. plugin可能爆红,原因应该是没配置好maven,简单地解决方法是自己手动导入依赖

    		<dependency>
    			<groupId>org.apache.maven.plugins</groupId>
    			<artifactId>maven-site-plugin</artifactId>
    			<version>3.3</version>
    		</dependency>
    		<!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-site-plugin -->
    		<dependency>
    			<groupId>org.apache.maven.plugins</groupId>
    			<artifactId>maven-site-plugin</artifactId>
    			<version>3.8.2</version>
    		</dependency>
    
  2. 无法直接双击package打jar包,解决方法手动导入插件

		<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-resources-plugin</artifactId>
				<version>2.7</version>
				<dependencies>
					<dependency>
						<groupId>org.apache.maven.shared</groupId>
						<artifactId>maven-filtering</artifactId>
						<version>1.3</version>
					</dependency>
				</dependencies>
		</plugin>
  1. 无法用idea创建springboot项目,解决方法见博客:

(2条消息) Initialization failed for ‘https://start.spring.io’ Please check URL, network and proxy settings解决办法_,稳步前进的博客-CSDN博客

  1. 输入[localhost:8081/hello/hello]无法访问,原因是我们的main方法所在的calss没有放在,与controller同一级别的地方

  2. 我们用yaml方法配置参数后,导入依赖spring-boot-configuration-processor,输出显示为null,原因是没有把application.yaml放在最外层的文件中

  3. 松散绑定,给lastName,我们输出的last_name

  4. 在前面虽然已经加上了@Validation的情况下,但是@Email注解无法使用,解决方法是导入依赖【spring-boot-starter-validation】

  5. 修改网页默认的图标,不能用spring.mvc.favicon.enabled=false,而是用spring.favicon.enabled=false

  6. yaml配置数据库的时候,注意要将密码用双引号括起来

  7. 使用yaml的时候,一定注意,前面不要留有空格

  8. springboot启动后,很快自己结束了,解决方法;导入org.springframework.boot依赖

  9. import sun.misc.BASE64Decoder;包不存在
    

    解决方法:file-> project structure -> 将java的jdk11 改为 jdk8

  10. 我们在用idea创建springboot项目之后,如果我们导入了过多的配置,可能会在启动run的时候报错,例如我们选择了sql,那么我们需要配置properties这种的

  11. 在dubbo-admin-master文件夹下使用cmd,然后输入mvn install -Dmaven.test.skip=true; 结果报错,解决方法:在pom.xml中,加上

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.6</version>
    </plugin>
    
  12. 心得体会,如果对一个错误搜索不到,那么试着更换关键词,特别是最最显眼的那些,单独拎出来

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4jWao7WY-1624702807603)(C:\Users\AW\Desktop\SpringBoot.assets\image-20210622214413100.png)]

二、第一个springboot程序

步骤:

  1. 在spring官网,点击quickstart,开始配置,然后打开idea,open这个文件

三、yaml语法

#application.properties与application.yaml的语法结构区别

#yaml对空格的要求十分高
#普通的key-value
#可以注入到我们的配置类中
name: wk

#对象
student:
  name: wkwk
  age: 3

#函内写法
student: {name: wkwk,age: 3}

#数组
pets:
  - cat
  - dog
  - pig

pets: [cat,dog,pig]

四、SpringBoot的多环境配置

端口走哪个的优先性:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UOqszm8o-1624702807606)(C:\Users\AW\Desktop\SpringBoot.assets\image-20210613152346217.png)]

五、SpringBoot Web开发

jar: webApp!

自动装配

springboot到底帮我们配置了什么?我们能不能修改,能修改哪些东西?能扩展吗?

  • xxxxAutoCongifuration.想容器中自动配置组件
  • xxxxProperties: 自动配置类,装配配置文件中自定义的一些内容

要解决的问题:

  • 导入静态资源

    static包下,templ ates下

  • 首页

    MyMvcConfig 、 index.xml、 list.html 、404.html 、dashboard.html 、 application.properties

  • jsp, 模板引擎Thymeleaf

  • 装配扩展SpringMVC

  • 增删改查

  • 拦截器

  • 国际化(中英文切换)

    i18n包所有的文件、MyLocaleResolver、MyMvcConfig、index.xml

总结:

  1. 在sb中,我们可以使用以下方式处理静态资源
    • webjars
    • public, static , /** , resources
    • 优先级:resources> static(默认)>public

六、Thymeleaf

怎么引入呢,对于springboot来说,什么事情不都是一个start的事情嘛,我们去在项目中引入一下。给大家三个网址:

Thymeleaf 官网:https://www.thymeleaf.org/

Thymeleaf 在Github 的主页:https://github.com/thymeleaf/thymeleaf

Spring官方文档:找到我们对应的版本

https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/htmlsingle/#using-boot-starter

Themeleaf的相关配置文件,位于**templates(模板)**下面

结论:只要需要视同thymeleaf,只需要导入对应的依赖就行了,我们将html房子啊我们的templates下面

private String prefix = "classpath:/templates/";
//说明放在templates下面

2、标准表达式语法:

${...} 变量表达式,Variable Expressions

@{...} 链接表达式,Link URL Expressions

#{...} 消息表达式,Message Expressions

~{...} 代码块表达式,Fragment Expressions

*{...} 选择变量表达式,Selection Variable Expressions

七、正式进入Web开发

后台模板:bootstrap

后台模板:X-admin

@Repository :可以被spring托管

八、整合Mybatis

  1. 整合包:

mybatis-spring-boot-starter

  1. 配置文件
  2. mybatis配置
  3. 编写sql
  4. 业务层调用dao层
  5. controller调用service层

MVC

M:数据和业务

V :HTML

C :交接

九、SpringSecurity

安全应该在设计之初考虑

shiro、springSecurity:很想,除了类不一样,名字不一样

ss是一个框架

密码编码:PassowrdEncoder,新版的springsecurity多了许多加密方法

注销功能:http.logout()

整合包:thymeleaf与springsecurity

十、Shiro

十一、Swagger

  1. Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。Swagger官方API文档:https://swagger.io/
    作用:

    1. 接口的文档在线自动生成。
    2. 功能测试。
  2. 需要导入的依赖

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
  1. 配置swagger信息=apiInfo
private ApiInfo apiInfo(){

    //作者信息
    Contact contact = new Contact("wk", "https://www.bilibili.com/", "277422545@qq.com");
    return new ApiInfo(
            "wk的SwaggerAPI文档",
            "直接到B站吧,呜呜呜 ",
            "v0.0",
            "https://www.bilibili.com/",
            contact,
            "Apache 2.0",
            "http://www.apache.org/licenses/LICENSE-2.0",
            new ArrayList()
    );

}
  1. Swagger配置扫描口

Docket select

//配置了Swagger的Docket的bean实例
@Bean
public Docket docket(){
    return new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo())
        	//.enable(false)原来默认是ture,现在改成false之后,则不能打开了
            .select()
            //RequestHandlerSelectors配置要扫描接口的方法
            //basePackage:指定要扫描的包
            //any():扫描全部
            //none():不扫描
            //withClassAnnotation:扫描类上的注解,参数是一个注解的反射对象
            //withMethodAnnotation:扫描方法上的注解
            .apis(RequestHandlerSelectors.basePackage("com.wk.swagger.controller"))
            //path():过滤什么路径
            .paths(PathSelectors.ant("/wk/**"))
            .build();
}
  1. Swagger如何只在生产环境中使用,在发布的时候不使用?
  • 判断是不是生产环境 flag=false
  • 注入enable(flag)
    public Docket docket(Environment environment){

        //设置要显示的Swagger环境
        Profiles profiles = Profiles.of("dev","test");

        //获取项目的环境:
        boolean flag = environment.acceptsProfiles(profiles);
  1. 配置API文档的分组

.groupName(“wkwk”)

  1. 如何配置多个分组文档
@Bean
public Docket docket1(){
    return new Docket(DocumentationType.SWAGGER_2).groupName("AA");
}
  1. 实体类配置
//@Api()注释
@ApiModel("用户实体类")//这是给实体类user的注释罢了
public class User {

    @ApiModelProperty("用户名")
    public String username;
    @ApiModelProperty("密码")
    public String password;
}
  1. 总结
    • 可以通过swagger给一些比较难理解的属性或接口给予注释
    • 接口文档实时更新
    • 可以在线测试

Swagger几乎所有大公司都有使用

【注意点】在正式发布的时候,关闭Swagger,安全考虑,节省内存

十二、异步任务

目标:让前台能够秒刷新,后台会停一段时间再刷新

main方法:

@EnableAsync//开启异步处理
@SpringBootApplication
public class Springboot09TestApplication {

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

}

controller

@RestController
public class AsyncController {

    @Autowired
    AsyncService asyncService;

    @RequestMapping("/hello")
    public String hello(){
        asyncService.hello();//停止三秒,转圈
        return "OK";
    }

}

service

@Service
public class AsyncService {

    @Async//告诉你spring啊,这是一个异步方法,然后前台就不会停了,秒刷新,则只有后台会自己停3秒钟
    public void hello(){

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("数据正在处理。。。");
    }
}

十三、邮件任务

  1. 导入依赖
<!--        邮件任务-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
  1. 配置application.properties
spring.mail.username=2774225452@qq.com
spring.mail.password=sldrlxneohcgdfhg
spring.mail.host=smtp.qq.com
#加密规则
spring.mail.properties.smtl.ssl.enable=true
  1. junit测试
@Test
void contextLoads() {

    //one simple mail
    SimpleMailMessage mailMessage = new SimpleMailMessage();
    mailMessage.setSubject("哇卡哇卡你好啊");
    mailMessage.setText("嘿嘿");

    mailMessage.setTo("2774225452@qq.com");
    mailMessage.setFrom("2774225452@qq.com");

    mailSender.send(mailMessage);
}


@Test
void contextLoads2() throws MessagingException {

    //one harder mail
    MimeMessage mimeMessage = mailSender.createMimeMessage();
    //组装
    MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);

    helper.setSubject("哇卡哇卡really");
    helper.setText("<p style='color:red'how you doing?</p>",true);

    //附件
    helper.addAttachment("1.jpg",new File("C:\\Users\\AW\\Desktop\\1.jpg"));

    helper.setTo("2774225452@qq.com");
    helper.setFrom("2774225452@qq.com");

    mailSender.send(mimeMessage);
}
  1. 定义邮件方法
    /**
     * @param html
     * @param subject
     * @param text
     * @throws MessagingException
     * @Author 哇卡哇卡
     * */
    public void sendMail(Boolean html,String subject,String text)throws MessagingException{
        //one harder mail
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        //组装
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);

        helper.setSubject("哇卡哇卡really");
        helper.setText("<p style='color:red'how you doing?</p>",true);

        //附件
        helper.addAttachment("1.jpg",new File("C:\\Users\\AW\\Desktop\\1.jpg"));

        helper.setTo("728038580@qq.com");
        helper.setFrom("2774225452@qq.com");

        mailSender.send(mimeMessage);
    }

十四、定时任务

抢东西的脚本

Service层

@Service
public class ScheduledService {

    //在一个特定时间执行这个方法~ Timer
    //cron表达式
    //秒 分 时 日 月 周几
    //0 25 18 * * ?每天的18点25分执行
    //30 0/5 10,18 * * 1-6  每月的周一到周六的10点和18点,每隔五分钟执行一次
    //0 15 10 L* ?   每月最后一天的上午10点15执行
    @Scheduled(cron = "0/2 * * * * ?")
    public void hello(){
        System.out.println("hello,你OK了");
    }
}

main方法上面

@EnableAsync//开启异步处理
@EnableScheduling//!!开启定时的功能 !!
@SpringBootApplication
public class Springboot09TestApplication {

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

}

十五、分布式Dubbo+Zookeeper+Springboot

  1. 分布式系统是若干个独立计算机的集合,但是对于用户来说则就像一个系统一样
  2. 百度云,阿里云等等
  3. 从一台电脑的方法调用另一台电脑的方法

DUbbo

前台 中台 后端

  1. Apache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

  2. dubbo官网 http://dubbo.apache.org/zh-cn/index.html

dubbo是一个监控后台,卡以查看我们注册了啥服务,

zookeeper是注册中心

dubbo:jar包

步骤:

  1. provider提供服务
    1. 导入依赖
    2. 配置注册中心地址,以及服务发现名,要扫描的包
    3. 在想要被注册的服务上面,增加一个注解@Service(config下面的)
  2. consumer如何消费
    1. 倒入依赖
    2. 配置注册中心的地址,配置自己的服务名
    3. 从远程注入
    4. 注意:@Service可能不同,显示config下的,后来是framework’下面的

ringboot09TestApplication {

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

}




## 十五、分布式Dubbo+Zookeeper+Springboot



1. 分布式系统是若干个独立计算机的集合,但是对于用户来说则就像一个系统一样
2. 百度云,阿里云等等
3. 从一台电脑的方法调用另一台电脑的方法





DUbbo

前台 中台 后端

1. Apache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:**面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。**

2. dubbo官网 http://dubbo.apache.org/zh-cn/index.html
3. 



dubbo是一个监控后台,卡以查看我们注册了啥服务,

zookeeper是注册中心

dubbo:jar包

步骤:

1. provider提供服务
   1. 导入依赖
   2. 配置注册中心地址,以及服务发现名,要扫描的包
   3. 在想要被注册的服务上面,增加一个注解@Service(config下面的)
2. consumer如何消费
   1. 倒入依赖
   2. 配置注册中心的地址,配置自己的服务名
   3. 从远程注入
   4. 注意:@Service可能不同,显示config下的,后来是framework'下面的



















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 要在IDEA中同步Gradle项目,你可以按照以下步骤进行操作。首先,新建一个名为init.gradle的文件,将以下内容复制到文件中: allprojects { repositories { def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public/' all { ArtifactRepository repo -> if (repo instanceof MavenArtifactRepository && repo.url != null) { def url = repo.url.toString() if (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/')) { project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL." remove repo } } } maven { url REPOSITORY_URL } } } 然后,你可能会遇到一个错误信息,类似于"Gradle sync failed: Cannot convert string value 'JETPACK_COMPOSE' to an enum value of type 'com.android.builder.model.AndroidGradlePluginProjectFlags$BooleanFlag' (valid case insensitive values: APPLICATION_R_CLASS_CONSTANT_IDS, TEST_R_CLASS_CONSTANT_IDS, TRANSITIVE_R_CLASS)"。这是因为无法将字符串值'JETPACK_COMPOSE'转换为类型为'com.android.builder.model.AndroidGradlePluginProjectFlags$BooleanFlag'的枚举值。\[2\] 为了解决这个问题,你可以点击IDEA最右边的侧边栏中的"Gradle"菜单。然后,点击"Tasks" -> "build" -> "build",双击"build"齿轮开始构建项目。这将重新下载依赖项。如果构建成功,你可以再次点击侧边栏中的那个"循环箭头"按钮,以进行项目同步。\[3\] #### 引用[.reference_title] - *1* *3* [关于idea导入gradle工程,出现sync failed的问题](https://blog.csdn.net/lvyuan1234/article/details/80119011)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [idea2020.1 导入android工程sync报错](https://blog.csdn.net/weixin_33138295/article/details/117529965)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值