Springboot笔记

SpringBoot随笔

1. Questions:

1.1 什么是springboot?

P: springboot可以看做是springmvc+spring的集合,什么是spring呢?大概就是一个框架,那mvc是什么呢?是一个控制层上的架构模式

O:

1.2 springboot和spring和springmvc的区别?

P:  springboot整合了spring+springmvc

1.3 @Bean @Configuration @Component?

P: @Bean 在大多数时候是对外部引入的那些需要进行初始化or配置的依赖进行初始化,即返回一个实例

     @Configuration一般都是与@Bean配合使用的,@Configuration注解在类上,相当于告诉spring这是一个配置类,在springboot启动的时候他就会去看这个类然后如果有@Bean注解就再根据你注解下的方法初始化实例对象

@Component 看起来像是最高层的借口,@Controller是一个组件,@Service也是一个组件,@Configuration也是,这些下级注解像是更细致化的@Componenet

1.4 application.yml配置?

P:    yml和yaml基本没区别,用严格的缩进来进行properties的‘.’的操作,可复用,所以代码更少可读性更高

1.5 springboot是怎么做到你要什么我给你什么的?

P:  springboot程序的入口是xxxApplication类,类上有个注解,里面包含四个元注解,他会按照各种要求,这取决于你的依赖和配置,来决定给你加载什么,不给你加载什么

1.6 模块化问题?分开配置依赖?

P:   模块化开发显而易见对工作的项目开发大有裨益,依赖也可以分开配置,但是容错率大大降低,因为每个模块需要自己配置pom,甚至很有可能出现循环依赖>

1.7 创建springboot时用spring Initializer 和 Maven的区别?

P:   spring Initializer自动加载了spring需要的什么start依赖,maven需要你自己加

1.8 xml的全拼?

O: extensive markdown language,所以你为啥不叫eml…

1.9 xml文件的namespace?

P: 命名空间,似乎是为了作为唯一标志的,应该写所需的pojo>

1.10 artificialId和groupId?

P: groupId是包名?ArtificialId是真实所需且唯一标志的名字

1.11 10问题和硬盘上包结构的问题?
1.12 所有包需要在xxxapplication同一个包下?

O: 是

1.13@MapperScan?
1.14 alias-package? classpath?

P:alias-package是对pojo包的别名,这样你在xml配置是就不需要xxx.xxx.xx.user只需要写user了?classpath似乎和${pageContext.request.context}有异曲同工之妙,甚至可以直接/xxx/ ?

1.15 @Resource和@AutoWired区别?

P:    @Resource的好处似乎是idea不会出现扫描不出来这个成员变量的情况,但是大部分都用@AutoWired?

1.16 为什么@Autowired有时候会报错?

P:    idea扫描不到

1.17 为什么我用idea配置maven每次都要改settings.xml和repository?

P:    不知道

1.18 不算springboot的问题:怎么导入别人的项目还不报错?怎么导出自己的jar包还不报错?
1.19 Controller -> Service -> Dao 这种设计模式有缺点吗?优点呢?
1.20 为什么会出现循环依赖?
1.21 注解和xml的优缺点?
1.22 一个springboot程序员需要会外部依赖的配置吗?还是直接cv?
1.23 token的相关操作 ? JWT?
1.24 mybatis的resulttype是数据库里的还是pojo的?
1.25 mybatis的#{id}传参是数据库的名字还是pojo的?
1.26 mybatis的两种传参or计算方式的区别?
1.27 mybatis的正常模板操作?
1.28 springboot的dependency-management是干嘛的?
1.29 28的问题里是把版本交给子类拓展还是把依赖交给子类拓展?
1.30 IOC AOP DI?
1.31 终极问题:springboot用了哪些设计模式?体现在哪
1.32 quartz是干嘛的?
1.33 队列?
1.34 队列用了哪种设计模式?
1.35 完成一个项目的标准步骤
1.36 pdman?
1.37 终极问题2: 注解是怎样运行的?
1.38 什么是ajax?

A: 在你前端页面向后端发请求时不影响你加载自己的组件

2. Annotations

2.1 什么是注解?
The Java annotation processing API was designed when Java only supported annotations on declarations. The API only supports visiting declarations, such as fields, methods, and method parameters. It does not visit local variable declarations, nor other annotations within a method body, nor type annotations.

注解是关于数据的数据,不同于注释,他会改变编译器的编译时的行为

2.2 一个实例
import java.lang.annotation.Annotation;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;

// Make Words annotation repeatable
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(MyRepeatedAnnos.class)
@interface Words{
    String word() default "Hello";
    int value() default 0;
}

// Create container annotation
@Retention(RetentionPolicy.RUNTIME)
@interface MyRepeatedAnnos{
    Words[] value();
}
public class Main {

    // Repeat Words on newMethod
    @Words(word = "First", value = 1)
    @Words(word = "Second", value = 2)
    public static void newMethod(){
        Main obj = new Main();

        try{
            Class<?> c = obj.getClass();

            // Obtain the annotation for newMethod
            Method m = c.getMethod("newMethod");

            // Display the repeated annotation
            Annotation anno = m.getAnnotation(MyRepeatedAnnos.class);
            System.out.println(anno);
        }catch (NoSuchMethodException e){
            System.out.println(e);
        }
    }
    public static void main(String[] args) {
        newMethod();
    }
}
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(MyRepeatedAnnos.class)
@interface Words{
    //words注解自己的成员
    //在类里相当于 String word = "Hello", int value = 0; 然后生成getters和setters
    String word() default "Hello";
    int value() default 0;
}

// Create container annotation
@Retention(RetentionPolicy.RUNTIME)
@interface MyRepeatedAnnos{
    Words[] value();//可重复注解Repeatable的容器,变量是被重复的注解类型的数组 Words[] value = new words[];
    //当然更像是一个arraylist,毕竟没有控制大小
}

Output:

@MyRepeatedAnnos(value={@Words(value=1, word="First"), @Words(value=2, word="Second")})
2.3 一些springboot常见注解
2.3.1 @Target
@Documented //大概意思是这个类可以被写入javadoc等api文档中,意思就是开源和不开源的区别咯
@Retention(RetentionPolicy.RUNTIME) //此注解代表被这个注解标记的注解能保留到什么时候,RunTime代表你运行的时候这个注解都是还在的
@Target(ElementType.ANNOTATION_TYPE) //作用于注解上的注解,它标志了被标记注解的类型或功能
public @interface Target {
    /**
     * Returns an array of the kinds of elements an annotation type
     * can be applied to.
     * @return an array of the kinds of elements an annotation type
     * can be applied to
     */
    ElementType[] value();
}

2.3.2 @Retention 生命周期注解
@Retention 注解:用于约束被定义注解的作用范围,作用范围有三个:

1,RetentionPolicy.SOURCE:作用范围是源码,作用于Java文件中,当执行javac时去除该注解。//保留到执行完.java文件
    
2RetentionPolicy.CLASS:作用范围是二进制码,就是存在于class文件中,当执行Java时去除该注解。//保留到执行完.class文件

3RetentionPolicy.RUNTIME:作用范围为运行时,就是我们可以通过动态获取该注释。//保留到gc

RetentionPolicy.SOURCE – 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。

RetentionPolicy.CLASS – 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式。

RetentionPolicy.RUNTIME– 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。

Great!!!

3. Finish a spring project with JSP

3.1 非模块化

Step1: 用spring initializer 创建项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zeNfAHcY-1649230615842)(C:\Users\86180\AppData\Roaming\Typora\typora-user-images\image-20211105163338678.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bUtNaXGp-1649230615844)(C:\Users\86180\AppData\Roaming\Typora\typora-user-images\image-20211105164307212.png)]

图一的Group和Artifact指定的是java下的SpringBootApplication所在的包的位置,即com.czm.classmanage.xxxapplication
根据规则,所有的包都需要跟xxxapplication在同一个包下,所以我们其他的包也是com.czm.classmanage,但是,当模块化的时候,也是如此吗?

Step2: 配置application.yml

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O94pCjHk-1649230615844)(C:\Users\86180\AppData\Roaming\Typora\typora-user-images\image-20211105165812475.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pLlDRWA3-1649230615844)(C:\Users\86180\AppData\Roaming\Typora\typora-user-images\image-20211105170000233.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4hpLuCEg-1649230615845)(C:\Users\86180\AppData\Roaming\Typora\typora-user-images\image-20211105170240453.png)]

当文件被打包或者运行的时候,所有的文件似乎都会放到classes目录下,classpath的地址也就是xxx/classes,:后代表匹配规则

更细致一点的说,与java相关的资源(resources)和java代码都会被打包到classes目录下,而和前端相关的则不会丢进去,所以可以放心匹配

看起来是springboot提供解析classpath的功能

pom文件不需要管理version,springboot会动态的根据你选择的一些依赖给你尽可能的提供最优版本,当然你可以覆盖他的选择

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WGpoLy9A-1649230615845)(C:\Users\86180\AppData\Roaming\Typora\typora-user-images\image-20211105171944353.png)]

Step3: 创建实体类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5FJWOHnn-1649230615845)(C:\Users\86180\AppData\Roaming\Typora\typora-user-images\image-20211105172013019.png)]

image-20211105172456343

Step4: 喜闻乐见的Controller->Service->Dao啦,我喜欢从上到下,但是似乎自下而上更好,按需配置就完事了

Step5: 外部库有需要的就用啦,什么swagger啊,jackson啊,jwt啊

3.2 模块化前后端分离

用maven创建

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ls3WV9SW-1649230615846)(C:\Users\86180\AppData\Roaming\Typora\typora-user-images\image-20211105172911815.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7gUVlst8-1649230615847)(C:\Users\86180\AppData\Roaming\Typora\typora-user-images\image-20211105172959528.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6fKr8IXW-1649230615847)(C:\Users\86180\AppData\Roaming\Typora\typora-user-images\image-20211105173028074.png)]

groupId只是一个公司的域名的约定,ArtifactId是项目名,很明显,模块也是一个项目,没有什么严格的父子结构的关系!!!

然后每个模块导入每个自己需要的依赖,Controller依赖Service,Service依赖dao,所以Controller中会有的依赖是自己的加上Service的加上dao的

总的依赖关系为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mTe1su54-1649230615848)(C:\Users\86180\AppData\Roaming\Typora\typora-user-images\image-20211105175057926.png)]

mg-Ls3WV9SW-1649230615846)]

[外链图片转存中…(img-7gUVlst8-1649230615847)]

[外链图片转存中…(img-6fKr8IXW-1649230615847)]

groupId只是一个公司的域名的约定,ArtifactId是项目名,很明显,模块也是一个项目,没有什么严格的父子结构的关系!!!

然后每个模块导入每个自己需要的依赖,Controller依赖Service,Service依赖dao,所以Controller中会有的依赖是自己的加上Service的加上dao的

总的依赖关系为:

[外链图片转存中…(img-mTe1su54-1649230615848)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值