二者都是用于bean的注入
区别有:①@Autowired是spring提供的注解,而@Resouce是由J2EE提供的,在javax.annotation.Resource包html
②@Autowired默认按类型装配,若是要按照名称装配,须要加上@Qualifier注解,以下:java
public class TestServiceImpl { @Autowired @Qualifier("userDao") private UserDao userDao; }
@Resource默认经过反射机制,按照名称装配,若是匹配不上则会抛出异常。也可指定type属性进行匹配,经过类型匹配到多个或者匹配不上也会抛出异常redis
Redis是一个基于内存的高性能的key-value数据库算法
优势:spring
(1)速度快,应该数据都在内存中sql
(2)支持丰富的数据类型,有string、list、set、sorted set、hash数据库
(3)支持事务,操做都是原子性编程
(4)可设置过时时间,可用于缓存等设计模式
一、缓存雪崩:因为原有缓存失效(或者数据未加载到缓存中),新缓存未到期间,全部本来应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存形成巨大压力,严重的会形成数据库宕机,形成系统的崩溃。数组
解决思路:
二、缓存穿透:指用户查询数据,在数据库没有,天然在缓存中也不会有。这样就致使用户查询的时候,在缓存中找不到,每次都要去数据库中查询。
解决思路:
三、缓存预热:指系统上线后,将相关的缓存数据直接加载到缓存系统。这样就能够避免在用户请求的时候,先查询数据库,而后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!
四、缓存更新
五、缓存降级:当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然须要保证服务仍是可用的,即便是有损服务。系统能够根据一些关键数据进行自动降级,也能够配置开关实现人工降级。
分布式缓存系统面临的问题缓存一致性问题
缓存数据的淘汰
缓存算法
ThreadLocal 保证一个线程使用同一个对象
ThreadPoolExcutor 线程池建立
序列化是指把对象转换为字节序列的过程;而反序列化是指把字节序列恢复为对象的过程;
序列化主要的两种用途:
1)把对象的字节序列保存到硬盘中(一般存放在一个文件中)
2)在网络上传送对象的字节序列
何时使用序列化:
1)对象序列化能够实现分布式对象,主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时同样。
2)java对象序列化不只保留一个对象的数据,并且递归保存对象引用的每一个对象的数据。能够将整个对象层次写入字节流中,能够保存在文件中或在网络链接上传递。利用对象序列化能够进行对象的“深复制”,即复制对象自己及引用的对象自己。序列化一个对象可能获得整个对象序列。
IoC就是对象的建立,依赖都有Spring及配置文件控制;而AOP就是统一的给一些相似的方法加上一样的功能,好比日志,事务。
IOC:控制反转,是一种设计模式。
1)控制反转,由传统在程序中控制,变为由容器控制
2)依赖注入:将互相依赖的对象分离,在Spring配置文件中描述他们的依赖关系。他们依赖关系只在使用的时候才创建。
AOP:面向切面。将系统中非核心的业务提取出来,进行单独处理,好比事务、日志和安全等。
实现方式:
通知类型:
注意编程中核心是一个ProceedingJoinPoint
1 @Component
2 @Aspect 3 public class Operator { 4 5 @Pointcut("execution(* com.aijava.springcode.service..*.*(..))") 6 public void pointCut(){} 7 8 @Before("pointCut()") 9 public void doBefore(JoinPoint joinPoint){ 10 System.out.println("AOP Before Advice..."); 11 } 12 13 @After("pointCut()") 14 public void doAfter(JoinPoint joinPoint){ 15 System.out.println("AOP After Advice..."); 16 } 17 18 @AfterReturning(pointcut="pointCut()",returning="returnVal") 19 public void afterReturn(JoinPoint joinPoint,Object returnVal){ 20 System.out.println("AOP AfterReturning Advice:" + returnVal); 21 } 22 23 @AfterThrowing(pointcut="pointCut()",throwing="error") 24 public void afterThrowing(JoinPoint joinPoint,Throwable error){ 25 System.out.println("AOP AfterThrowing Advice..." + error); 26 System.out.println("AfterThrowing..."); 27 } 28 29 @Around("pointCut()") 30 public void around(ProceedingJoinPoint pjp){ 31 System.out.println("AOP Aronud before..."); 32 try { 33 pjp.proceed(); 34 } catch (Throwable e) { 35 e.printStackTrace(); 36 } 37 System.out.println("AOP Aronud after..."); 38 } 39 40 }
通知执行的优先级
进入目标方法时,先织入Around,再织入Before,退出目标方法时,先织入Around,再织入AfterReturning,最后才织入After。
注意:Spring AOP的环绕通知会影响到AfterThrowing通知的运行,不要同时使用!同时使用也没啥意义。
原文:https://blog.csdn.net/chinacr07/article/details/78817449
转发(forward) |
|
||
地址栏 | 不变 | 改成重定向的地址 | |
数据共享 | 能够共享转发前request的数据 | 不能共享request的数据 | |
运用 | 通常用于用户登陆后转发到相应模块 | 通常用于用户注销后回到首页和跳转到其余网站等 | |
效率 | 高 | 低 |
堆:线程共享,存放数组和实例化对象(GC主要在这里进行垃圾回收)jdk8后把运行时常量池、静态变量也移到堆区进行存储
虚拟机栈:线程私有,随线程建立而建立,存放基本数据类型变量和引用等(操做数栈、方法出口等信息)
本地方法栈:线程私有,与虚拟机用到native方法相关,(JNI)
方法区:常量池
程序计数器:JVM支持多个线程同时运行,每一个线程都有本身的程序计数器,运行JVM方法会保存当前指令的地址。(PS:线程执行过程当中并非一口气完成的,执行到一半中止后,下次继续执行时,经过程序计数器就能够知道该从什么地方开始执行)
HashMap | HashTable |
非线程安全 | 线程安全 |
键值容许为null | 不容许为null |
containsValue/containsKey | contains |
继承自Dictionary类 | 是Map接口的实现 |
cookie | session |
数据存放在客户端 | 数据存放在服务器 |
经过http协议实现的 | - |
不安全(存放在浏览器) | 相对安全 |
- | 可能影响服务器性能 |
常规信息可放在cookie | 重要信息如登陆信息等,放在session |
(1)编程式事务管理。咱们须要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。
(2)基于xml配置, 声明式事务管理(TransactionProxyFactoryBean)
(3)基于注解, @Transactional 的声明式事务管理
(4)基于Aspectj AOP配置事务
1 public class ExA { 2 static { 3 System.out.println("父类--静态代码块"); 4 } 5 6 public ExA() { 7 System.out.println("父类--构造函数"); 8 } 9 10 { 11 System.out.println("父类--非静态代码块"); 12 } 13 14 public static void main(String[] args) { 15 new ExB(); 16 } 17 } 18 19 class ExB extends ExA { 20 static { 21 System.out.println("子类--静态代码块"); 22 } 23 { 24 System.out.println("子类--非静态代码块"); 25 } 26 27 public ExB() { 28 System.out.println("子类--构造函数"); 29 } 30 } 31 32 执行结果 33 ===== 34 父类--静态代码块 35 子类--静态代码块 36 父类--非静态代码块 37 父类--构造函数 38 子类--非静态代码块 39 子类--构造函数
sleep()是Thread类中的方法,而wait是Object类提供的方法;
调用sleep()方法的时候,线程不会释放对象锁;
调用wait()方法的时候,线程会释放对象锁,只有对此对象调用notify()方法后,才获取对象锁进入运行状态
原文:https://www.cnblogs.com/hongten/p/hongten_java_sleep_wait.html
(一)、索引
如下状况不会命中索引: