自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring Cache - Redis 的使用 自定义缓存配置

Spring Cache官网:https://docs.spring.io/spring-framework/docs/5.2.11.RELEASE/spring-framework-reference/integration.html#cache一、使用1、引入依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starte

2020-12-13 11:59:00 1706

原创 分布式缓存数据一致性问题

双写模式双写模式是指修改数据后写到数据库,接着写到缓存双写模式带来的问题A:写数据B:写数据–>写到缓存A:写到缓存B写了数据,最终读到的是A写的数据;可能由于卡顿等原因,导致写缓存B在最前,写缓存A在后面就出现了不一致;双写模式的解决方案第一种:给写到数据库和写到缓存加锁,保证整个过程的完整性;第二种:看业务是否允许数据短时间的不一致性(给缓存加过期时间)失效模式失效模式值数据更新写入数据库,删除缓存数据,下次查时再存入缓存失效模式带来的问题A:写数据db

2020-12-12 11:23:37 658

原创 分布式信号量 Semaphore

基于Redis的Redisson的分布式信号量(Semaphore);Java对象RSemaphore采用了与 juc 包下 Semaphore相似的接口和用法。同时还提供了异步(Async)、反射式(Reactive)、RxJava2标准的接口。模拟车库停车, 3个车位//停车@GetMapping("/park")@ResponseBodypublic String park() throws InterruptedException { // 在redis中存 pack = 3

2020-12-12 11:06:15 1707

原创 分布式闭锁 CountDownLatch

基于Redisson的Redisson分布式闭锁(RCountDownLatch),跟 juc包下的CountDownLatch类的接口和用法相似;模拟锁门,5个同学,全部离开教室后锁门//锁门@GetMapping("/lockDoor")@ResponseBodypublic String lockDoor() throws InterruptedException { RCountDownLatch door = redisson.getCountDownLatch("door"

2020-12-12 10:55:05 761

原创 分布式读写锁 RReadWriteLock

分布式读写锁(ReadWriteLock)基于Redis的Redisson分布式可重入读写锁RReadWriteLock ,实现了 juc lock包下的 ReadWriteLock接口。分布式可重入读写锁允许同时有多个读锁和一个写锁处于加锁状态。ReadWriteLock可以保证一定能读到最新数据,修改期间,写锁是一个排它锁(互斥锁、独享锁),读锁是一个共享锁;写锁没释放读锁必须等待;读 + 读 :相当于无锁,并发读,只会在Redis中记录所有当前的读锁。他们都会同时加锁成功;写 + 读 :

2020-12-12 00:18:15 1849 3

原创 分布式锁redisson的使用 看门狗原理

redisson 的使用1、引入依赖<!-- 以后使用Redisson作为所有分布式锁,分布式框架等功能框架 --><dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.12.0</version></dependency>2、配置类@Co

2020-12-09 13:16:41 10342 8

原创 spring AOP切面的使用

AOP:【动态代理】指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式;使用导入aop模块;Spring AOP:(spring-aspects)定义一个业务逻辑类,在业务逻辑运行的时候将日志进行打印(方法之前、方法运行结束、方法出现异常,xxx)定义一个日志切面类:切面类里面的方法需要动态感知目标方法运行到哪里然后执行;前置通知 @Before:在目标方法运行之前运行;后置通知 @After:在目标方法运行结束之后运行(无论方法正常结束还是异常结束);

2020-12-09 12:51:55 636

原创 @Profile 根据环境变量注册Bean

@Profile:提供的可以根据当前环境,动态激活和切换一系列组件的功能;开发环境、测试环境、生产环境;数据源:A/B/C;@Profile:指定组件在哪个环境的情况下才能被注册到容器中,不指定,任何环境下都能注册这个组件;加了环境标识的bean,只有这个环境被激活的时候才能注册到容器中。默认是default环境;写在配置类上,只有是指定的环境的时候,整个配置类里面的所有配置才能开始生效;没有标注环境标识的bean在,任何环境下都是加载的;根据环境加载数据源配置文件:dbconf

2020-12-08 23:36:29 190

原创 自定义组件使用spring底层组件

自定义组件想要使用Spring容器底层的一些组件(ApplicationContext,BeanFactory等),需要实现xxxAware;在创建对象的时候,会调用接口规定的方法注入相关组件;把Spring底层一些组件注入到自定义的Bean中;例如:拿到spring的IOC容器,实现ApplicationContextAware接口;获得spring ioc容器给当前Bean设置的名称,实现BeanNameAware接口;获得特殊符号的解析器,实现EmbeddedValueResol

2020-12-08 23:26:49 222

原创 spring 依赖注入的三种方式

@Autowired:构造器,参数,方法,属性;都是从容器中获取参数组件的值;1)、set方法注入;2)、构造器注入;3)、作为Bean方法的参数注入;例子:Boss 注入Car类第一种、set方式注入//Car类package com.spring.bean;@Componentpublic class Car { public Car() { System.out.println("car...constructor"); }}//Boss类package com.sp

2020-12-07 12:46:01 2197

原创 spring自动装配的3种注解

@Autowired@Qualifier@Primary@Resource@Inject@Autowired 自动装配自动装配:Spring利用依赖注入(DI),完成对IOC容器中中各个组件的依赖关系赋值;@Autowired:自动注入:1)、默认优先按照类型去容器中找对应的组件,找到就赋值;2)、如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找;3)、@Qualifier(“beanName”):使用@Qualifier指定需要装配的组件的id,而不是

2020-12-07 12:20:36 4255

