我要18K,能过吗?

1、项目都有那些功能?

介绍了最近的这个项目自己所负责的几个核心功能,重点讲了其中一个技术的选型和实现等。然而他并没有接着问我项目上的问题。

 

2、spring框架AOP讲解一下吧!

AOP面向切面编程,是对OOP的补充。可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

 

主要有以下操作:

日志记录,跟踪,优化和监控;
事务的处理;
持久化;
性能的优化;
资源池,如数据库连接池的管理;
系统统一的认证、权限管理等;
应用系统的异常捕捉及处理;
针对具体行业应用的横切行为等。

 

在spring中的体现还有常见的五种通知:

  1. 前置通知:在目标方法执行之前执行执行的通知。

  2. 环绕通知:在目标方法执行之前和之后都可以执行额外代码的通知。在环绕通知中必须显式的调用目标方法,目标方法才会执行,这个显式调用时通过ProceedingJoinPoint来实现的,可以在环绕通知中接收一个此类型的形参,spring容器会自动将该对象传入,注意这个参数必须处在环绕通知的第一个形参位置。(环绕通知需要返回返回值,否则真正调用者将拿不到返回值,只能得到一个null。)

  3. 后置通知:在目标方法执行之后执行的通知。在后置通知中也可以选择性的接收一个JoinPoint来获取连接点的额外信息,但是这个参数必须处在参数列表的第一个。

  4. 异常通知:在目标方法抛出异常时执行的通知。(可以配置传入JoinPoint获取目标对象和目标方法相关信息,但必须处在参数列表第一位。另外,还可以配置参数,让异常通知可以接收到目标方法抛出的异常对象。)

  5. 最终通知:是在目标方法执行之后执行的通知。

通知常见场景:

图片

AOP对应的代理模式:

动态代理,主要涉及的包就是java.lang.reflect包下面的两个类,Proxy和InvocationHandler,其中InvocationHandler是一个接口,可以通过实现该接口来定义横切的逻辑,并且通过反射的机制调用目标类的代码,动态的将横切的逻辑和业务逻辑整合在一起。这是动态代理的优点,但是它也有不足的地方,就是只能为接口创建代理实例,而没有通过接口定义业务方法的类,这就需要使用到Cglib代理了。

 

CGLib底层采用的是字节码的技术,全称:Code Generation Library。CgLib可以为一个类创建一个子类,在子类中采用方法拦截的技术拦截所有父类方法的调用并顺势织入横切逻辑。

也就是说:

JDK动态代理是面向接口的。

CGLib动态代理是通过字节码底层继承要代理类来实现(如果被代理类被final关键字所修饰,那么抱歉会失败)。

 

使用方面应该注意一些地方:

如果要被代理的对象是个实现类,那么Spring会使用JDK动态代理来完成操作(Spirng默认采用JDK动态代理实现机制);

如果要被代理的对象不是个实现类那么,Spring会强制使用CGLib来实现动态代理。

 

性能比较:

  1、CGLib所创建的动态代理对象在实际运行时候的性能要比JDK动态代理高不少,有研究表明,大概要高10倍;
  2、但是CGLib在创建对象的时候所花费的时间却比JDK动态代理要多很多,有研究表明,大概有8倍的差距;
  3、因此,对于singleton的代理对象或者具有实例池的代理,因为无需频繁的创建代理对象,所以比较适合采用CGLib动态代理,反正,则比较适用JDK动态代理。

 

上面提到了jdk动态代理是由反射机制进行实现的,在讲解的过程中也可以提及对应的反射概念。

 

以上基本是我在讲解AOP过程中所提及的点,面试后又对此做了反思和总结,在回答过程中可以根据实际情况结合在项目中实现,这样会更好。

 

3、spring框架的事务?

编程式事务:编程式事务管理办法允许您管理与编程的源代码的帮助下事务。这就给了极大的灵活性,但它难以维护。

声明式事务:通过配置来进行管理。

 

故此,我们在工作中一般使用声明式事务进行实现。

xml文档中写入:

