• 面试题


    有哪些不同类型的IOC(依赖注入)方式?

      set注入:

        对于习惯了传统 javabean 开发的程序员,通过 setter 方法设定依赖关系更加直观。 
        如果依赖关系较为复杂,那么构造子注入模式的构造函数也会相当庞大,而此时设值注入模式则更为简洁。 
        Setter注入也需要在xml中进行配置,在调用了无参的构造方法或者无参的静态工厂方法实例化bean之后,容器通过回调bean的setter方法来完成setter注入。 

        

        

      构造注入: 

           为POJO类创建带参的构造方法

            使用<constructor-arg>元素

        

        

        一个<constructor-arg>元素表示构造方法的一个参数,且使用时不区分顺序。当构造方法的参数出现混淆,无法区分时,可以通过<constructor-arg>元素的index属性指定该参数的位置索引,位置从0开始。<constructor-arg>元素还提供了type属性用来指定参数的类型,避免字符串和基本数据类型的混淆。

        构造注入的时效性好,在对象实例化就得到所依赖的对象,便于在对象的初始化方法中使用依赖对象;但受限于方法重载的形式,使用灵活性不足。设值注入使用灵活,但时效性不足,并且大量的setter访问器增加了类的复杂性。Spring并不倾向于某种注入方式,用户应该根据实际情况进行合理的选择。

      p命名空间注入:

        p命名空间的特点是使用属性而不是子元素的形式配置Bean的属性,从而简化了Bean的配置,使用传统的<property>子元素配置的代码

          

                

        需要注意的是,p名称空间没有标准的XML格式定义灵活,比如说,bean的属性名是以Ref结尾的,那么采用p名称空间定义就会导致冲突,而采用标准的XML格式定义则不会出现这种问题。这里我们提醒大家在项目中还是仔细权衡来决定到底采用那种方式,同时也可以在团队成员都理解不同的定义方式的基础上,在项目中根据需要同时选择三种定义方式。

        P命名空间注入的方式也是使用setter方式注入,所有POJO类中必须存在对应的set方法

    最佳实践中,通常一个xml映射文件,就会写一个Dao接口与之对应,请问,这个Dao工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

      Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法内的参数,就是传递给sql的参数。Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement,举例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中,每一个<select>、<insert>、<update>、<delete>标签,都会被解析为一个MappedStatement对象。

      Dao接口里的方法,是不能重载的,因为是全限名+方法名的保存和寻找策略。

      Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回。

    mybatis是如何进行分页的?分页插件的原理是什么?

      Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

      分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

      举例:select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10

    java中9大隐式对象有哪些?

      request              请求对象                  类型 javax.servlet.ServletRequest          作用域 Request    对象主要用于处理客户端请求,在(页面转发,获取cookie)用到

      response             响应对象                   类型 javax.servlet.SrvletResponse          作用域  Page     用于处理响应客户端请求,在(页面重定向)中使用

      pageContext        页面上下文对象           类型 javax.servlet.jsp.PageContext         作用域    Page    用于获取页面的上下文,通过此对象可以获取页面的其他8个内置对象

      session              会话对象                   类型 javax.servlet.http.HttpSession          作用域    Session    在网络中被称为会话,一个会话就是浏览器与服务器之间的一次通话(保存登录状态时)

      application          应用程序对象             类型 javax.servlet.ServletContext            作用域    Application  就像全局变量,用于保存应用程序中的共有数据(上传时获取真实路径)

      out                    输出对象                   类型 javax.servlet.jsp.JspWriter             作用域    Page      对象用于在web浏览器内输出信息,数据输出完,要及时关闭输出流

      config                 配置对象                   类型 javax.servlet.ServletConfig             作用域    Page    用于取得服务器的配置信息

      page                 页面对象                   类型 javax.lang.Object                       作用域    Page    代表jsp本身,只有在jsp页面内才是合法的

      exception            例外对象                   类型 javax.lang.Throwable                    作用域    page     用于处理jsp页面发生的异常

    数据库里面的索引和约束是什么?

      索引:

        索引是最为常用的改善数据库性能的技术。SQL Server引入索引主要是为了提高查询的效率,它能够加速ORDER BY和GROUP BY子句的操作,保证数据的唯一性,并加快表连接的速度。   

        索引的概念和创建原则:

          索引就是一个指向表中数据的指针,如果我们把书比作数据,那么各个章节就相对于数据库中的表,而书的目录就是索引了。

          索引是在基本表的列上建立的一种数据库对象,它和基本表分开存储,它的建立或撤销对数据的内容毫无影响。索引一经创建,就完全由系统自动选择和维护,不需要用户指定使用索引,也不需要用户执行打开索引或进行重新索引等操作。

        优点: 
          (1)大大加快数据的检索速度;    
          (2)创建唯一性索引,保证数据库表中每一行数据的唯一性;    
          (3)加速表和表之间的连接;    
          (4)在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。 
        缺点: 
          (1)索引需要占物理空间。    
          (2)当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。 
        建立索引时的注意事项: 
          (1)考虑已在表上创建的索引数量。最好避免在单个表上有很多索引 
          (2)检查已在表上创建的索引的定义。最好避免包含共享列的重叠索引 
          (3)检查某列中唯一数据值的数量,并将该数量与表中的行数进行比较。比如如果有1000w记录,某字段为性别,只有男,女。也就是说一半的记录都是重复的,这样就要考虑是否还有必要建立索引了。

        一些索引类别:
          (1)普通索引 
            也即不加任何限制的索引。 
          (2)唯一索引 
            一种索引,不允许具有索引值相同的行,从而禁止重复的索引或键值。系统在创建该索引时检查是否有重复的键值,并在每次使用 INSERT 或 UPDATE 语句添加数据时进行检查。 
          (3)主键索引 
            数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。它和唯一索引的共性在于都不允许有重复记录,区别在于,唯一索引是不限制null的,也就是说或可以有一条以上的null值插入,但是主键却限定不能为空。 
          (4)聚簇索引和非聚簇索引 

            聚簇索引也叫簇类索引,是一种对磁盘上实际数据重新组织以按指定的一个或多个列的值排序。由于聚簇索引的索引页面指针指向数据页面,所以使用聚簇索引查找数据几乎总是比使用非聚簇索引快。每张表只能建一个聚簇索引,并且建聚簇索引需要至少相当该表120%的附加空间,以存放该表的副本和索引中间页。

      约束:

        设计数据库完整性的目的是为了防止数据库存在不符合语义的数据,防止错误信息的输入和输出。SQL Server提供的用来实施数据完整性的途径主要是约束(Constraint)、标识列(Identity Column)、默认(Default)、规则(Rule)、触发器(Trigger)、数据类型(Data Type)、索引(Index)和存储过程(Stored Procedure)等

        分类:

          主键约束:

            primary key constraint 唯一且不能为空;

          唯一约束:

            unique constrain  唯一,允许为空,即可以在其中出现null值,但只能出现一次;

          默认约束:

            default construction默认值;

          检查约束:

            check constrain 范围以及格式限制;

          外键约束:

            foreign key constrain 表关系

          删除约束:

            通过SQL语句删约束时,通过使用DROP命令删除响应的约束名;

          

      

  • 相关阅读:
    好的文章聚集地
    java连接mysql数据库8.0以上版本过程中遇到的坑
    Tomcat8.5安装与配置的坑
    用阿里fastJson解析Json字符串
    通过java代码HttpRequestUtil(服务器端)发送HTTP请求并解析
    Vue中美元$符号的意思
    java的jdk和jre区别
    java正则
    java8 四大核心函数式接口Function、Consumer、Supplier、Predicate(转载)
    SpringBoot:静态资源的访问和配置(转载)
  • 原文地址:https://www.cnblogs.com/wnwn/p/11753073.html
Copyright © 2020-2023  润新知