原创 @Value 给属性赋值

@Value:给属性赋值1、基本数值2、可以写SpEL; #{}3、可以写${};取出配置文件【properties】中的值(在运行环境变量里面的值)@Data@AllArgsConstructor //lombok:全部参数的构造方法@NoArgsConstructor //lombok:空构造public class Person { @Value("张三") private String name; @Value("#{20-2}") private int age; @Va

2020-12-06 21:56:18 1898

原创 spring 注册组件的4种方式

给容器中注册组件的4种方式包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)[自己写的类]@Bean [导入的第三方包里面的组件]@Import [快速给容器中导入一个组件]1)@Import (要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名2)ImportSelector:返回需要导入的组件的全类名数组;3)ImportBeanDefinitionRegistrar:手动注册bean到容器中详见:@

2020-12-06 21:35:27 481

原创 Bean 初始化和销毁的四种回调方法

Bean初始化和销毁的四种回调方法 * 1)、指定初始化和销毁方法; * 通过@Bean指定init-method和destroy-method; * 2)、通过让Bean实现InitializingBean(定义初始化逻辑),DisposableBean(定义销毁逻辑); * 3)、使用JSR250; * @PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法 * @PreDestroy:在容器销毁bean之前通知我们进行清理工作 * 4)、BeanP

2020-12-05 21:56:15 1177

原创 BeanPostProcessor 后置处理器

BeanPostProcessor【interface】:bean的后置处理器;在bean初始化前后进行一些处理工作;spring底层大量使用;postProcessBeforeInitialization:在初始化之前工作postProcessAfterInitialization:在初始化之后工作可以作为Bean初始化前后的回调方法;//后置处理器:初始化前后进行处理工作//将后置处理器加入到容器中@Componentpublic class MyBeanPostProces

2020-12-05 21:46:50 107

原创 @PostConstruct和@PreDestroy 注解

@PostConstruct和@PreDestroy@PostConstruct和@PreDestroy是JSR250里面的注解;(还有@Resource)JSR250规范:JSR是 Java Specification Requests 的缩写,意思是Java 规范提案。是指向 JCP (Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。(来自百度百科)新增一个

2020-12-05 21:40:19 1776

原创 算法题:1000个苹果和10个箱子

最近去面试笔试遇到一道算法题,题目是放在最后面的加分题,大概内容如下:现在有1000个苹果,和10个箱子,如何把这1000个苹果装在这10个箱子里,才能使不管任何数量(1-1000)的苹果,都能一次给出?当时我基本没思路,也没多少时间,直接跳过了;后来查了一下,用到二进制的思想;1000个苹果,最接近1024,转化为2进制,需要占用10个bit,则从右往左数,第一个bit位表示1个苹果,第二个bit位表示2个苹果,第三个bit位表示4个苹果,,,第10个bit位表示剩下的489个苹果。分别把这

2020-12-03 15:30:50 9489 2

原创 FactoryBean 创建Bean

实现FactoryBean接口,重写getObject、getObjectType方法;Spring 的FactoryBean 大量应用在和第三方框架集成中;//创建Color类public class Color {}//创建一个Spring定义的FactoryBeanpublic class ColorFactoryBean implements FactoryBean<Color> { //返回一个Color对象,这个对象会添加到容器中 @Override publ

2020-12-02 23:50:23 316

原创 @Import 导入组件

给容器导入组件时,可以通过注解@Controller/@Service/@Repository/@Component ,然后后进行包扫描,这些都是我们自己写的类;如果是第三方的类,可以通过@Bean的方式导入组件,还可以通过@Import方式导入;@Import 直接导入类@Import({Color.class})容器中就会自动注册这个组件,id默认是全类名测试://Color类@Datapublic class Color {}//配置类@Configuration@Import

2020-12-02 23:35:31 982

原创 @Conditional 按条件加载容器

@Conditional@Conditional({Condition}):按条件注册Bean可以加在方法上面,也可以加在类上面;测试用例:如果系统是windows,给容器中注册(“bill”)如果是linux系统,给容器中注册(“linus”)@Data@AllArgsConstructor@NoArgsConstructorpublic class Person { private String name; private int age;}@Bean@Conditio

2020-12-01 14:44:32 163

原创 @Lazy 懒加载

@Lazy单实例bean默认在容器启动的时候创建对象;懒加载:容器启动不创建对象。第一次使用(获取)Bean创建对象,并初始化;@Lazy@Bean("person")public Person person(){ System.out.println("创建Person对象"); return new Person("lishi",20);}@Testpublic void test02(){ ApplicationContext applicationConte

2020-12-01 14:41:22 299

原创 @Scope-设置Bean的作用域

@Scope@Scope:设置Bean的作用域@Configuration public class MainConfig02 { /** * * @Scope:调整作用域 * * prototype:多实例的:ioc容器启动并不会去调用方法创建对象放在容器中。 * * 每次获取的时候才会调用方法创建对象; * * singleton:单实例的(默认值):ioc容器启动会调用方法创建对象放到ioc容器中。 * * 以后

2020-12-01 12:11:13 259 1

原创 @ComponentScan-自动扫描组件

@ComponentScan扫描com.baidu包下面的所有组件@ComponentScan(value="com.baidu")扫描com.baidu下的所有组件,排除@Service注解的组件@ComponentScan(value = "com.baidu", excludeFilters = {@ComponentScan.Filter(type = ANNOTATION,classes = {Service.class})})type = ANNOTATION,按注解

2020-12-01 11:58:14 862

空空如也

空空如也

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

TA关注的人

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