比如A a =new A();
a就是引用变量,它指向了一个A对象,也可以说它引用了一个A对象。我们通过操纵这个a来操作A对象。 此时,变量a的值为它所引用对象的地址。
区别:1)都不能实例化。
2)抽象类可以提供成员方法的实现,而接口中只能存在抽象方法默认 public abstract;
3)抽象类中的成员变量可以是多种类型,而接口中的成员变量必须是public static final(常量)修饰
4)一个类只能继承一个抽象类(单继承),单是实现多个接口(多继承)
5)抽象类中允许有静态代码块和静态方法,而接口类不能。
生活中:
抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。
人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它.
所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。
原因:
1)各种连接
比如数据库连接(dataSourse.getConnection()),网络连接(socket)和io连接,除非其显式的调用了其close()方法将其连接关闭,否则是不会自动被GC 回收的。
2)单例模式
不正确使用单例模式是引起内存泄漏的一个常见问题,单例对象在初始化后将在JVM的整个生命周期中存在(以静态变量的方式),如果单例对象持有外部的引用,那么这个对象将不能被JVM正常回收,导致内存泄漏。
1.继承Thread类,重写run()方法,实例化该类,调用线程start()方法
(1)自定义类,继承Thread类,重写run()方法
(2)创建该Thread子类实例
(3)然后调用线程start()方法
2.实现Runnable接口,并实现该接口的run()的方法,
具体步骤:
(1)自定义类,并实现Runnable接口,实现run()方法
(2)创建Thread子类实例:用实现Runnable接口的对象作为参数实例化个Thread对象
(3)然后调用线程start()方法
3.实现Callable接口,重写call()方法
(1)自定义类,实现Callable接口,实现call()方法
(2)实例化ExecutorService 对象,实例化个刚刚自定义类(实现Callable接口)的对象,把它作为参数调用submit()方法
(3)注意get()方法获取结果会造成阻塞
call()方法可以有返回值,可以声明抛出异常。
同步代码块,同步方法,锁机制(Lock)
死锁的原理
当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提
交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,
此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错。
死锁的定位方法:
1)用dba用户执行以下语句
select username,lockwait,status,machine,program from v$session where sid in
(select session_id from v$locked_object)
如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。
死锁的解决办法:
只要将产生死锁的语句提交就可以。
区别:1).两者最主要的区别在于Hashtable是线程安全,而HashMap则非线程安全。Hashtable的实现方法里面都添加了synchronized关键字来确保线程同步,因此相对而言HashMap性能会高一些,
2).HashMap和Hashtable的底层实现都是数组+链表结构实现。
3).HashMap允许null作为键或者值,HashTable不允许
4).HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。
spring是单列模式。Spring的单例bean与Spring bean管理容器密切相关,每个容器都会创建自己独有的实例,
单列模式好处:节省内存开销,提高性能。
单列模式-懒汉
public class SingletonDemo1 {
private static SingletonDemo1 c;
private SingletonDemo1(){}
public static SingletonDemo1 getInstance(){
if (instance == null) {
instance = new SingletonDemo1();
}
return c;
}
}
以上是线程不安全,在getInstance前加synchronized线程就安全了。
单列模式-饿汉
public class SingletonDemo3 {
private static SingletonDemo3 c= new SingletonDemo3();
private SingletonDemo3(){}
public static SingletonDemo3 getInstance(){
return c;
}
}
spring是(什么?)企业级应用中的一个框架,整合一切优秀资源,然后对外提供一个统一的服务,(解决什么问题)从面向对象,面向切面,面向服务多个维度问题去解决。
(如何从面向对象的角度解决问题的呢?)对象的构建(以前是new),对象的管理(防止内存泄露),依赖注入(对象间存在依赖关系)。
(如何从面向切面的维度解决问题的呢?)对象功能的扩展()
(如何从面向服务的角度解决问题的呢?)对象的粒度及服务调用问题(订单系统,库存系统,广告系统,评价系统,….)
Spring架构体系
核心架构
1)Container 模块 (对象的创建,管理等)
2)AOP 模块 (对象功能的扩展)
3)Data 模块 (数据访问功能的整合及实现)
4)Web 模块 (网络应用模块整合及实现)
核心组件:
1)IOC 容器(控制反转容器):对象创建,对象存储,对象依赖管理。
2)MVC 组件(重点解决与表示层通讯的通讯问题)
3)AOP 组件(重点解决对象功能扩展问题)
4)DATA 组件(整合JDBC,MyBatis,JPA,….)
面试
IOC容器如何实现?
通过xml或注解方式告诉容器哪些对象需要创建,通过反射技术,Class.forName(“”)构建这些类的对象,通过Map容器进行存储这些对象,(默认单列模式,防止内存泄露)
spring Bean注解描述
1)修饰Bean类型(将bean交给spring容器管理)
a)@Configuration(用于描述配置类)
b)@Component (描述通用性组件)
c)@Controller (描述MVC中控制层组件)
d)@Service (描述MVC 中业务层组件)
e)@Repository(描述MVC中持久层组件)
自定义注解:自定义注解需要使用到元注解(java.lang.annotation提供了四种元注解) @Documented –注解是否将包含在JavaDoc中
@Retention –什么时候使用该注解
@Target –注解用于什么地方
列如:
1 import java.lang.annotation.Documented;
2 import java.lang.annotation.Retention;
3 import java.lang.annotation.Target;
4 import static java.lang.annotation.ElementType.FIELD;
5 import static java.lang.annotation.RetentionPolicy.RUNTIME;
7 /**
8 * 水果名称注解
9 */
10 @Target(FIELD)
11 @Retention(RUNTIME)
12 @Documented
13 public @interface FruitName {
14 String value() default "";
15 }
AOP(是什么)是面向切面的编程思想,(要解决哪些问题)解决业务项目中的非核心业务问题,(实际项目应用场景)在日志的处理,事务处理,权限处理,缓存处理等等都可以用到。
如图:
server.xml文件配置tomcat
redis的配置:redis.config配置文件配置,Map结构,可以存储set,list,String,数组类型
16.nginx代理服务器做哪些工作?
反向代理负,载均衡作用,
nginx常见命令:
1.启动命令
start nginx
2.停止命令
nginx -s stop
3.重启命令
nginx -s reload
集群:有多台服务器,共同完成一项相同的业务逻辑的项目部署形式.
特点:集群是抗击高并发的有效手段.
集群高级部署形式:高可用(HA)
说明:集群中的高可用是现在架构设计中主要的设计方式,当主机发生意外宕机后,通过
某些技术手段,可以实现主从的切换,由从机代替主机提供服务.
spring MVC概叙
如图:
基于servlet,jsp,javabean技术实现的MVC架构如下:
Spring mvc 是一个相对成熟的mvc框架,它简化了Java WEB 中基于MVC架构的编程过程,是Spring中的WEB应用模块。
Spring MVC 底层核心架构图及工作流程:
Spring MVC 中的核心组件:
1)DispatcherServlet (前端控制器, 处理请求的入口)
2)HandlerMapping (映射器对象, 用于管理url与对应controller的映射关系)
3)Interceptors(拦截器)
4)Controller (后端控制器, 负责处理请求的控制逻辑)
5)ViewResolver(视图解析器,解析对应的视图关系:前缀+view+后缀)
linux常见命令:
查询文件列表:
ls 查看文件的列表
文件的移动与重命名
mv a.txt b 将a.txt文件移动到 b文件夹下
mv a.txt b.xt 将a.txt名称改为b.txt
cd 文件名/ 进入下一级目录
rm -rf 文件名 删除文件
mkdir 文件名 创建文件
pwd 查看当前目录
修改java的环境变量
保存退出
:wq
测试环境变量:
Vim /etc/profile
刷新环境变量:
source /etc/profile
解压安装包:
tar -xvf apache-tomcat-7.0.55.tar.gz
安装:
rpm-ivh 安装包
Tomcat启动命令/关闭:
sh startup.sh
sh shutdown.sh
Mysql启动命令:
启动命令:service mysql start
停止命令:servier mysql stop
重启命令:service mysql restart
Linux 防火墙关闭/打开:
service iptables stop/start
mycat启动:
./mycat start
./mycat stop
启动redis:
1.redis-server &
2.redis-server redis.conf
关闭redis:
redis-cli shutdown
杀死进程:
kill -9 端口号
方式:1.创建索引
2.优化sql语句(优化查询语句)
3.采用分库分表的策略(解决数据库瓶颈问题)
4.定期进行数据转储(分为当前表或者历史表)
1.Mybatis—持久层框架
重要的配置文件:
1.Mapper接口文件 Mappper映射文件
2.SqlSessionFactory对象
3.SqlMapConfig.xml(mybatis的配置文件) 需要配置数据源….
2.Spring—主要作用IOC-DI或AOP
1.Spring容器 ApplicationContext
2.开启包扫描
3.Spring整合mybatis
4.Spring管理数据源
5.实现事务的控制(AOP)声明式事务处理
3.SpringMVC 接收用户请求,实现数据的响应
SpringMVC是spring的子级容器—spring-web
1.开启包扫描(让mvc的对应注解生效 @Requestmappering)
2.配置视图解析器—–动态拼接返回的页面路径
框架的架构设计:
SSM框架调用流程:
MyBatis是(什么?)一个用于更好解决数据持久话问题(数据库操作)的软件框架。它封装了JDBC共性,它提供了接口服务,数据处理服务,基础服务等相关功能。
Mybatis接口应用层对外提供应用服务:
数据查询,数据修改,数据删除,数据插入。
MyBatis数据处理层负责处理数据访问问题:
sql参数映射
sql解析
sql执行(将sql发送到数据库断执行)
sql结果映射(如将ResultSet中的数据存到map)
Mybatis基础服务层:
连接服务(配置连接池)
事务服务(保证数据的四大特性)
缓存服务(更好的提高查询性能)
配置服务(别名配置,映射配置,日志配置…)
1)写入数据(将内存中的对象映射为数据库中的记录)
2)获取数据(将数据库中的数据映射内存中对象):
3)技术实现(反射+元数据:表中字段,类中属性)
1.问题:如论是做什么操作,所有的sql必须自己手写,如果每天都编辑大量的重复的sql开发的效率太低.
1.JPA思想:Java持久层API
特性:以操作对象的方式操作数据库
Mybatis:
说明:数据库的持久层框架
特点:号称以面向对象的方式操作数据库.实质上通过反射的机制,将对象根据内部的调用动态的生成sql语句.
优点:能够实现自动化的对象关系映射(ORM).同时不会像Hibernate那样产生冗余的sql(自己手写)
发展:通用Mapper插件 主要解决单表的sql(CRUD)
机制:反射机制 User(name) -user表 name字段
Nginx:反向代理技术
域名代理:
负载均衡:轮询(默认),权重,Ip_Hash
备用机机智:
心跳检测机制:Tomcat实现故障迁引。
2.SOA思想:
面向服务的架构(SOA)
为解决HttpClient中存在问题
1).HttpClient是基于Http协议的请求的方式.
2).HttpClient中返回值是以JSON的形式进行传递. 后台:java对象转化JSON串
前台:json串转化为java对象
3).httpClient中参数传递比较繁琐 get请求/post请求/restFul结构
4).HttpClient调用过程中层级调用比较繁琐(5级调用)
5).HttpClient调用过程中POJO对象必须写2份,Service接口/Service实现类都是2份
优点:采用SOA思想后不需要编辑多余的层级代码.同时数据传递时不需要转化为JSON.也可以实现传输.
3.RPC协议:RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议
优点:RPC可以直接传输对象前提是对象必须序列化.
Dubbo框架:是阿里巴巴提工的高性能的RPC框架
组件介绍:
1.Consumer消费者:
接口的调用者就是消费者
2.Provider提供者
服务的具体的实现方,实现类所在的位置
3.registy 注册中心
管理服务器地址
内部有心跳检测机制,可以返回给客户端真实有效的服务器地址,使其访问永久有效.
4.Monitor
监控中心.可以通过页面的形式非常直观的查看当前Dubbo中服务的状态.
ZooKeeper注册中心:
作用:
1.引入注册中心.为了实现宕机后故障快速迁移必须有心跳检测.
2.引入服务自动发现功能,如果机器修复完成后,再次添加到注册中心中.
ZooKeeper说明:一个分布式的调度服务器,
3.消息队列技术
解决问题:
如果偶尔来一次超过预期的并发量时,数据库可能会出现宕机的风险.只能通过增加数据库的节点来解决这件事.但是高并发过后数据库节点的资源会造成极大的浪费.如果遇到这样的问题.可以采用消息队列的方式解决.
作用:实现数据入库的异步.极大的提高了架构的性能.使得保护后台数据库.添加了消息队列后使得整体的性能提升30%。
特点:平衡数据库压力(平峰削谷)
RabbitMQ软件来处理实际高并发的业务场景。
RabbitMQ工作模式可分为:
1.简单模式
2.工作模式
3.发布订阅模式
4.路由模式
5.主题模式