广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Spring全面详解(学习总结)
  • 361
分享到

Spring全面详解(学习总结)

springjavaIOCAOP 2023-08-16 15:08:32 361人浏览 安东尼
摘要

Spring FrameWork一、 前言二、IOC(控制反转)2.1 对于IOC的理解2.2如何使用IOC2.3配置文件的解读2.4IOC容器创建bean的两种方式2.5从IOC容器中取bean2.6bean的属性如


📃个人主页: 不断前进的皮卡丘
🌞博客描述: 梦想也许遥不可及,但重要的是追梦的过程,用博客记录自己的成长,记录自己一步一步向上攀登的印记
🔥网站推荐:千里之行,始于足下。每天坚持刷题,巩固所学知识,也为将来找工作,面试做好准备----- 刷题神器
文章是看楠哥的视频写的笔记
这篇博客内容把spring的基本知识点都讲到了,篇幅比较长,大家可以用于复习,也可以在学习相关知识点的时候,来看看对应内容。对于一些难点,ioc,aop等,我通过流程图,代码,文字结合来进行讲解,可以更好的理解

Spring FrameWork

一、 前言

  • Spring是当前Java开发的行业标准,第一框架
  • Spring FrameWork已经从最初取代EJB的框架逐步发展成一套完整的生态,最新的版本是5.x
  • Spring架构体系图
    在这里插入图片描述
  • Spring两大核心机制:
    • ioC:工厂模式
    • AOP:代理模式

二、IOC(控制反转)

2.1 对于IOC的理解

传统开发中,需要调用对象的时候,需要调用者手动来创建被调用者的实例,即对象是由调用者new出来的
但是在Spring框架中,创建对象的工作不再由调用者来完成,而是交给IOC容器来创建,再推送给调用者,整个流程完成反转,所以是控制反转
在这里插入图片描述
就比如说假设买东西,以前我们需要自己去超市买东西,但是现在我们可以不用自己去超市,我们只要把购物袋放在家门口,IOC就会自己去把我们想要的东西买回来,然后放在袋子里面,我们打开袋子拿起来用就可以了
IOC的特点是解耦合。
比如说A需要用到B,传统的开发,我们要直接创建B的实例,但是在Spring中,IOC这个容器会创建B的实例,然后把这个B注入到A
在这里插入图片描述

2.2如何使用IOC

  • 创建Maven工程,在pom.xml中导入相关依赖
    4.0.0    org.example    springioc    1.0-SNAPSHOT            8        8                            org.springframework            spring-context            5.3.18            
  • 创建实体类Student
public class Student {    private long id;    private String name;    private int age;    public long getId() {        return id;    }    public void setId(long id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    @Override    public String toString() {        return "Student{" +                "id=" + id +                ", name='" + name + '\'' +                ", age=" + age +                '}';    }}
  • 在resources路径下创建applicationContext.xml配置文件
    
  • 传统的开发方式:手动new Student
        Student stu =new Student();        stu .setAge(25);        stu.setId(1001);        stu.setName("张三");        System.out.println(stu);
  • IOC容器通过读取配置文件,加载配置bean标签来创建对象
  • 就像买菜一样,我们不需要自己亲自买,但是要写一张单子,告诉说要买什么,程序也是类似的,我们要告诉Spring框架要创建哪些对象,怎样创建对象
  • 在这里插入图片描述
  • 调用api,从IOC获取对象
//读取配置文件        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");        Student stu = applicationContext.getBean("stu", Student.class);        System.out.println(stu);

在这里插入图片描述

2.3配置文件的解读

  • 通过配置bean标签来完成对象的管理
  • id:对象名
  • class:对象的模板类(所有交给IOC容器来管理的类必须要有无参构造函数,因为Spring底层是通过反射机制来创建对象,调用的是无参构造)
  • 对象的成员变量通过property标签完成赋值
    • name:成员变量名
    • value:成员变量值(基本数据类型,String可以直接赋值,如果是其他引用类型不可以通过value赋值)
    • ref:把IOC中的另一个bean赋给当前成员变量(DI)
    • 在这里插入图片描述

2.4IOC容器创建bean的两种方式

  • 无参构造函数(需要提供对应的set方法)

  • 在这里插入图片描述

  • 有参构造函数

                        
                        

2.5从IOC容器中取bean

  • 通过id取值
 Student stu = (Student)applicationContext.getBean("stu");
  • 通过类型取值
 Student stu = applicationContext.getBean(  Student.class);
  • 当IOC容器中存在两个以上Student Bean的时候就会抛出异常,因为此时没有唯一的bean
    在这里插入图片描述
    在这里插入图片描述

2.6bean的属性如果包含特殊字符

在这里插入图片描述

三、DI(依赖注入)

  • DI:指bean之间的依赖注入,设置对象之间的级联关系
  • Classes
public class Classes {    private Integer id;    private String name;    还有对应的get,set方法}
  • Student
public class Student {    private long id;    private String name;    private int age;    private Classes classes;    public Student(){        System.out.println("使用无参构造创建对象");    }    public Student(long id,String name){        this.id = id;        this.name = name;    }      public Classes getClasses() {        return classes;    }    public void setClasses(Classes classes) {        this.classes = classes;    }    public long getId() {        return id;    }    public void setId(long id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    @Override    public String toString() {        return "Student{" +                "id=" + id +                ", name='" + name + '\'' +                ", age=" + age +                ", classes=" + classes +                '}';    }}

applicationContext-di.xml

                                                                

在这里插入图片描述

bean之间的级联需要使用ref属性,而不能用value属性,否则会抛出类型转换异常
在这里插入图片描述
在这里插入图片描述

                                                                                                                                                                                

在这里插入图片描述

如果把学生装到班级里面,又把班级装到学生里面,就导致无限递归循环装配,最终栈溢出

四、Spring中的bean

bean是根据scope来生成的,表示bean的作用域,scope有4种类型

  • singleton,单例,表示通过Spring容器获取的对象是唯一的,是默认值

    • 在这里插入图片描述

    • 在这里插入图片描述

    • 在这里插入图片描述

  • prototype,原型,表示通过Spring容器获取的对象是不同的

    • 配置文件
                    

在这里插入图片描述
在这里插入图片描述

  • request,请求,表示在异常Http请求内有效
  • session,会话,表示在一个用户会话内有效
    request和session一般用于WEB项目
    singleton模式下,只要加载IOC容器,不管是否从IOC种取出bean,配置文件中的bean都会被创建,而且只会创建一个对象
    prototype模式下,如果不从IOC中取出bean,则不创建对象,取一次bean,就会创建一个对象

五、Spring中的继承

Spring中的继承不同于Java中的继承
Java中的继承是针对于类的
Spring中的继承是针对于对象(bean)

                            

在这里插入图片描述

  • 通过设置bean标签的parent属性建立继承关系,同时子bean可以覆盖父bean的属性值
  • Spring的继承是针对对象的,所以子bean和父bean并不需要同一个数据类型,只要其成员变量列表一致即可

六、Spring的依赖

  • 用来设置两个bean的创建顺序
  • IOC容器默认情况下是通过applicationContext.xml中bean的配置顺序来决定创建顺序的,配置在前面的bean会先被创建
  • 在不更改applicationContext.xml配置顺序的前提下,通过设置bean之间的依赖关系来调整bean的创建顺序
  • 在这里插入图片描述

七、Spring读取外部资源

  • 在实际开发中,数据库的配置会一般会单独保存到后缀为properties的文件,方便维护和修改
  • 如果用Spring来加载数据源,就需要在applicationContext.xml中读取properties中的数据,这就是读取外部资源

jdbc.properties

user=rootpassWord=rooturl=jdbc:Mysql://localhost:3306/springdriverName=com.mysql.cj.jdbc.Driver

spring-properties.xml

                                                

在这里插入图片描述
在这里插入图片描述

八、Spring的p命名空间

  • 用来简化xml配置
  • 在这里插入图片描述
        

九、Spring工厂方法

IOC通过工厂模式创建bean有两种方式:

  • 静态工厂方法
  • 实例工厂方法
  • 静态工厂类不需要实例化,实例工厂类需要实例化

9.1静态工厂方法

  1. 创建Car类
public class Car {    private Integer num;    private String brand;    public Car() {    }    public Car(Integer num, String brand) {        this.num = num;        this.brand = brand;    }    public Integer getNum() {        return num;    }    public void setNum(Integer num) {        this.num = num;    }    public String getBrand() {        return brand;    }    public void setBrand(String brand) {        this.brand = brand;    }    @Override    public String toString() {        return "Car{" +                "num=" + num +                ", brand='" + brand + '\'' +                '}';    }}
  1. 创建静态工厂类,静态工厂方法
public class StaticCarFactory {    private static Map carMap;    static {        carMap = new HashMap<>();        carMap.put(1, new Car(1, "奥迪"));        carMap.put(2, new Car(2,"奥拓"));    }        public static Car getCar(Integer num ){        return carMap.get(num);    }}
  1. spring-factory.xml
                
