IOC控制反转,是一种设计思想。意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内直接控制。实现松耦合。
将对象放入Spring IOC容器中,如实体类配置到applictionContext.xml的bean中,配置类上添加@Configuration注解,实体类添加@Controller.
底层原理:xml配置文件、dom4j解决xml、工厂设计模式、反射。
①传统方式:UserService us = new UserService();
②面向接口: UserService us = new UserServiceImp();
③工厂模式、创建工厂类:通过工厂类返回对象。
④工厂+反射+配置文件:实现解耦。
面向切面编程(AOP)完善Spring的依赖注入(DI),面向切面变成在Spring中主要表现为两个方面:
①面向切面编程提供声明式事务管理
②spring支持用户自定义切面
面向切面编程(aop)是对面向对象编程(oop)的补充。面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。
AOP框架具有两个特性:各个步骤之前有良好的隔离性、源代码无关性。
SpringAOP底层实现基于动态代理实现的,增强和切面,以及通知。是在动态代理生成的代理类inoke方法中调用实现。代理类型分为:动态代理和静态代理。动态代理分为jdk动态代理、cglib动态代理。
Spring解析视图有两个重要的接口ViewResolver和View。ViewResolver接口提供了视图名称和真正的视图之间的映射;而View接口则是将真正的视图呈现给用户。在Controller中添加@RequestMapping(“”)注解,在配置文件中配置相应的bin,如:
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".html" />
bean>
@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。
@Service用于标注业务层组件。
@Controller用于标注控制层组件(如struts中的action)。
@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Scope用于指定scope作用域的(用在类上)
@PostConstruct用于指定初始化方法(用在方法上)
@Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下:
@Autowired @Qualifier(“personDaoBean”) 存在多个实例配合使用
@Lazy(true) 表示延迟初始化。
Struts2是类级别的拦截,用自己的拦截Interceptor机制,SpringMVC是方法级别的拦截,用独立的AOP方式
Struts2采用Filter实现,SpringMVC采用Servlet实现。
SpringMVC和Spring无缝连接,从项目的管理和安全上比Struts2高。
Spring 事务的两种方式;编程式和配置式; 编程式事务即用编码来实现事务,类似于JDBC编程实现事务的管理;
隔离级别:
1、ISOLOCATION_DEFAULT: 数据库默认级别
2、ISOLOCATION_READ_UNCOMMITTED: 允许读取未提交的读, 可能导致脏读,不可重复读,幻读
3、ISOLOCATION_READ_COMMITTED: 允许读取已提交的读,可能导致不可重复读,幻读
4、ISOLOCATION_REPEATABLE_READ : 不能能更新另一个事务修改单尚未提交(回滚)的数据,可能引起幻读
5、ISOLOCATION_SERIALIZABLE: 序列执行效率低
传播级别:
1、PROPERGATION_MANDATORY: 方法必须运行在一个事务中,不存在事务则抛出异常
2、PROPERGATION_NESTED: 存在事务则运行在嵌套事务中,不存在则创建一个事务
3、PROPERGATION_NEVER: 当前方法不能运行在事务中,存在事务则抛出异常
4、PROPERGATION_NOT_SUPPORT: 当前存在事务则将其 挂起
5、PROPERGATION_REQUIRED: 不存在事务则创建一个事务
6、PROPERGATION_REQUIRES_NEW: 新建一个自己的事务,不论当前是否存在事务
7、PROPERGATION_SUPPORT: 存在事务则加入,不存在也可以
BeanFactory是接口,提供了IOC容器最基本的形式,给具体的IOC容器的实现提供了规范。
FactoryBean也是接口,为IOC容器中Bean的实现提供了更加灵活的方式。
BeanFactory是个Factory,也就是IOC容器或对象工厂,FactoryBean是个Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似。
场景一: 记录日志
场景二: 监控方法运行时间 (监控性能)
场景三: 权限控制
场景四: 缓存优化 (第一次调用查询数据库,将查询结果放入内存对象, 第二次调用, 直接从内存对象返回,不需要查询数据库 )
场景五: 事务管理 (调用方法前开启事务, 调用方法后提交关闭事务 )
java包中:
entity包放实体类;
dao包放操作接口(和xml文件关联的),用@Mapper修饰接口
service包放服务接口(用来)
service.impl包放实现service的接口(用于操作从dao接口获取的数据,或向dao传递数据等),用@Service修饰类
controller包用来放控制类,从service(也可以是dao)获取、存放数据,并可以通过网络访问这些接口。用@Controller修饰类,@RequestMapping("/abc/def")修饰类,则类里用Mapping结尾的修饰器修饰的方法可通过 localhost:8080/abc/def/方法修饰名访问。(8080是端口,可修改)
链接数据库的配置单独放在properties文件中,conf.xml文件中引用.properties文件,为实体类定义别名,mapper用于,引入MyBatis关于数据库操作的映射。
①顺序传参法:#{}里面的数字代表你传入参数的顺序,sql层表达不直观,一旦顺序调整容易出错。
②@Param传参法:#{}里面的名称对应的是注解@Param括号里面修饰的名称,传参较少时适用比较直观。
③Map传参法:#{}里面的名称对应的是Map里面的key名称,适合传多参数,且参数易变能灵活传递的情况。
④JavaBean传参法:#{}里面的名称对应的是User类里面的成员属性,需要创建实体,扩展不容易。
#{}:占位符是为了获取值,获取的值用在 where 语句后,insert 语句后,update 语句。
${}:占位符是字符串连接符,可以动态获取相关值。能从 properties 文件中获取值,也可以作为表名,列名等值。参数只能使用自定义类型和 map 类型。
一级缓存:
SqlSession级别的缓存,实现在同一个会话中数据的共享
Statement级别的缓存,可以理解为缓存只对当前执行的这一个Statement有效,执行完后就会清空缓存。
生命周期和SqlSession一致。
设置为SqlSession级别的缓存,当执行insert/update/delete操作或close之后,缓存清空。
最大范围是SqlSession内部,有多个SqlSession或者分布式的环境下,数据库写操作会引起脏数据,建议设定缓存级别为Statement。
二级缓存:
SqlSessionFactory级别的缓存,实现不同会话中数据的共享,是一个全局变量。
存储作用域为Mapper的namespace级别。
不同于一级缓存,二级缓存可设置是否允许刷新和刷新频率。
对于一般的类型,mybatis已经内部包含了类型转换器,使String类型的java属性可以直接插入到数据库中,也可以直接从数据库中取出赋值给对象的属性。当然不满足时也可以自定义类型转换器,新建Hander,实现TypeHander<需要转换的类>接口的几个方法,配置Mybatis自定义的映射关系。
mybatis使用了动态代理技术生成实现类,把重复的实现用一个动态代理的拦截器进行去重。
Spring和Mybatis利用MapperFactoryBean整合,通过文件流inputStream读取配置文件和SqlSessionFactoryBuilder获取到SqlSessionFactory。通过SqlSessionFactory 获取到SqlSession,通过SqlSession 对数据库进行操作。
项目 | Mybatis | Hibernate |
---|---|---|
开发效率 | 较容易上手;需要手动管理sql | 较难上手;无需管理sql,专注业务 |
入门 | 简单 | 较难 |
灵活性 | sql更加灵活 | 几乎不用写sql,封装性较大 |
性能 | 相对较高 | 相对较低 |
日志系统 | 除了基本记录功能外,功能薄弱很多 | 志系统非常健全,涉及广泛,包括:sql记录、关系异常、优化警告、缓存提示、脏数据警告等 |
优化 | 更容易 | 更难 |
自动性 | 半自动 | 全自动 |
缓存 | 有更好的二级缓存机制 | |
移植性 | 移植性低(绑定了sql) | 移植性高 |
适用场合 | 1.有复杂的查询业务;2.无hibernate实践经验的 | 1.无复杂的查询业务;2.能够熟练应用hibernate的. |
联系:
Spring 最初利用“工厂模式”( DI )和“代理模式”( AOP )解耦应用组件。按照这种模式搞了一个 MVC 框架(一些用 Spring 解耦的组件),用开发 web 应用( SpringMVC )。后来发现每次开发都要搞很多依赖,写很多样板代码,使代码臃肿而麻烦,于是聪明的前人整理了一些懒人整合包( starter ),这套就是 Spring Boot 。
区别:
Spring MVC 是基于 Servlet 的一个 MVC框架 主要解决 WEB 开发的问题 但关于Spring 的配置比较 ;
而Spring boot 的原则是:约定优于配置 ,可以极大地简化了 spring 的配置流程。
git优点:分布式,每个参与开发的人电脑上都有一个完整的仓库,不担心硬盘问题。
不联网情况下,可以把代码提交到本地仓库,可以查看以往的log,等有网的时候直接push到远程。
非常强大的分支管理功能。
svn优点:权限管理功能比较完善,能够精确控制每个目录的权限。
使用起来相对git要简单一些。
git缺点:权限管理不方便,需要安装插件gitolite,配置起来麻烦。
svn缺点:集中式,如果服务器出问题所有人都不能工作,恢复起来麻烦。
分支功能没有git强大。
速度没有git快,如果有多个分支,是把多个分支的文件全部拷下来。
必须联网才能commit。
参考:https://blog.csdn.net/ryan007liu/article/details/91536764
要实现jar的版本统一管理需要对jar的版本进行设置即如:
<dependency>
<groupId>org.hibernategroupId>
<artifactId>hibernateartifactId>
<version>${org.hibernate.version}version>
dependency>
设置版本属性,在的配置均是采用${*.version}的配置的,光这种配置不能确定是什么版本,需要在pom.xml中用属性定义版本的确切值。如:
<properties>
<javax.servlet.version>3.1.0javax.servlet.version>
<org.apache.shiro.version>1.2.3org.apache.shiro.version>
<org.hibernate.version>3.6.10.Finalorg.hibernate.version>
<org.springframework.version>3.0.2.RELEASEorg.springframework.version>
<developer.organization>developer.organization>
properties>
TCP:传输控制协议。
UDP:用户数据报协议。
连接区别
TCP面向连接。
UDP是无连接的,即发送数据之前不需要建立连接。
安全区别
TCP提供可靠的服务,传输数据无差错、不丢失、不重复、按顺序送达。
UDP尽力传输,不能保证可靠交付。
传输效率区别
TCP传输效率低。
UDP传输效率高,适合告诉传输和实时有效通信。
连接对象量区别
TCP连接一对一,点对点。
UDP连接一对一、一对多、多对对的传输通信。
HTTP协议是“超文本传输协议”缩写,用于由万维网服务器传输超文本到本地浏览器的传输协议。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。
特点:简单快速、灵活、无连接、无状态、支持B/S、C/S模式。
webSocket是一种持久化的协议,在建立连接之后,和服务器就产生了一个通道,客户端和服务端的对话都在这个通道进行传输,不会发起新的请求。协议开头不是http://开头,而是ws://开头,状态码是101。
webSocket有三个事件:建立连接open、发送消息message、关闭连接close。
在java后端,使用@ServerEndpoint("/addr")注解将目前的类定义成一个websocket服务器端,注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端。
Ajax第一个字母A值的是asynchronous,意思是异步的,j值的就是JavaScript,第二个a是and,x值的是xml
合在一起就是 异步的javascript和xml。ajax可以实现无刷新技术对服务器的请求,减少了页面的等待时间,用户体验更佳,有效利用了带宽资源。
创建xhr对象、设置超时时间、建立连接、设置http头、发送请求、接收响应、超时和错误事件。
get和post底层都是TCP/IP,都是TCP类型的链接。
post传输时不需要在url中显示出来,而get方法需要在url中显示。
post传输的数据量大,可达到2M,而get由于受到url长度限制只能传输1024左右的字节。
cd 切换目录(.当前目录 。。父目录)
输入命令时候可以用tab键补齐
ls 显示文件或目录
cp 复制
mv 移动或改名
rm 删除
find 查找
cat 查看文本内容
tail -10 查看文件的尾部10行
head -30 查看文件头部30行
gzip filename 解压文件
kill 杀进程
clear 清屏
ps -ef|grep jboss 查看进程
[root@localhost ~]# free -m
查询进程,如项目启动中,则kill该进程,将项目文件替换,执行项目文件包完成重新启动。
八种:冒泡排序、冒泡排序、插入排序—直接插入排序、插入排序—希尔排序、归并排序、计数排序
、快速排序、堆排序。
冒泡排序:比较相邻元素,如第一个比第二个大则交换。并对每对相邻元素都是如此,最后的元素就是最大的数。
选择排序:每一次从待排序的数据元素中选出最小/最大的元素,放到起始位置,直到全部元素排完。
插入排序:取出无序表数据插入有序表中,再取第二个数据进行插入,第三个数据进行插入时按照前两个数据的大小存入有序表中,以此类推。
快速排序:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
Java本身对常见的几种数据结构,线性表,栈、队列等提供了实现,就是常用的Java集合框架。
线性表:是n个数据元素的有限序列。实现线性表有两种方式,一种是使用数组存储线性表的元素,用一组连续的存储单元依次存储线性表的数据元素。另一种是使用链表存储线性表元素,用一组任意的存储单元存储线性表的数据元素。
栈与队列:他们是比较特殊的线性表,对于栈来说,访问、插入和删除元素只能在栈顶进行,对于队列来说,元素只能从队列尾插入,从队列头访问和删除。
树与二叉树:树是由n(n>=1)个有限节点组成一个具有层次关系的集合,它具有以下特点:每个节点有零个或多个子节点;没有父节点的节点称为 根 节点;每一个非根节点有且只有一个 父节点。
二叉树是每个节点最多有两颗子树的树结构。通常子树称为“左子树”和“右子树”。
红黑树是平衡二叉树的一种,它保证在最坏的情况下基本动态集合操作的事件复杂度为O(log n)。
图:是一种比线性表和树更复杂的数据结构,在线性表中,数据元素之间仅有线性关系,在树形结构中,数据元素之间有着明显的层次关系,而在图形结构中,节点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。
Hashmap实际上是一个数组和链表的结合体(在数据结构中,一般称之为“链表散列“)
堆:堆通常是一个可以被看做一棵树的数组对象。堆中某个节点的值总是不大于或不小于其父节点的值,堆总是一棵完全二叉树。
栈:栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来(先进后出)。栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FIFO的特性,在编译的时候可以指定需要的Stack的大小。
队列:是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
树的性能比较好,一个平衡的树结构,可以用来查询、修改、删除处理上有很好的效率。
①红黑树:Java8中的hashMap满足一定的阈值,自动扩容时会变成红黑树,treeMap、linux中的epoll模型,nginx中的Timer管理等。
②B,B+树:广泛用于(mySQL、oracle等)索引。
③字典树:用于海量文本词频统计,查询效率比哈希表高。
④生活中的树状结构有公司职级关系,国家省市级联,族谱等树形结构模式。
二叉树:二叉查找、搜索、排序树 BST。
若它的左子树不为空,左子树上所有节点的值均小于它的根节点的值。若它的右子树上所有的值都大于它的根节点的值,它的左、右子树也分别为二叉排序树。
红黑树:每个节点或黑色或红色。根节点为黑色,每个叶子节点是黑色 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!],如果一个节点是红色的,那么它的子节点一定是黑色的。从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
区别:作为二叉查找树中面众多的实现之一,红黑树通过引入颜色的概念,通过颜色约束的使用,包括变色和旋转,来保持树的高度平衡。
阿里巴巴的Dubbo、HSF,腾讯的Tars,京东的JSF,新浪的motan。
Dubbo:阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
主要核心组件:
Remoting: 网络通信框架,实现了 sync-over-async 和Logo request-response 消息机制。
RPC: 一个远程过程调用的抽象,支持负载均衡、容灾和集群功能。
Registry: 服务目录框架用于服务的注册和服务事件发布和订阅。
dubbo由于是二进制的传输,占用带宽少。
springCloud是http协议传输,带宽比较多,同时使用http协议一般会使用JSON报文,消耗大。
dubbo开发难度较大,因为dubbo的jar包依赖问题很多大型工程无法解决。
springcloud的接口协议约定比较自由松散,需要强有力的行政措施限制接口无序升级
dubbo的注册中心可以选择zk,redis多种,springcloud的注册中心只能用eureka或者自研。
Restful风格是目前来说最流行的互联网软件架构,它并不是一种标准,而是一个开发架构的思想风格。Restful对数据格式没有限制,就算你用的是XML或者其他格式都可以,但是大部分会选择是返回json字符串。如:
@GetMapping相当于是 @RequestMapping(method = RequestMethod.GET)
@GetMapping(value = "/json")
public @ResponseBody List<Hero> getUserInfo(){
List<Hero> heroes = heromapper.getAllHeros();
return heroes;
}
Restful API可以通过一套统一的接口为所有客户端提供web服务,实现前后端分离。
Restful是无状态的,服务器不能存储某个请求中的信息,并在其他请求中使用。
Restful返回有用的错误信息:200=成功,404=资源不存在,500=服务器端错误等。
RPC是远程进程调用,本地机器调用远程服务,在项目规模大到一定程度,需要使用RPC相关框架进行服务化部署。如:hessian 、webservice等。
rpc:远程过程调用,包括传输协议和序列化协议。
传输协议包括:http2协议,也有如dubbo一类的自定义报文的tcp协议。
序列化协议包括:基本编码xml、json,也有二进制码的protobuf、hessian等。
http协议中报文头占很大字节,效率低。
rpc直接用tcp协议进行传输。
自定义tcp协议的报文头字节就16byte。
http协议本身可以作为rpc协议进行传输。
负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器具有等价的地位,都可以单独对外提供服务不需要其他服务器的辅助。通过某种负载分担技术,将外部发送来的请求均匀的分配到对称的某个服务器上,接收到的请求的服务器可以单独回应客户的请求。均衡负载能够平均分配客户请求到服务器列阵,籍此提供快速获取重要数据,解决大量并发访问服务问题。这种群集技术可以用最少的投资获得接近于大型主机的性能。其优点为:
①网络负载均衡可在普通的计算机上实现。
②网络负载均衡只需要提供一个IP地址。
③负载均衡能将传入的请求传播到32台服务器上,可以使用最多32台服务器共同分担网络请求服务,保证在负载很重的情况下,服务器也能很快的响应。
①ActiveMQ是Apache出品,能力强劲的开源消息总线。
②RabbitMQ 是由 LShift 提供的一个AMQP的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成,因此也是继承了这些优点。
③kafka 是一种高吞吐量的分布式发布订阅消息系统。
④0MQ是一个轻量级消息内核。它可用于C、C++、Python、.NET /Mono、Fortran和Java语言。它运行在AIX , FreeBSD的,基于HP - UX , Linux和MacOS下, OpenBSD系统, OpenVMS , QNX Neutrino, Solaris和Windows操作系统。
它是采用Erlang语言实现的AMQP(Advanced Message Queued Protocol)的消息中间件,最初起源于金融系统,用在分布式系统存储转发消息。特点包括:
①可靠性:RabbitMQ使用一些机制来保证可靠性,如持久化、传输确认及发布确认等。
②灵活的路由:在消息进入队列之前,通过交换器来路由消息。对于典型的路由功能,RabbitMQ己经提供了一些内置的交换器来实现。针对更复杂的路由功能,可以将多个交换器绑定在一起,也可以通过插件机制来实现自己的交换器。
③扩展性:多个RabbitMQ节点可以组成一个集群,也可以根据实际业务情况动态地扩展集群中节点。
④高可用性:队列可以在集群中的机器上设置镜像,使得在部分节点出现问题的情况下队仍然可用。
⑤多种协议:RabbitMQ除了原生支持AMQP协议,还支持STOMP,MQTT等多种消息中间件协议。
⑥多语言客户端:RabbitMQ几乎支持所有常用语言,比如Jav a、Python、PHP、C#、JavaScript等。
⑦管理界面:RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息、集群中的节点等。
⑧插件机制:RabbitMQ提供了许多插件,以实现从多方面进行扩展,当然也可以编写自己的插件。