上海汉得信息技术电话面试

  1. 自我介绍

  2. Spring的Ioc和aop

     ioc:控制反转,对象创建(实例化、管理)的权利交给spring容器,解决对象之间的耦合问题
     aop:面向切面编程,隔离业务的逻辑,降低耦合性。切面,切点,通知,连接点
     
    
  3. SprigSecurity原理

     用于认证、授权。基本原理就是应用了Tomcat容器的Filter,其的实现原理也就是类似于Tomcat本身的ApplicationFilterChain,也就是Filter执行链。先执行Tomcat自身已有的Filter,然后再交给SpringSecurity定义的FilterChainProxy,然后其再去执行SpringSecurity用于认证、授权管理的各种Filter。这个就是SpringSecurity的核心原理。
     
    
  4. 过滤器和拦截器的区别

(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的一种体现)。不过还是根据不同情况选择合适的。

  1. 常用垃圾回收算法(重复的fullGC会造成什么问题)

     标记-清除,标记-整理,标记-复制
     频繁fullGC:cpu执行效率降低,GC过程中导致服务不可用,降低吞吐率
     
    
  2. jvm内存模型

  3. spring默认是什么模式,为什么

     单例模式
     好处:
         1)提升性能,减少了新生成实例的消耗
             新生成实例消耗包括两方面,第一,spring会通过反射或者cglib来生成bean实例,
         其次,给对象分配内存也会涉及复杂算法,这些都是消耗性能的操作.
         
         2)减少垃圾回收
             因为不会给每个请求都新生成bean实例,所以回收的对象也少了.
             
         3)可以快速从缓存里获取到bean,因为单例获取bean操作除了第一次生成之外,其余的都是从缓存里获取的,所以比较快.
    
     缺点:
         有状态的对象, 在程序并发环境下线程不安全
         
         注:有状态的对象:有实例变量可以标志其对象所处的状态(有属性的对象,有实例变量的对象,
             有存储数据的能力)
         无状态的对象:无实例变量可以标志其对象所处的状态(无属性的对象,无实例变量的对象,
             没有存储数据的能力)
            
             对象中有实例属性, 就是有状态的
    
  4. 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 动态参数时需要注意,用$而不是#。
    
  5. http和tcp的区别

  6. tcp的三次握手

  7. springboot的自动装配原理

  8. 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>
     
    
  9. 解决并发问题的常用方式

全部评论

相关推荐

05-01 22:41
中南大学 Java
点赞 评论 收藏
分享
评论
6
19
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务