上海汉得信息技术电话面试
-
自我介绍
-
Spring的Ioc和aop
ioc:控制反转,对象创建(实例化、管理)的权利交给spring容器,解决对象之间的耦合问题 aop:面向切面编程,隔离业务的逻辑,降低耦合性。切面,切点,通知,连接点
-
SprigSecurity原理
用于认证、授权。基本原理就是应用了Tomcat容器的Filter,其的实现原理也就是类似于Tomcat本身的ApplicationFilterChain,也就是Filter执行链。先执行Tomcat自身已有的Filter,然后再交给SpringSecurity定义的FilterChainProxy,然后其再去执行SpringSecurity用于认证、授权管理的各种Filter。这个就是SpringSecurity的核心原理。
-
过滤器和拦截器的区别
(1)过滤器(Filter):它依赖于servlet容器。它可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的,是用来做一些过滤操作,获取我们想要获取的数据,比如:在Javaweb中,对传入的request、response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者Controller进行业务逻辑操作。通常用的场景是:在过滤器中修改字符编码(CharacterEncodingFilter)、在过滤器中修改HttpServletRequest的一些参数(XSSFilter(自定义过滤器)),如:过滤低俗文字、危险字符等。
(2)拦截器(Interceptor):它依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用,就是在service或者一个方法前,调用一个方法,或者在方法后,调用一个方法,比如动态代理就是拦截器的简单实现,在调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在调用方法后打印出字符串,甚至在抛出异常的时候做业务逻辑的操作。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。拦截器可以对静态资源的请求进行拦截处理。
两者的本质区别:拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调。从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor(aop的一种体现)。不过还是根据不同情况选择合适的。
-
常用垃圾回收算法(重复的fullGC会造成什么问题)
标记-清除,标记-整理,标记-复制 频繁fullGC:cpu执行效率降低,GC过程中导致服务不可用,降低吞吐率
-
jvm内存模型
-
spring默认是什么模式,为什么
单例模式 好处: 1)提升性能,减少了新生成实例的消耗 新生成实例消耗包括两方面,第一,spring会通过反射或者cglib来生成bean实例, 其次,给对象分配内存也会涉及复杂算法,这些都是消耗性能的操作. 2)减少垃圾回收 因为不会给每个请求都新生成bean实例,所以回收的对象也少了. 3)可以快速从缓存里获取到bean,因为单例获取bean操作除了第一次生成之外,其余的都是从缓存里获取的,所以比较快. 缺点: 有状态的对象, 在程序并发环境下线程不安全 注:有状态的对象:有实例变量可以标志其对象所处的状态(有属性的对象,有实例变量的对象, 有存储数据的能力) 无状态的对象:无实例变量可以标志其对象所处的状态(无属性的对象,无实例变量的对象, 没有存储数据的能力) 对象中有实例属性, 就是有状态的
-
mybatis中#和$的区别
1、传入的参数在SQL中显示不同 #传入的参数在SQL中显示为字符串(当成一个字符串),会对自动传入的数据加一个双引号。 例:使用以下SQL select id,name,age from student where id =#{id} 当我们传递的参数id为 "1" 时,上述 sql 的解析为: select id,name,age from student where id ="1" $传入的参数在SqL中直接显示为传入的值 例:使用以下SQL select id,name,age from student where id =${id} 当我们传递的参数id为 "1" 时,上述 sql 的解析为: select id,name,age from student where id =1 2、#可以防止SQL注入的风险(语句的拼接);但$无法防止Sql注入。 3、$方式一般用于传入数据库对象,例如传入表名。 4、大多数情况下还是经常使用#,一般能用#的就别用$;但有些情况下必须使用$,例:MyBatis排序时使用order by 动态参数时需要注意,用$而不是#。
-
http和tcp的区别
-
tcp的三次握手
-
springboot的自动装配原理
-
spring创建bean的过程(方式)
使用无参构造创建对象 <bean id="UserDaoI" class="I_初始环境搭载.Impl.UserDaoImpl"></bean> 静态工厂 1、编写静态工厂 public class staticFactory { //配置好后spring通过getInstance获取实例化对象 public static UserDao getInstance() {//静态方法 return new UserDaoImpl(); } } 2、配置applicationContext.xml <bean id="staticFactory" class="II_配置文件详解.创建对象三种方法.staticFactory" factory-method="getInstance"></bean> 实例工厂 实例工厂构造帮助创建对象,一个工厂可以生产多个对象;但必须先创建一个实例工厂才能生产对象 1、实例工厂 public class dynamicFactory { public UserDao getInstance() { return new UserDaoImpl(); } } 2、配置文件 <bean id="dynamicFactory" class="II_配置文件详解.创建对象三种方法.dynamicFactory" ></bean> <bean id="produce" factory-bean="dynamicFactory" factory-method="getInstance"></bean>
-
解决并发问题的常用方式