转载自:感觉被榨干了,被美团拷打一小时!
1、java这一块对框架都是熟悉的吧?
只用过SSM,SpringBoot还在学中。
2、MyBatis运用了哪些常见的设计模式?
运用了工厂模式,创建sqlsession的时候用了工厂模式,其他的没想起来。
补充:
- 工厂模式,工厂模式在 MyBatis 中的典型代表是 SqlSessionFactory
- 建造者模式,建造者模式在 MyBatis 中的典型代表是 SqlSessionFactoryBuilder
- 单例模式,单例模式在 MyBatis 中的典型代表是 ErrorContext
- 适配器模式,适配器模式在 MyBatis 中的典型代表是 Log
- 代理模式,代理模式在 MyBatis 中的典型代表是 MapperProxyFactory
- 模板方法模式,模板方法在 MyBatis 中的典型代表是 BaseExecutor
- 装饰器模式,装饰器模式在 MyBatis 中的典型代表是 Cache
3、MyBatis中创建了一个Mapper接口,在写一个xml文件,java的接口是要实现的,为什么这没有实现呢?
(现在回想起来,是要诱导我说动态代理)一个mapper接口通过namespace的id对应的就是一个xml的文件。没了解背后的原理
补充:
MyBatis中的Mapper接口并不需要实现,它只是定义了一组方法签名。MyBatis会根据Mapper接口中的方法名、参数类型和返回值类型,自动生成实现方法。因此,Mapper接口中的方法不需要实现,也不需要在该接口中编写任何方法体。
相反,你需要编写一个与Mapper接口同名的XML文件,来实现这些方法的具体SQL操作。这样,当你在Java代码中调用Mapper接口中的方法时,MyBatis会自动将该方法映射到对应的XML文件中的SQL语句,并执行该语句。
4、与传统的JDBC相比,MyBatis的优点?
有些功能封装的更好,像打开一个sqlsession的连接,而且写的代码要少
补充:
- mybatis的全局配置文件中可以设置数据库连接池,和spring整合可以配置数据库连接
- mybatis把sql和代码分离,提供了Mapper.xml映射文件,在映射文件中通过标签来写sql
- mybatis中自动完成java对象和sql中参数的映射
- mybatis中通过ResultSetHandler自动将结果集映射到对应的java对象中
5、还记得JDBC连接数据库的步骤吗?
不记得了,太久没用JDBC
补充:
使用JDBC连接数据库的步骤如下:
-
加载数据库驱动程序:使用Class.forName()方法加载对应的数据库驱动程序,例如:Class.forName("com.mysql.jdbc.Driver");
-
建立数据库连接:使用DriverManager.getConnection()方法建立与数据库的连接,需要指定数据库的URL、用户名和密码,例如:Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase", "username", "password");
-
创建Statement对象:使用Connection对象的createStatement()方法创建一个Statement对象,用于执行SQL语句,例如:Statement stmt = conn.createStatement();
-
执行SQL语句:使用Statement对象的executeQuery()或executeUpdate()方法执行SQL语句,例如:ResultSet rs = stmt.executeQuery("SELECT * FROM mytable");
-
处理查询结果:如果执行的是查询语句,需要使用ResultSet对象来处理查询结果,例如:while (rs.next()) { String name = rs.getString("name"); int age = rs.getInt("age"); }
-
关闭数据库连接:在程序结束时,需要使用Connection对象的close()方法关闭数据库连接,例如:conn.close();
6、怎么理解SpringIoc?
SpringIoc就是控制反转,把创建对象的权力交给了框架,然后Spring通过反射就会创建一个对象。当我创建的一个类要用到这个对象,Spring就会把这个对象交给我。
7、如果让你设计一个SpringIoc,你觉得会从哪些方面考虑这个设计?
- 多线程,这个对象是单例的还是每个线程都特有的。
- 可能会有循环依赖的问题,像对象A有B的引用,然后对象B有A的引用
- bean的生命周期也需要考虑。
补充:
- Bean的生命周期管理:需要设计Bean的创建、初始化、销毁等生命周期管理机制,可以考虑使用工厂模式和单例模式来实现。
- 依赖注入:需要实现依赖注入的功能,包括属性注入、构造函数注入、方法注入等,可以考虑使用反射机制和XML配置文件来实现。
- Bean的作用域:需要支持多种Bean作用域,比如单例、原型、会话、请求等,可以考虑使用Map来存储不同作用域的Bean实例。
- AOP功能的支持:需要支持AOP功能,可以考虑使用动态代理机制和切面编程来实现。
- 异常处理:需要考虑异常处理机制,包括Bean创建异常、依赖注入异常等,可以考虑使用try-catch机制来处理异常。
- 配置文件加载:需要支持从不同的配置文件中加载Bean的相关信息,可以考虑使用XML、注解或者Java配置类来实现。
8、Spring给我们提供了很多扩展点,这些有了解吗?
不太清楚扩展点指的什么
补充:
Spring框架提供了许多扩展点,使得开发者可以根据需求定制和扩展Spring的功能。以下是一些常用的扩展点:
- BeanFactoryPostProcessor:允许在Spring容器实例化bean之前修改bean的定义。常用于修改bean属性或改变bean的作用域。
- BeanPostProcessor:可以在bean实例化、配置以及初始化之后对其进行额外处理。常用于代理bean、修改bean属性等。
- PropertySource:用于定义不同的属性源,如文件、数据库等,以便在Spring应用中使用。
- ImportSelector和ImportBeanDefinitionRegistrar:用于根据条件动态注册bean定义,实现配置类的模块化。
- Spring MVC中的HandlerInterceptor:用于拦截处理请求,可以在请求处理前、处理中和处理后执行特定逻辑。
- Spring MVC中的ControllerAdvice:用于全局处理控制器的异常、数据绑定和数据校验。
- Spring Boot的自动配置:通过创建自定义的自动配置类,可以实现对框架和第三方库的自动配置。
- 自定义注解:创建自定义注解,用于实现特定功能或约定,如权限控制、日志记录等。
10、servlet有写过简单的代码吗?
没用框架之前,就用的servlet,用了框架就用的框架
11、大致了解SpringMVC的处理流程吗?
首先通过一个dispatchservlet去转接请求,到handlermapping去返回一个执行链,就比如拦截器到哪个controller,返回以后就到handler适配器获取这个请求要求的controller,然后去controller这里返回一个数据或者页面modelandview,然后给前端。
12、SpringAOP主要想解决什么问题
提供了一个扩展功能,可以一个类的某个方法进行加强,比如在之前加强,在之后加强,环绕加强。
补充:
Spring AOP主要解决的是横切关注点的问题,即在一个系统中,可能存在多个模块或组件都需要实现类似的功能,比如日志记录、权限校验、事务管理等等。如果每个模块都去实现这些功能,就会导致代码冗余,可维护性和可扩展性降低。而AOP则是基于动态代理的机制,在不修改原有代码的情况下,通过在代码执行前后插入增强代码的方式,实现对横切关注点的统一处理,从而提高代码的复用性和可维护性。
13、SpringAOP的原理了解吗
基于一个动态代理的设计模式,如果动态加强的类实现了某个接口,就会用JDK动态代理,如果是对于没有实现接口的类,就会用cglib动态代理模板,去生成一个被代理对象的一个子类来作为代理对象。
补充:
Spring AOP的主要目的是将横切关注点(如日志、安全和事务管理等)从业务逻辑中分离出来,从而提高代码的模块性和可维护性。
原理主要包括以下几个方面:
- 代理模式:Spring AOP基于代理模式实现,主要有两种代理方式,JDK动态代理和CGLIB代理。JDK动态代理要求目标类必须实现接口,而CGLIB代理则可以针对没有实现接口的类进行代理。
- 切面(Aspect):切面是将横切关注点模块化的实现。切面通常包含通知(Advice)和切点(Pointcut)。通知是在特定的切点执行的动作,切点则用于定义通知应该在何处执行。
- 连接点(Joinpoint):连接点代表在应用程序中可以插入切面的点,如方法调用、异常处理等。
- 织入(Weaving):织入是将切面应用到目标对象的过程,从而创建代理对象。在Spring AOP中,织入过程发生在运行时。
通过以上原理,Spring AOP能够在不修改原有业务代码的情况下,将横切关注点进行模块化管理,提高代码的可读性和易维护性。
14、动态代理和静态代理的区别
静态代理是自己手写一个代理类,但是动态代理不需要直接实现这个代理类的,相当于静态代理在编译的时候就已经变成了一个个二进制文件了,动态代理在运行的时候动态生成类的字节码文件。
15、动态代理中如果有实现了接口,就会用JDK动态代理呢?
不太了解(后来查了应该是因为JDK动态代理会继承Proxy类,但是java是单继承)
16、代理模式和适配器模式有什么区别?
代理模式主要是去加强一个类的方法。适配器模式是接口转换成一个想要的接口(这个问题被面试说回答的不好)
补充:
代理模式和适配器模式是两种常用的设计模式,它们的区别主要体现在以下几个方面:
- 作用不同:代理模式是为了控制对对象的访问,而适配器模式是为了解决接口不匹配的问题。
- 解决问题的角度不同:代理模式是从外部控制访问,保护目标对象,而适配器模式是从内部改变对象接口,让其能够适配客户端的要求。
- 实现方式不同:代理模式通常使用面向对象的继承或者组合方式实现,而适配器模式则通常使用对象组合方式实现。
- 适用场景不同:代理模式适用于需要对对象进行控制和保护的情况,例如远程代理、虚拟代理等。适配器模式适用于需要将一个类的接口转换成客户端期望的另一个接口的情况,例如旧系统的升级改造、不兼容接口的统一等。