如果当时这15道题能答好,现在应该已经被录取了(记一次面试的亲身经历 2020-7-20)

时间荏苒,岁月如梭,7月20日我又出去面试了,一家离我家只有一道之隔的国企,公司规模,办公环境都还是可以的,主打Oracle数据库,面试几天第一个有面试题的公司,感觉郎情妾意,相谈甚欢,结果狼心狗肺,惨遭淘汰!

如果当时这15道题能答好,现在应该已经被录取了(记一次面试的亲身经历 2020-7-20)_第1张图片

一、数据库如何保证主键唯一性

1、主键约束

主键列上没有任何两行具有相同值(即重复值),不允许空(NULL);

2、唯一性约束

保证一个字段或者一组字段里的数据都与表中其它行的对应数据不同。和主键约束不同,唯一性约束允许为null,但是只能有一行;

3、唯一性索引

不允许具有索引值相同的行,从而禁止重复的索引和键值;

4、三者的区别

  • 约束是用来检查数据的正确性;
  • 索引是用来优化查询的;
  • 创建唯一性约束会创建一个约束和一个唯一性索引;
  • 创建唯一性索引只会创建一个唯一性索引;
  • 主键约束和唯一性约束都会创建一个唯一性索引。

二、Redis单线程多线程

Redis是单线程的

Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下往往不能直接返回,这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户提供服务,而 I/O 多路复用就是为了解决这个问题而出现的。

Redis6.0之后引入多线程,Redis 的多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程。

【Spring Boot 12】看完这篇,Redis你就入门了

博客白写了,面试的时候的答的细碎。

三、Oracle存储过程

这是一个大项,有时间再研究吧。

Oracle存储过程常用技巧

四、JVM栈堆概念,何时销毁对象

  1. 类在程序运行的时候就会被加载,方法是在执行的时候才会被加载,如果没有任何引用了,Java自动垃圾回收,也可以用System.gc()开启回收器,但是回收器不一定会马上回收。
  2. 静态变量在类装载的时候进行创建,在整个程序结束时按序销毁;
  3. 实例变量在类实例化对象时创建,在对象销毁的时候销毁;
  4. 局部变量在局部范围内使用时创建,跳出局部范围时销毁;

五、Spring中都应用了哪些设计模式

1、简单工厂模式

简单工厂模式的本质就是一个工厂类根据传入的参数,动态的决定实例化哪个类。

Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象。

2、工厂方法模式

应用程序将对象的创建及初始化职责交给工厂对象,工厂Bean。

定义工厂方法,然后通过config.xml配置文件,将其纳入Spring容器来管理,需要通过factory-method指定静态方法名称。

3、单例模式

Spring用的是双重判断加锁的单例模式,通过getSingleton方法从singletonObjects中获取bean。

     /**
     * Return the (raw) singleton object registered under the given name.
     * 

Checks already instantiated singletons and also allows for an early * reference to a currently created singleton (resolving a circular reference). * @param beanName the name of the bean to look for * @param allowEarlyReference whether early references should be created or not * @return the registered singleton object, or {@code null} if none found */ protected Object getSingleton(String beanName, boolean allowEarlyReference) { Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) { synchronized (this.singletonObjects) { singletonObject = this.earlySingletonObjects.get(beanName); if (singletonObject == null && allowEarlyReference) { ObjectFactory singletonFactory = this.singletonFactories.get(beanName); if (singletonFactory != null) { singletonObject = singletonFactory.getObject(); this.earlySingletonObjects.put(beanName, singletonObject); this.singletonFactories.remove(beanName); } } } } return (singletonObject != NULL_OBJECT ? singletonObject : null); }

4、代理模式

Spring的AOP中,使用的Advice(通知)来增强被代理类的功能。Spring实现AOP功能的原理就是代理模式(① JDK动态代理,② CGLIB字节码生成技术代理。)对类进行方法级别的切面增强。

5、装饰器模式

装饰器模式:动态的给一个对象添加一些额外的功能。

Spring的ApplicationContext中配置所有的DataSource。这些DataSource可能是不同的数据库,然后SessionFactory根据用户的每次请求,将DataSource设置成不同的数据源,以达到切换数据源的目的。

在Spring中有两种表现:

一种是类名中含有Wrapper,另一种是类名中含有Decorator。

6、观察者模式

定义对象间的一对多的关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。

Spring中观察者模式一般用在listener的实现。

7、策略模式

策略模式是行为性模式,调用不同的方法,适应行为的变化 ,强调父类的调用子类的特性 。

getHandler是HandlerMapping接口中的唯一方法,用于根据请求找到匹配的处理器。

8、模板方法模式

Spring JdbcTemplate的query方法总体结构是一个模板方法+回调函数,query方法中调用的execute()是一个模板方法,而预期的回调doInStatement(Statement state)方法也是一个模板方法。