  • factory-method 指向静态方法
  • constructor-arg的value属性是调用静态方法传入的参数

9.2实例工厂方法

  1. 创建实例工厂类,工厂方法
public class InstanceCarFactory {    private Map carMap;    public InstanceCarFactory() {        carMap = new HashMap<>();        carMap.put(1, new Car(1, "奥迪"));        carMap.put(2, new Car(2, "奥拓"));    }    public Car getCar(Integer num){        return carMap.get(num);    }}
  1. spring.xml
                    

区别:
在这里插入图片描述

  • 静态工厂方法创建Car对象,不需要实例化工厂对象,因为静态工厂的静态方法,不需要创建对象就可以调用了
  • 实例工厂方法创建Car对象,需要实例化工厂对象,因为getCar方法是非静态的,就必须通过实例化对象才能调用,所以 必须创建工厂对象,spring.xml需要配置两个bean,一个是工厂bean,一个是Car Bean
  • spring.xml中 class+factory-method的形式是直接调用类中的工厂方法
  • spring.xml中factory-bean+factory-method的形式是调用工厂bean中的工厂方法,就必须先创建工厂bean

十、Spring IOC 自动装配 autowire

10.1自动装配

  • 自动装载是Spring提供的一种更加简便的方式来完成DI,不需要手动配置property,IOC 容器会自动选择bean来完成注入
  • 自动装载有两种方式:
    • byName:通过属性名完成自动装载
    • byType:通过属性对应的数据类型完成自动装载

byName的操作如下:

  1. 创建Person实体类
public class Person {    private Integer id;    private String name;    private Car car;    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Car getCar() {        return car;    }    public void setCar(Car car) {        this.car = car;    }    @Override    public String toString() {        return "Person{" +                "id=" + id +                ", name='" + name + '\'' +                ", car=" + car +                '}';    }}
  1. 在spring.xml中配置Car和Person对应的bean,并且通过自动装载完成依赖注入
                                                    

在这里插入图片描述
注:如果bean的id有多个一致的,会报错,如Bean name 'car' is already used in this element
byType的操作如下:

                                                    

在这里插入图片描述
使用byType进行自动装配的时候,必须保证IOC中有且只有一个符合,如果有多个符合,则报下面的异常:
在这里插入图片描述

10.2 Spring IOC基于注解的开发

Spring IOC的作用是帮助开发者创建项目中所需要的bean,同时完成bean之间的依赖注入关系,DI
实现该功能有两种方式:

  • 基于XML配置
  • 基于注解
    基于注解有两步操作,缺一不可:
  1. 配置自动扫包
  2. 添加注解
    
@Component(value="repository")public class Repository {    private DataSource dataSource;    public DataSource getDataSource() {        return dataSource;    }    public void setDataSource(DataSource dataSource) {        this.dataSource = dataSource;    }    @Override    public String toString() {        return "Repository{" +                "dataSource=" + dataSource +                '}';    }}

DI
注解默认的beanid是类名以小写开头,我们可以通过value来设置
如果我们想要把datasource也注入进来需要怎么做呢?
首先我们要把DataSource先扫进来

@Componentpublic class Repository {    @Autowired    private DataSource dataSource;    public DataSource getDataSource() {        return dataSource;    }    public void setDataSource(DataSource dataSource) {        this.dataSource = dataSource;    }    @Override    public String toString() {        return "Repository{" +                "dataSource=" + dataSource +                '}';    }}

在这里插入图片描述
在这里插入图片描述

  • @Autowired默认是通过byType进行装配,如果要改为byName,需要配合@Qualifier注解来完成
@Componentpublic class Repository {    @Autowired    @Qualifier(value = "datasource")    private DataSource dataSource;    public DataSource getDataSource() {        return dataSource;    }    public void setDataSource(DataSource dataSource) {        this.dataSource = dataSource;    }    @Override    public String toString() {        return "Repository{" +                "dataSource=" + dataSource +                '}';    }}

这表明把IOC中id为datasource的bean注入到repository中
实体类中普通的成员变量(String,包装类等),可以通过@Value注解来赋值

@Componentpublic class DataSource {    @Value("root")    private String username;    @Value("123456")    private String password;    @Value("jdbc:mysql://localhost:3306/spring")    private String url;    @Value("com.mysql.cj.jdbc.Driver")    private String driveName; }

10.3实际开发中的使用

实际开发中我们会把程序分成三层:

