自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 收藏
  • 关注

原创 Spring Boot学习笔记(二)——yaml语法

properties和yaml语法在创建一个SpringBoot项目时,默认会在resources目录下创建一个application.properties的配置文件,在SpringBoot项目中,其实也可以使用application.yaml这样的配置文件代替

2021-05-28 16:48:51 286 1

原创 Spring Boot学习笔记(一)——创建项目

什么是Spring Boot ?Spring是为了解决企业级应用开发的复杂性而创建的,Spring Boot其设计目的是用来简化新Spring应用的初始搭建以及开发过程。Spring Boot框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。Spring Boot有什么好处 ?为所有Spring开发者更快的入门开箱即用,提供各种默认配置来简化项目配置内嵌式容器简化Web项目没有冗余代码生成和XML配置的要求我们之前搭建一个Spring Web项目的时候怎么做的呢?我

2021-05-26 23:26:59 834 5

原创 单例模式

单例模式(Singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点,单例模式是创建型模式。单例模式分为饿汉式单例和懒汉式单例饿汉式单例:public class Hungry { private final static Hungry hungry = new Hungry(); private Hungry() { // 构造器私有 } public static Hungry getInstance(){

2021-04-29 00:18:18 125 3

原创 Spring MVC学习笔记(三)——数据处理

处理表单提交的数据:① 通过Servlet API 处理:Controller类可以拿到HttpServletRequest、HttpServletResponse对象,所以可以通过Servlet API来获取前端提交的数据,也可以通过Servlet API 来传递返回信息给前端:@Controller@RequestMapping("/c6")public class ControllerTest6 { @RequestMapping("/t1") public String t

2021-04-23 00:29:02 163

原创 Spring MVC学习笔记(二)——控制器Controller、转发与重定向

控制器Controller:控制器提供复杂访问应用程序的行为,通常通过实现接口定义或注解定义两种方式实现解析处理用户的请求并将结果返回给DispatcherServlet定义控制器Controller的两种常用方式:① 实现Controller接口:实现org.springframework.web.servlet.mvc.Controller接口,并重写handleRequest方法:首先创建一个项目,编写web.xml文件:<?xml version="1.0" encoding

2021-04-22 16:08:27 1310

原创 Spring MVC学习笔记(一)——第一个Spring MVC 程序

Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。下面写一下我们的第一个 Spring MVC 程序:创建一个Spring MVC 项目,我是先创建了一个普通Module项目,然后为这个Module添加MVC框架支持:在web.xml文件中注册DispatcherServlet:<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp

2021-04-21 22:01:20 195 1

原创 Spring学习笔记(七)——Spring整合Mybatis及事务管理

Spring整合mybatis示例:首先创建一个User类:@Data@AllArgsConstructor@NoArgsConstructorpublic class User { private int id; private String name; private String password;}创建这个类的映射接口UserMapper:public interface UserMapper { public List<User> ge

2021-04-19 17:32:17 365

原创 Spring学习笔记(六)——面向切面编程AOP

AOP (Aspect Orient Programming)AOP 要达到的效果是,保证开发者不修改源代码的前提下,去为系统中的业务组件添加某种通用功能。AOP 的本质是由 AOP 框架修改业务组件的多个方法的源代码,看到这其实应该明白了,AOP 其实就是前面一篇文章讲的代理模式的典型应用。面向切面编程AOP的底层是通过代理模式实现的,代理模式可以看我上一篇博客专门讲了代理模式,Spring 中的 AOP 是通过动态代理实现的...

2021-04-18 16:25:54 180 1

原创 代理模式

什么是代理模式?代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。为什么要用代理模式?中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。开闭原则,增加功能:代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。代

2021-04-17 20:08:17 107

原创 Spring学习笔记(五)——Spring中常用的注解

Spring中常用的注解:@Autowired :进行自动装配,先通过byType进行自动装配,再通过byName进行自动装配,@Autowired(required = false)允许这个bean属性在xml文件不存在(没有在xml文件中配置),默认required=true@Qualifier :搭配@Autowired使用,@Qualifier(value = id) 查找指定id的bean进行自动装配@Resource :进行自动装配,先通过byName进行自动装配,再通过byType进

2021-04-17 13:13:59 205 1

原创 Spring学习笔记(四)——自动装配

什么是自动装配?自动装配是Spring满足bean依赖的一种方式,Spring在上下文中自动寻找,并自动给当前bean装配与其关联的其他bean属性。Spring中实现自动装配的方式有两种:一种是通过xml文件、另一种是通过注解。有以下三个实体类:public class Cat { public void shout(){ System.out.println("猫叫喵喵喵~"); }}public class Dog { public void sh

2021-04-16 20:16:10 450 1

原创 Spring学习笔记(三)——依赖注入DI

依赖注入分两种:基于构造函数的依赖注入和基于Setter的依赖注入依赖:bean对象的创建依赖于Spring容器注入:bean对象的所有属性由Spring容器来注入基于构造函数的依赖注入可以参考学习我上一篇博客中关于通过有参构造方法创建对象的内容,下面我重点介绍基于Setter的依赖注入。首先创建一个Student类:public class Student { private String name; private Address address; // 引用Address类

2021-04-15 16:46:52 109

原创 Spring学习笔记(二)——控制反转IOC创建对象(Bean)的方式

通过无参构造方法创建对象先创建一个User类:public class User { private String name; private int age; public User() { System.out.println("User的无参构造"); } public String getName() { return name; } public void setName(String name) {

2021-04-14 22:23:35 169 1

原创 Spring学习笔记(一)——控制反转IOC

我们以前写代码是先写一个持久层Dao的接口,并写一个对应的实现类:public interface UserDao { public void introduce();}public class UserADaoImpl implements UserDao{ public void introduce(){ System.out.println("大家好,我是A"); }}调用的话在写一个业务层Service的接口,再写一个对应的实现类:public

2021-04-14 20:54:17 200 1

转载 Mybatis学习笔记(五)——动态SQL

链接: https://www.cnblogs.com/ysocean/p/7289529.html.链接: https://mybatis.org/mybatis-3/zh/dynamic-sql.html.

2021-04-10 17:31:19 71

原创 Mybatis学习笔记(四)——结果集映射

resultType 和 resultMapresultType 和 resultMap 两个属性用于指定结果集封装对象,二者只能用一个, 通常能用resultType时, 优先适用resultType,resultMap 用于处理resultType 不能处理的场景。resultType适用场景:resultType 在自动封装java对象时,必须要求字段名和java中的属性名一致,或使用驼峰映射成功(需全局开启支持驼峰映射),而且类中属性只能是基本属性,不能有Java Object 属性。测

2021-04-10 00:31:31 203

原创 Mybatis学习笔记(三)——通过注解进行CRUD操作

Mybatis对于UserMapper这样的映射器类除了可以使用UserMapper.xml这样的XML来配置完成语句映射,还可以使用注解来配置完成语句映射。使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。package pojo;import lombok.AllArgsConstructor;import lombok.Data;im

2021-04-08 16:47:23 119 2

原创 Mybatis学习笔记(二)——通过xml文件进行CRUD操作

简单的CRUD操作UserMapper:package dao;import pojo.User;import java.util.List;public interface UserMapper { public List<User> getUserList(); public User getUserById(int id); public int addUser(User user); public int updateUser(Use

2021-04-07 22:33:57 261

原创 Mybatis学习笔记(一)——Mybatis程序环境搭建

一. 什么是MybatisMyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。...

2021-04-06 23:03:08 143

原创 学习笔记——Cookie和Session的区别

一. 会话会话:用户打开浏览器,访问多个web资源,关闭浏览器,这个过程就是一次会话二. 保存会话的两种方式① cookie是一种客户端技术服务端给客户端一个信件,客户端下次访问服务端带上这个信件就可以让服务端知道你曾经来过② session是一种服务端技术,可以保存客户端的会话信息服务器登记你曾经来过,下次在访问服务端服务器自己匹配查询就可以知道你曾经来过Cookie 中常用方法:Cookie[] cookies = req.getCookies(); // 获得Cookie,可能有多

2021-03-26 22:36:36 185 1

原创 Servlet——ServletContext对象使用介绍

全文目录一. 什么是ServletContext ?二. 如何获取ServletContext对象三. ServletContext常用方法四. ServletContext的作用① 共享数据② 获取全局配置参数③ 请求转发一. 什么是ServletContext ?ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且项目内部的所有servlet都共享这个对象,所以叫全局应用程序共享对象。二. 如

2021-03-24 21:54:18 130 1

原创 线程池详解——三大方法、七大参数、四种拒绝策略

池化技术:事先准备好一些资源,有人要用,就来我这里拿,用完之后还给我程序的运行的本质 :占用系统的资源! 池化技术可以优化资源的使用线程池、连接池、内存池、对象池///......创建、销毁十分浪费资源线程池的好处:① 降低资源的消耗② 提高响应的速度③ 方便管理线程池的作用:线程复用、可以控制最大并发数、管理线程三大方法① newSingleThreadExecutor() ExecutorService threadPool = Executors.newSingleThrea

2021-03-04 20:11:07 335 1

原创 Function、 Predicate、 Consumer、Supplier四大函数式接口详解

函数式接口:只有一个抽象方法的接口就是函数式接口只要是函数式接口就可以使用Lambda表达式简化代码使用函数式接口能简化编程模型Function函数型接口Function:有一个输入参数,有一个返回值举例:public class FunctionTest { public static void main(String[] args) {// Function function = new Function<String,String>() {//

2021-03-04 12:57:45 580 6

原创 BlockingQueue阻塞队列详解

BlockingQueue 和 SynchronousQueueBlockingQueueBlockingQueue的四组API:① add 和 removeadd(E e) :将指定的元素插入到此队列中,成功则返回true,队列满了插入失败则抛出异常java.lang.IllegalStateException: Queue fullremove() :返回并删除队首元素,如果队列为空删除失败则抛出异常java.util.NoSuchElementExceptionelement() :返

2021-03-03 20:31:33 360 4

原创 读写锁 ReadWriteLock的使用

ReadWriteLock是一个接口,只有一个实现类ReentrantReadWriteLock 读写锁:读的时候可以多线程同时读,写的时候只能有一个线程单独写,读的时候不允许写读锁readLock即共享锁写锁writeLock即独占锁使用举例:public class ReadWriteLockTest { public static void main(String[] args) { Data data = new Data(); // 多线程同时

2021-03-03 17:20:30 422 3

原创 CountDownLatch、CyclicBarrier、Semaphore三大常用类详解

CountDownLatch类似于一个减法计数器:CountDownLatch(int count) 构造方法初始一个计数值public class CountDownLatchTest { public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(6); //计数值为6 for

2021-03-02 22:43:42 115

原创 Callable开启线程详解

Callable接口类似于Runnable ,因为它们都是为其实例可能由另一个线程执行的类设计的, 然而Runnable不返回结果,也不能抛出被检查的异常。Callable和Runnable的区别:① Callable有返回值② Callable可以抛出异常③ Callable的方法是call(),Runnable的方法是run()Callable、Thread、Runnable之间的关系:通过Thread的构造方法创建线程时,构造方法不能直接放入Callable对象,只能放入Runnable

2021-03-02 21:02:18 1253

原创 集合类不安全问题及解决方案

文章目录一. List不安全1、代码演示2、异常原因3、导致原因4、解决方法① 使用Vector:② 使用Collections.synchronizedList(List list):③ 使用CopyOnWriteArrayList:二. Set不安全1、代码演示2、异常原因3、导致原因4、解决方法① 使用Collections.synchronizedSet(Set s)② 使用CopyOnWriteArraySet三. Map不安全1、代码演示2、异常原因3、导致原因4、解决方法① 使用Collect

2021-03-02 20:03:19 131

原创 8锁问题

8锁问题:关于锁的8个问题public class demo01 { public static void main(String[] args) { Phone1 phone = new Phone1(); new Thread(()->{ phone.send(); },"A").start(); // 延时2秒 try { TimeUnit.SECONDS

2021-03-01 23:08:56 92 1

原创 线程同步 synchronized 和 Lock 的区别

synchronized 和 Lock 的区别:① synchronized是内置的Java关键字,Lock是一个接口② synchronized无法判断是否获取到锁,Lock可以判断是否获取到锁③ synchronized会自动释放锁,Lock必须要手动释放锁,否则可能会死锁!④ synchronized当有两个线程,其中一个得到锁,另一个线程则死等,Lock不一定会死等⑤ synchronized是可重入锁 不可中断的 非公平锁,Lock是可重入锁 可以判断锁 可设为公平锁⑥ synchro

2021-03-01 21:53:35 303 4

原创 注解与反射

一. 注解注解(Annotation):不是程序本身,可以对程序做出解释,也可以被其他程序读取。注解格式:@注释名,也可以添加一些参数,如:@SuppressWarnings(value="unchecked")1. 内置注解内置注解有三种:① @Override : 重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。只能修饰方法。② @Deprecated : 标记过时方法。所标注内容,不再被建议使用。可以修饰方法、属性、类。③ @SuppressWarnings

2021-02-25 13:45:49 107 3

原创 多线程详解(三)——线程同步

一. 什么是线程同步处理多线程问题时,当多个线程访问同一对象,并且某些线程还想修改这个对象时,就需要线程同步。线程同步其实是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面的线程使用完毕,下一个线程再使用。线程同步的条件:等待队列 和 锁如果不进行线程同步,处理多线程问题时会出现线程不安全的情况:public class TestThread { public static void main(String[] args) { Test te

2021-02-20 15:41:31 202 3

原创 多线程详解(二)——Thread类中的常用方法

一. 线程的五大状态新建状态:使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态,它保持这个状态直到程序 start() 这个线程。就绪状态:当线程对象调用了start()方法之后,该线程就进入就绪状态,就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。运行状态:如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态,处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。阻塞状态:如果一个线程执行了sl

2021-02-19 22:17:47 296 1

原创 Lambda表达式的使用

函数式接口:如果一个接口中只有一个抽象方法,那么它就是函数式接口。对于函数式接口我们可以通过Lambda表达式创建该接口对象。Lambda表达式:1. 以下为Lambda表达式的"进化"之路 :① 首先定义一个函数式接口:// 1. 定义一个函数式接口interface Lambda{ void like();}② 平时正常使用这个接口,我们是在外面定义它的实现类,再在主函数中创建该实现类对象,然后通过实现类对象调用方法。public class TestLambda {

2021-02-19 17:53:41 426

原创 多线程详解(一)——创建多线程

一. 进程与线程:1. 进程:进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。2. 线程:线程是一条执行路径,是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。

2021-02-18 22:29:01 878

原创 JAVA中的异常处理

try…catch…finally… 处理异常 :首先执行 try 中的代码,如果出现异常则由 catch 捕捉处理,最后执行 finally 中的代码,如果没有异常,则直接顺序执行 finally 中的代码。public static void main(String[] args) { int a = 1; int b = 0; try{ System.out.println(a/b); }catch (Arit

2021-02-16 21:28:48 62

原创 JAVA中静态代码块、普通代码块、构造方法的执行顺序

静态代码块static { System.out.println("静态代码块"); }静态代码块只在第一次创建该对象时调用一次,以后再创建该对象不在调用一个类中有多个静态代码块时,会按照书写顺序依次执行普通代码块{ System.out.println("匿名代码块");}普通代码块每次创建对象时都会调用一次执行顺序:静态代码块>普通代码块>构造方法public class test { //普通代码块 {

2021-02-16 16:52:50 775

原创 JAVA方法中的可变参数

JAVA方法中的可变参数JDK1.5开始,Java支持传递同类型的可变参数给一个方法在声明方法时,在指定参数类型后加上省略号(...)表示可变参数一个方法中只能声明一个可变参数,且只能是方法中的最后一个参数,其他的普通参数必须在它之前声明 public static void main(String[] args) { test(); test(1); test(1,2,3); } public static void test(i

2021-02-10 17:05:32 114

原创 Java中的整数拓展——进制

Java中的整数拓展——进制二进制定义时加上 0bint i2 = 0b10;八进制定义时加上 0int i3 = 010;十六进制定义时加上0xint i4 = 0x10;

2021-02-09 18:53:48 95

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除