如果当时这15道题能答好,现在应该已经被录取了(记一次面试的亲身经历 2020-7-20)_第2张图片

六、简单介绍一下Spring Boot

1、Spring是什么

Spring框架为开发Java应用程序提供了全面的基础架构支持。它包含一些很好的功能,如依赖注入和开箱即用的模块,如Spring JDBC、Spring MVC、Spring Security、Spring AOP、Spring ORM、Spring Test。这些模块缩短应用程序的开发时间,提高了应用开发的效率。

2、Spring Boot是什么

Spring Boot是Spring框架的扩展,它消除了设置Spring应用程序所需的XML配置,更快、更高效。

以下是Spring Boot中的一些特点:

  • 嵌入tomcat,而且不需要部署tomcat;
  • 提供的starter来简化maven配置;
  • 创建Spring Boot项目时可以选择Spring应用;
  • 提供外部化配置;
  • 不需要配置xml了;

3、MVC配置

Spring需要定义调度程序servlet,映射和其它支持配置。我们可以使用web.xml文件或Initializer类来完成此操作。

public class MyWebAppInitializer implements WebApplicationInitializer { 
    @Override 
    public void onStartup(ServletContext container) { 
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); 
        context.setConfigLocation("com.pingfangushi"); 
          container.addListener(new ContextLoaderListener(context)); 
          ServletRegistration.Dynamic dispatcher = container 
          .addServlet("dispatcher", new DispatcherServlet(context)); 
        dispatcher.setLoadOnStartup(1); 
        dispatcher.addMapping("/"); 
    } 
} 

还需要将@EnableWebMvc注释添加到@Configuration类,并定义一个视图解析器来解析从控制器返回的视图:

@EnableWebMvc 
@Configuration 
public class ClientWebConfig implements WebMvcConfigurer {  
   @Bean 
   public ViewResolver viewResolver() { 
      InternalResourceViewResolver bean 
        = new InternalResourceViewResolver(); 
      bean.setViewClass(JstlView.class); 
      bean.setPrefix("/WEB-INF/view/"); 
      bean.setSuffix(".jsp"); 
      return bean; 
   } 
} 

和上述操作相比,Spring Boot只需在application配置文件中配置间隔属性就能完成上述操作:

spring.mvc.view.prefix=/WEB-INF/jsp/ 
spring.mvc.view.suffix=.jsp 

4、配置模板引擎 Thymeleaf

在Spring中,我们需要为视图解析器添加thymeleaf-spring5依赖项和一些配置:

@Configuration 
@EnableWebMvc 
public class MvcWebConfig implements WebMvcConfigurer { 

    @Autowired 
    private ApplicationContext applicationContext; 

    @Bean 
    public SpringResourceTemplateResolver templateResolver() { 
        SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver(); 
        templateResolver.setApplicationContext(applicationContext); 
        templateResolver.setPrefix("/WEB-INF/views/"); 
        templateResolver.setSuffix(".html"); 
        return templateResolver; 
    } 

    @Bean 
    public SpringTemplateEngine templateEngine() { 
        SpringTemplateEngine templateEngine = new SpringTemplateEngine(); 
        templateEngine.setTemplateResolver(templateResolver()); 
        templateEngine.setEnableSpringELCompiler(true); 
        return templateEngine; 
    } 

    @Override 
    public void configureViewResolvers(ViewResolverRegistry registry) { 
        ThymeleafViewResolver resolver = new ThymeleafViewResolver(); 
        resolver.setTemplateEngine(templateEngine()); 
        registry.viewResolver(resolver); 
    } 
} 

Spring Boot直接添加spring-boot-starter-thymeleaf依赖就行了。

5、Spring Security 配置

Spring需要依赖spring-security-web和spring-security-config 模块。

接下来, 我们需要添加一个扩展WebSecurityConfigurerAdapter的类,并使用@EnableWebSecurity注解:

@Configuration 
@EnableWebSecurity 
public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
        auth.inMemoryAuthentication() 
          .withUser("admin") 
            .password(passwordEncoder() 
            .encode("password")) 
          .authorities("ROLE_ADMIN"); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
        http.authorizeRequests() 
          .anyRequest().authenticated() 
          .and() 
          .httpBasic(); 
    } 

    @Bean 
    public PasswordEncoder passwordEncoder() { 
        return new BCryptPasswordEncoder(); 
    } 
} 

Spring Boot添加spring-boot-starter-security依赖就行了。

6、Spring支持传统的web.xml,SpringBoot使用嵌入式容器来运行程序,Spring Boot使用main方法来启动嵌入式web服务器,它还负责将servlet、filter、ServletContextInitializer bean从应用程序上下文绑定到嵌入式servelet容器。

7、打包和部署

Spring和Spring Boot都支持maven和Gradle通用打包管理技术。