  • Controller
  • Service
  • Repository(DAO)
  • 关系Controller—>Service---->Repository
  • 在这里插入图片描述
    @Component注解是把标注的类加载到IOC容器中,实际开发中可以根据业务需求分别使用@Controller,@Service,@Repository注解来标注控制层类,业务层类,持久层类

十一、Spring AOP

  • AOP (Aspect Oriented Programming) 面向切面编程
  • OOP (Object Oriented Programming) 面向对象编程,用对象化的思想来完成程序
  • AOP是对OOP的一个补充,是在另外一个维度上抽象出对象
  • 具体指程序运行时动态地把非业务代码切入到业务代码中,从而实现程序的解耦合,把非业务代码抽象成一个对象,对对象编程就是面向切面编程
  • 在这里插入图片描述
  • 上面这种形式的代码维护性很差,代码复用性差
  • 在这里插入图片描述
    AOP的优点:
  • 可以降低模块之间的耦合性
  • 提供代码的复用性
  • 提高代码的维护性
  • 集中管理非业务代码,便于维护
  • 业务代码不受非业务代码影响,逻辑更加清晰

通过一个例子来理解AOP。

  1. 创建一个计算器接口Cal
public interface Cal { public int add(int num1,int num2); public int sub(int num1,int num2); public int mul(int num1,int num2); public int div(int num1,int num2);}
  1. 创建接口的实现类
public class CalImpl implements Cal {    @Override    public int add(int num1, int num2) {        int res = num1 + num2;        return res;    }    @Override    public int sub(int num1, int num2) {        int res = num1 - num2;        return res;    }    @Override    public int mul(int num1, int num2) {        int res = num1 * num2;        return res;    }    @Override    public int div(int num1, int num2) {       int res=num1/num2;       return res;    }}

日志打印

  • 在每个方法开始位置输出参数信息
  • 在每个方法结束位置输出结果信息

对于计算器来说,加减乘除就是业务代码,日志打印就是非业务代码
AOP如何实现? 使用动态代理的方式来实现
代理首先要具备CalImpl的所有功能(实现同一个接口),并且在这个基础上,扩展出打印日志的功能

  1. 删除CalImpl方法中国所有打印日志的代码,只保留业务代码
  2. 创建MyInvocationHandler类(不是动态代理类),实现InvocationHandler接口,生成动态代理类 。动态代理类需要动态生成,需要获取到委托类的接口信息,根据这些接口信息动态生成一个代理类,然后再由ClassLoader用来把动态生成的类加载到JVM
    在这里插入图片描述
    ClassLoader用来把动态生成的类加载到JVM中
    在这里插入图片描述
    代理类需要有和委托类一样的功能,所以委托类和代理类需要实现同样的接口,因此,我们要获取到委托类的接口信息,根据这个接口信息就可以生成一个类,再通过ClassLoader加载到内存里面
public class MyInvocationHandler implements InvocationHandler {    //委托对象    private Object object = null;    //返回代理对象    public Object bind(Object object) {        this.object = object;        return Proxy.newProxyInstance(object.getClass().getClassLoader(),                object.getClass().getInterfaces(),this);    }    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        //实现业务代码和非业务代码的解耦合        System.out.println(method.getName()+"方法的参数是:"+ Arrays.toString(args));        Object res = method.invoke(this.object, args);        System.out.println(method.getName()+"方法的结果是:"+res);        return res;    }}

在这里插入图片描述
上述代码通过动态代理机制实现了业务代码和非业务代码的解耦合,这是Spring AOP的底层实现机制,真正使用 Spring AOP进行开发的时候,不需要这么复杂
Spring AOP的开发步骤

