1.请介绍一下单例模式的作用,并手写一个具体的单例实现代码
作用:在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例
避免对资源的多重占用
枚举式:
public enum SingletonInstance5 {
// 定义一个枚举元素,则这个元素就代表了SingletonInstance5的实例
INSTANCE;
public void singletonOperation(){
// 功能处理
}
}
2.请详细介绍一下java代理模式,实现方式,作用及实际应用
Java的代理模式实现方式:静态代理模式、动态代理模式(JDK动态代理模式、cglib动态代理模式)
作用:在不修改目标对象源码的基础上,通过代理可以实现对目标对象进行扩展。
实际应用:
静态代理:代理类和目标类会实现同一接口或是派生自相同的父类
JDK动态代理:如果目标对象实现了接口,采用jdk的动态代理
Cglib动态代理:如果目标对象没有实现接口,必须采用cglib动态代理
3.介绍下spring的IOC和AOP
Spring的IOC:控制反转,是一个概念,是一种思想。控制反转就是对对象控制权的转移,从程序代码本身转移到了外部容器。把对象的创建、初始化、销毁等工作交给spring容器来做。由spring容器控制对象的生命周期。
Spring的AOP:AOP(Aspect Oriented Programming),即面向切面编程,是OOP(Object Oriented Programming,面向对象编程)的补充和完善。
面向切面是面向对象中的一种方式而已。在代码执行过程中,动态嵌入其他代码,叫做面向切面编程。
4.列举spring中的常用注解(至少8个)
@Configuration、@Component、@Service、@Controller、@Repository、 @Resource、@Autowired、@Qualifier、@profile、@Scope、@Aspect、@Before、@Around、@AfterThrowing、@After、@ResponseBody、@RequestBody、@RequestMapping、@RequestParam、@SessionAttributes
5.介绍下spring中的事务的实现方式
注解的方式、xml配置声明的方式
6.请画出springMVC的原理图
Springmvc的生命周期:
第一步:用户发起请求到中央控制器(DispatcherServlet)
第二步:中央控制器调用HandlerMapping(处理器映射器)查找 Handler
可以根据xml配置、注解进行查找
第三步:处理器映射器HandlerMapping向中央控制器返回Handler
第四步:中央控制器调用处理器适配器HandlerAdapter去执行Handler
第五步:处理器适配器去执行Handler
第六步:Handler执行完成给处理器适配器返回ModelAndView
第七步:处理器适配器向中央控制器返回ModelAndView
ModelAndView是springmvc框架的一个底层对象,包括 Model和view
第八步:中央控制器请求视图解析器去进行视图解析
根据逻辑视图名解析成真正的视图(jsp)
第九步:视图解析器向中央控制器返回View
第十步:中央控制器进行视图渲染
视图渲染将模型数据(在ModelAndView对象中)填充到request域
第十一步:中央控制器向用户响应结果
7.请介绍下Mybatis的工作原理
传统API方式:加载配置文件–获取SqlSessionFactory对象–获取SqlSession对象–insert方法执行的过程
基于Mapper接口方式:bean对象–接口文件–接口实现类–映射文件
8.介绍下mybatis中的#{}和${}的区别
#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换。#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。
表
示
拼
接
s
q
l
串
,
通
过
{}表示拼接sql串,通过
表示拼接sql串,通过{}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换,
可
以
接
收
简
单
类
型
值
或
p
o
j
o
属
性
值
,
如
果
p
a
r
a
m
e
t
e
r
T
y
p
e
传
输
单
个
简
单
类
型
值
,
{}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,
可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,{}括号中只能是value。
9.如果让你设计一个权限管理模块怎么实现?介绍下设计思路
1.获取SecurityManager工厂对象
2.通过Factory对象获取SecurityManager对象
3.将SecurityManager对象添加到当前运行环境中
4.获取Subject对象
5.登录操作
6.获取登录的状态
7.验证权限
10.列举linux中的常用命令(至少10个)
service iptables stop、service iptables start、chkconfig iptables on、chkconfig iptables off、
service iptables status、reboot、pwd、data、who、last、halt、cd、cd …、cd …/…、cd /etc/sysconfig、
mkdir、rm、mv、cp、echo、cat、tac、more、tail、head、:wq、:q
11.介绍下缓存,项目中哪些场景用到了缓存
缓存(Cache)的作用是减少服务器对数据源的访问频率,从而提高数据库的稳定性。
缓存的使用场景:
和数据库中的数据结构保持一致,原样缓存
列表排序分页场景的缓存
计数缓存
重构维度缓存
较大的详情内容数据缓存
12.介绍下Redis,常用命令有哪些?
Set get select del dump exists ttl expire pexpire pttl randomkey type rename flushdb flushall strlen append incr incrby incrbyfloat decr decrby getrange setrange mset mget
13.Redis集群策略是什么?
集群、主从复制、哨兵
14.解释下什么是缓存穿透,缓存击穿,缓存雪崩?
缓存穿透:是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。
缓存击穿:缓存击穿,是指一个key非常热点,在不停的承受着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。解决方式直接设置为永久key就可以了。
缓存雪崩:缓存雪崩,是指在某一个时间段,缓存集中过期失效.解决方式就是在设置过期时间中使用,灵活设置过期时间。
15.如果要你通过redis实现一个任务队列怎么实现?带有优先级的队列怎么实现?
可以通过List中的LPUSH和RPOP命令来实现
根据BRPOP这个特性实现任务队列的优先级
16.什么是zookeeper?有哪些作用?
ZooKeeper是面向分布式应用的协调服务,其实现了树形结构的数据模型(与文件系统类似),并且提供了简洁的编程原语。ZooKeeper 能够作为基础,用于构建更高层级的分布式服务。
作用:节点选举、统一配置文件管理、发布与订阅、提供分布式锁、集群管理
17.介绍下dubbo,越详细越好
Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC 实现服务的输出和输入功能,可以和 Spring 框架无缝集成。Dubbo 框架,是基于容器运行的.。容器是 Spring。
Dubbo框架设计一共划分了10个层,而最上面的Service层是留给实际想要使用Dubbo开发分布式服务的开发者实现业务逻辑的接口层。图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口, 位于中轴线上的为双方都用到的接口。
下面,结合Dubbo官方文档,我们分别理解一下框架分层架构中,各个层次的设计要点:
服务接口层(Service):
配置层(Config):
服务代理层(Proxy):
服务注册层(Registry):
集群层(Cluster):
监控层(Monitor)
远程调用层(Protocol):
信息交换层(Exchange):
网络传输层(Transport):
数据序列化层(Serialize)
18.dubbo和activemq的区别是什么?
dubbo是整个项目分布式的环境,构成分布式集群基础;activemq构成通讯,点对点的。
dubbo是RPC的集成,同步,注重服务暴露;
activemq是异步消息,注重可靠性传输
有两张表,学生表和班级表:
学生表:t_student sid(学号) sname(名称) sage(年龄) ssex(性别) cid(班级编号)
班级表:t_class cid(班级编号) cname(班级名称)
1.使用sql语句查询出班级中年龄在20到25之间的所有学生的所有信息
select s.,c.cname
from t_student s left outer join t_class c
on s.cid = c.cid
where sage between 20 and 25
2.查询出所有学生的信息及所在班级的名称(左外连接)
select s.,c.cname
from t_student s left outer join t_class c
on s.cid=c.cid
3.用一条sql语句查询出每个班级中的男生和女生的人数(分组函数和聚合函数)
select cid ,ssex,count(*)
from t_student
group by cid ,ssex