Spring Boot相对Spring的一些优点:

  • 提供嵌入式容器支持;
  • 使用命令java -jar独立运行jar;
  • 部署时可以灵活指定配置文件;

七、Spring Boot和Spring MVC有什么区别?

Spring框架有很多衍生产品,例如Spring Boot、Spring MVC、Spring Security等等,但是他们的基础都是Spring的IOC和AOP。

IOC提供了依赖注入的容器,AOP提供了面向切面编程,然后在这两者的基础上实现了其它延伸产品的高级功能。

Spring MVC是一种松耦合的方式开发web应用的框架。

通过Dispatcher Servlet, ModelAndView 和 View Resolver,开发web应用变得很容易。解决的问题领域是网站应用程序或者服务开发--url路由、session、模板引擎、静态web资源等等。

Spring Boot实现了自动配置,降低了项目搭建的复杂度。

Spring Boot主要为了解决Spring框架需要大量配置太麻烦的问题。同时集成了很多第三方库(例如JDBC、Redis等),Spring Boot中的第三方库基本都是零配置的开箱即用。

对于我们来说,换成Spring Boot之后,项目初始化方法变了,配置文件变了,不需要安装tomcat了,maven打包jar就能直接部署运行了,但你最核心的业务逻辑实现与业务流程实现没有任何变化。

八、RPC是什么

RPC服务和HTTP服务对比

九、websocket应用的是哪个协议

WebSocket是一个允许Web应用程序(通常指浏览器)与服务器进行双向通信的协议。HTML5的WebSocket API主要是为浏览器端提供了一个基于TCP协议实现全双工通信的方法。

WebSocket优势: 浏览器和服务器只需要要做一个握手的动作,在建立连接之后,双方可以在任意时刻,相互推送信息。同时,服务器与客户端之间交换的头信息很小。

十、项目中到的消息中间件

【Spring Boot 7】RabbitMQ 详解

有些东西不是你写了,你就会了,以后写博客,切记滥竽充数!

十一、spring boot工程的部署

1、在pom文件中定义启动类的名称;


    
        
            org.springframework.boot
            spring-boot-maven-plugin
            
                org.spring.springboot.Application
            
        
    

2、定义Spring Boot启动类;

@SpringBootApplication
@MapperScan("org.spring.springboot.dao")
public class Application extends SpringBootServletInitializer{
    public static void main(String[] args) {
        // 程序启动入口
        // 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
        SpringApplication.run(Application.class,args);
    }
    
    @Override//为了打包springboot项目
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(this.getClass());
    }
}

主要就是继承SpringBootServletInitializer 和重写 configure方法;

3、然后到项目的pom平级的目录下面,使用mvn clean package 命令打包成jar;

4、然后再到 target的目录下面执行 java -jar xxx.jar;

十二、Spring Boot如何访问不同的数据库

如果当时这15道题能答好,现在应该已经被录取了(记一次面试的亲身经历 2020-7-20)_第3张图片

1、单数据源的场景(一般的Web项目工程这样配置进行处理,就已经比较能够满足我们的业务需求)
多数据源多SessionFactory这样的场景,估计作为刚刚开始想象想处理在使用框架的情况下处理业务,配置多个SessionFactory,然后在Dao层中对于特定的请求,通过特定的SessionFactory即可处理实现这样的业务需求,不过这样的处理带来了很多的不便之处,所有很多情况下我们宁愿直接使用封装的JDBC编程,或者使用Mybatis处理这样的业务场景

2、使用AbstractRoutingDataSource 的实现类,进行灵活的切换,可以通过AOP或者手动编程设置当前的DataSource,不用修改我们编写的对于继承HibernateSupportDao的实现类的修改,这样的编写方式比较好,至于其中的实现原理,让我细细到来。我们想看看如何去应用,实现原理慢慢的说!

3、编写AbstractRoutingDataSource的实现类,HandlerDataSource就是提供给我们动态选择数据源的数据的信息,我们这里编写一个根据当前线程来选择数据源,然后通过AOP拦截特定的注解,设置当前的数据源信息,也可以手动的设置当前的数据源,在编程的类中。

十三、程序设计?

这是一个值得思考一生的话题!

十四、hibernate和mybatis的区别?

  mybatis hibernate
存储过程 支持 不支持
自定义sql 支持 不支持

管理系统时代,首先要实现业务逻辑,然后才会考虑性能,所以hibernate是当时的主流;

移动互联网时代,能更加准确定义sql,从而优化性能,更符合移动互联网高并发,大数据,高性能,高响应的要求;

十五、微信支付

这个问题不是短时间可以解决的,先这样吧,以后够来补充!

 

上一篇:如果当时这12道题能答好,现在应该已经被录取了(记一次面试的亲身经历 2020-7-14)

下一篇:如果当时这15道题能答好,现在应该已经被录取了(记一次面试的亲身经历 2020-7-23)

你可能感兴趣的:(程序猿历程)