  1. 创建切面类 Loggerspect
@Component@Aspectpublic class LoggerAspect {    @Before("execution(public int com.zyh.aop.impl.CalImpl.*(..))")    public void before(JoinPoint joinPoint) {        String name = joinPoint.getSignature().getName();        Object[] args = joinPoint.getArgs();        System.out.println(name + "方法的参数是:" + Arrays.toString(args));    }    @After("execution(* com.zyh.aop.impl.CalImpl.*(..))")    public void after(JoinPoint joinPoint){        String name = joinPoint.getSignature().getName();        System.out.println(name+"方法执行完毕");    }    @AfterReturning(value = "execution(* com.zyh.aop.impl.CalImpl.*(..))",returning = "rs")    public void afterReturning(JoinPoint joinPoint,Object rs){        String name = joinPoint.getSignature().getName();        System.out.println(name+"方法执行的结果是:"+rs);    }@AfterThrowing(value = "execution(* com.zyh.aop.impl.CalImpl.*(..))",throwing = "ex")    public void afterThrowing(JoinPoint joinPoint,Exception ex){    String name = joinPoint.getSignature().getName();    System.out.println(name+"方法抛出异常"+ex);}}
  • @Component,把切面类加载到IOC容器中
  • @Aspect,表示该类是一个切面类
  • @Before,表示方法的执行时机是在业务方法之前,execution表达式表示切入点是CalImpl中的所有方法
  • @After,表示方法的执行时机是在业务方法结束以后,execution表达式表示切入点是CalImpl类中的方法
  • @AfterReturning,表示方法的执行时机是在业务方法返回结果后,execution表达式表示切入点是CalImpl类中的方法,returning是把业务方法的返回值和切面类方法的形参进行绑定
  • @AfterThrowing,表示方法的执行时机是在业务方法抛出异常后,execution表达式表示切入点是CalImpl类中的方法,throwing是把业务方法的异常和切面类方法的形参进行绑定
    在这里插入图片描述
  1. 委托类也需要添加@Component
@Componentpublic class CalcImpl implements Calc{    @Override    public int add(int a, int b) {        int result=a+b;        return result;    }    @Override    public int sub(int a, int b) {       int result=a-b;       return result;    }    @Override    public int mul(int a, int b) {        int result= a*b;        return result;    }    @Override    public int div(int a, int b) {        int result= a/b;        return result;    }}

spring-aop.xml

           
  • aspectj-autoproxy ,Spring IOC容器会结合切面对象和委托对象自动生成动态代理对象,AOP底层就是通过动态代理机制来实现的

测试
在这里插入图片描述
AOP的概念