<!--开启事务的注解配置驱动-->    <tx:annotation-driven transaction-manager="transactionManager"/>

在service层中的待配置方法上加上注解“@Transactional”,表示该方法被设定为一个事务,只读默认为false,事务传递方式默认为required(有事务就加,无事务自己创建,用于增删改),可设定service类上加上“@Transactional”则对该类下全部方法生效。而对于其中的特例——查寻,可以单独配置“@Transactional(readOnly = true,propagation = Propagation.SUPPORTS)”。(supports为有事务就用,无事务就不用,用于查寻)。

 

事务:

事务是一个完整的工作单元,一个出错则进行回滚操作。故而事务有以下特性。

原子性:(Atomicity)事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用

一致性:(Consistency)一旦事务完成,不管成功还是失败,系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
隔离性(Lsolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。

持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响。这样就能从任何系统崩溃中恢复过来,通常情况下,事务的结果被写到持久化存储器中。

 

4、MySQL的隔离级别。

(1)Read Uncommitted(读取未提交内容)

A可以读取到B还未提交的事务。

(2)Read Committed(读取提交内容)

A只能读取到B已经提交的事务。并且A事务中两次读到的内容不一致,原有就是B提交事务。

(3)Repeatable Read(可重读)

A只能读取到B已经提交的事务。并且A事务中两次读到的内容一致,A事务结束后再读取会读取到B提交事务。

(4)Serializable(可串行化)

A事务未提交,B事务就等待。

 

产生的问题:

脏读:读到了还未提交事务的数据;

幻读:两次事务读到的数据不一致。中间有新事务提交;

不可重复读:一次事务中不允许多次读,会发生数据不一致。中间有新事务提交。

 

5、类加载的过程?

图片

加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序进行,而解析阶段则不一定,它在某些情况下可能在初始化阶段后在开始,因为java支持运行时绑定。

 

6、Tomcat 怎么实现不同应用的Jar 包不冲突?

关于依赖冲突解决方式有三种:最短路径原则、声明优先原则、依赖排除。在没有手动进行依赖排除的情况下,会依据最短路径原则、声明优先原则来选择jar包。关于依赖冲突排查可借助如maven-enforcer-plugin 与Maven Helper 插件。根据实际情况及环境,选择组合最优的解决方案解决依赖冲突问题。

 

7、看过什么书,学习了那些技术?

《编写高质量代码改善Java程序的151个建议》、《阿里巴巴开发手册》:提高了编程的质量;

《Java并发编程实践》:提供了开发过程中同一问题更多的解决思路,重点在并发方面;

《大话设计模式》、《设计模式之禅》:提高了自己代码以及对项目的架构思维。

 

大家注意采坑哦!很有可能让大家具体的来讲解一番。

 

其他问题:

1、说一下一次完整的http 请求的过程;

2、数据库优化,sql 优化讲一下;

3、什么是组合索引;

4、分布式锁是怎么实现的;

5、阻塞和同步的区别;

6、Java 动态加载过程,什么时候动态加载,底层怎么实现的;

7、TCP 怎么实现流量控制和拥塞避免;

8、TCP 拥塞避免是每次拥塞后发送窗口都自动再从1 开始吗?

9、final 关键字的用法;

10、springcloud,springboot,微服务有了解吗?

11、lambda 表达式了解嘛,有用过吗?

12、讲一下线程池的优点,讲一下线程池的分类和使用场景;

13、volatile 和sychronized 关键字的作用;

14、sychronized 可以修饰什么,可以修饰静态方法和静态代码块吗?

15、还了解其他的锁吗,简单介绍一下。

 

当天进行了两轮长达近4个小时的面试,然后紧接着还聊了聊个人规划、期望薪资,还有想问的问题等,又给我讲了讲公司目前的项目组、项目情况。

 

上面的问题基本都回答上来了,最少讲解了一下概念。我沟通了18K,看最后聊的情况感觉有戏,心里忐忑啊!期待能过,公司平台、福利啥的还都不错。

 

祝福我吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值