  • 切面对象:根据切面抽象出来的对象,CalImpl所有方法中需要加入日志的部分LoggerAspect
  • 通知:切面对象具体执行的代码,即非业务代码,LoggerAspect对象打印日志的代码
  • 目标:被横切的对象,即CalImpl,把通知加入其中
  • 代理:切面对象,通知,目标混合后的结果,即我们通过jdk动态代理机制创建的对象
  • 连接点:需要被横切的位置,即通知要插入业务代码的具体位置

来源地址:https://blog.csdn.net/qq_52797170/article/details/125549416

--结束END--

本文标题: Spring全面详解(学习总结)

本文链接: https://www.lsjlt.com/news/371594.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring全面详解(学习总结)
    Spring FrameWork一、 前言二、IOC(控制反转)2.1 对于IOC的理解2.2如何使用IOC2.3配置文件的解读2.4IOC容器创建bean的两种方式2.5从IOC容器中取bean2.6bean的属性如...
    99+
    2023-08-16
    spring java IOC AOP
  • Spring-全面详解(学习总结)
    目录一、Spring介绍简介特点、主要特点为什么要学?二、IOC(依赖注入)Spring 容器IOC 和 bean介绍控制反转:容器概述:bean介绍AOP总结一、Spring介绍 ...
    99+
    2022-11-12
  • Spring MVC详解(学习总结)
    一、Sprig MVC简介1.1介绍1.2MVC是什么 二、Spring MVC实现原理2.1核心组件2.2工作流程 三、第一个Spring MVC四、常用注解五、参数绑定5.1URL风格参数绑定5.2RESTful风格...
    99+
    2023-08-16
    mvc spring 学习 Spring MVC
  • spring框架学习总结
    目录Spring 框架概述Spring优点Spring体系结构Spring拓展Spring Boot与Spring CloudSpring IoC 容器 (IoC 也称为依赖项注入(...
    99+
    2022-11-12
  • Java 线程池全面总结与详解
    目录原理阻塞队列有界阻塞队列无界阻塞队列同步移交队列实现类分析使用Executors创建线程池线程池关闭线程池是很常用的并发框架,几乎所有需要异步和并发处理任务的程序都可用到线程池。...
    99+
    2022-11-12
  • Spring框架学习常用注解汇总
    目录类注解方法或属性上注解参数注解类注解 @component 标注类,泛指各种组件,类不属于各种分类的时候,用它做标注。 @Service 标注类,声明该类为业务层组件,用于处理业...
    99+
    2022-11-12
  • Spring框架学习之AOP详解
    目录一、概念二、底层原理:动态代理2.1 有接口, JDK 动态代理2.2 无接口, CGLIB 动态代理三、术语四、操作4.1 Spring 框架一般都是基于 AspectJ 实现...
    99+
    2022-11-12
  • Python包的大总结!全面学习Python包:包的构建与分发
    ...
    99+
    2023-06-02
  • Mongoose学习全面理解(推荐)
    一、创建schemas 创建schemas的方式: var userSchema = new mongoose.Schema({ name: String, email: String, ...
    99+
    2022-06-04
    Mongoose
  • Spring框架学习之Cache抽象详解
    目录1.简介cache和buffer2.缓存抽象3.spring缓存抽象与多进程 官方文档  8.0 Spring为不同缓存做了一层抽象,这里通过阅读文档以及源码...
    99+
    2022-11-12
  • spring学习教程之@ModelAttribute注解运用详解
    本文主要给大家介绍了关于java中@ModelAttribute使用的相关资料,分享出来供大家参考学习,下面来一起看看详细的介绍:一、@ModelAttribute注释方法 例子(1),(2),(3)类似,被@ModelAttri...
    99+
    2023-05-31
    spring 注释 @modelattribute
  • PythonPandas学习之Pandas数据结构详解
    目录1 Pandas介绍2 Pandas数据结构2.1 Series2.2 DataFrame1 Pandas介绍 2008年WesMcKinney开发出的库 专门用于数据挖掘的开源...
    99+
    2022-11-13
  • 【Bug 全解决】 Java、Spring boot 后端项目 Bug 总结
    Bug 收集与总结 本文记录的是 SpringBoot 后端项目使用和运行代码时所遇到的各种问题,全部都已解决,欢迎在评论区补充你遇到的 Bug 哦!仅以本文记录学习社区项目时,所遇到的奇奇怪怪的 bug,以及一些很愚蠢的错误,以警醒自己不...
    99+
    2023-08-16
    java bug spring boot spring 后端
  • 从搬砖工到架构师,Java全栈学习路线总结
    🌇文章目录 前言一、前置知识二、 Web前端基础示例:1.文本域2.密码字段 三、后端基础一. Java基础二. 数据库技术三. Web开发技术四. 框架技术五. 服...
    99+
    2023-09-02
    java 学习 jvm spring spring boot
  • R语言学习ggplot2绘制统计图形包全面详解
    目录一、序二、ggplot2是什么?三、ggplot2能画出什么样的图?四、组装机器五、设计图纸六、机器的零件1. 零件——散点图1) 变换颜色2) 拟合曲线3) 变换大小4) 修改...
    99+
    2022-11-12
  • node基础学习:前端需了解的知识【总结】
    本篇文章带大家聊聊node的基础知识点,总结分享一些前端需要去了解的nodejs知识,希望对大家有所帮助!无论是前端开发还是后台开发个人认为都不应该局限于自己所在的领域,多去突破舒适圈才能有所提升,孰虽然能生巧,但我们也要知道学而不思则惘,...
    99+
    2023-05-14
    Node.js 前端
  • spring学习之参数传递与检验详解
    前言Spring是于2003 年兴起的一个轻量级的Java 开发框架,非常受现在开发者的喜爱,下面这篇文章主要给大家介绍了关于spring参数传递与检验的相关内容,分享出供大家参考学习,下面来一起看看详细的介绍:一、背景在spring请求时...
    99+
    2023-05-31
    spring 参数传递 sprin
  • 详解Spring batch 入门学习教程(附源码)
    Spring batch 是一个开源的批处理框架.执行一系列的任务. 在 spring batch 中 一个job 是由许多 step 组成的。而每一个 step  又是由 READ-PROCESS-WRITE task或者 单个...
    99+
    2023-05-30
    spring batch tc
  • 详解Spring学习之编程式事务管理
    前言在前面的内容,基本已经学习了事务的基本概念以及事务隔离级别等,接下来的几个小节,将学习怎么使用Spring进行事务管理,在Spring中,对事务进行管理有多种方法,主要分别编程式和声明式,本小节主要学习编程式事务管理,后面讲学习Spri...
    99+
    2023-05-31
    spring 编程式 事务
  • Spring Boot学习入门之AOP处理请求详解
    前言面向切面(AOP)Aspect Oriented Programming是一种编程范式,与语言无关,是一种程序设计思想,它也是spring的两大核心之一。在spring Boot中,如何用AOP实现拦截器呢?首先加入依赖关系:<d...
    99+
    2023-05-31
    springboot aop 处理请求
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作