面试整理

原创
2020/09/24 18:20
阅读数 36

zuu网关如何处理socket连接?

zuul只管理http请求,不支持tcp、udp, websocket在经过zuul以后,就会降级回http请求;

事务使用什么设计模式?

使用的代理设计模式

事务什么时候失效?

事务生效的前提是你的数据源得支持事务,比如 mysql 的 MyISAM 引擎就不支持事务,而 Innodb 支持事务 ;

在私有方法上,添加@Transactional注解也不会生效,私有方法外部不能访问

String为什么不能被继承?

因为String类使用final修饰;

mybatis中#与$区别?

select * from user where name = #{name}; 

#{} 在动态解析的时候, 会解析成一个参数标记符。就是解析之后的语句是:

select * from user where name = ?; 

那么我们使用 ${}的时候

select * from user where name = '${name}'; 

${}在动态解析的时候,会将我们传入的参数当做String字符串填充到我们的语句中,就会变成下面的语句

select * from user where name = "dato"; 

AOP是怎么实现的?

public class StuInvocationHandler<T> implements InvocationHandler {
   //invocationHandler持有的被代理对象
   T target;

   public StuInvocationHandler(T target) {
       this.target = target;
   }

   /**
    * proxy:代表动态代理对象
    * method:代表正在执行的方法
    * args:代表调用目标方法时传入的实参
    */
   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
       System.out.println("代理执行" +method.getName() + "方法");
       Object result = method.invoke(target, args);
       return result;
   }
}

过滤器如何实现?

SpringBoot中使用过滤器不需要在web.xml中配置filter,只需要添加注解@WebFilter同时实现Filter接口

@Component
@WebFilter(urlPatterns = "/*", filterName = "test")
public class TestFilter implements Filter {
 
@Override
public void init(FilterConfig arg0) throws ServletException {
    System.out.println("过滤器初始化");
}
 
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
    throws IOException, ServletException {
    System.out.printf("过滤器实现");
    System.out.println(((HttpServletRequest) servletRequest).getRequestURI());
    filterChain.doFilter(servletRequest, servletResponse);
}
 
@Override
public void destroy() {
    System.out.println("过滤器销毁了");
}

拦截器如何实现?

首先创建拦截器实现HandlerInterceptor

public class MyInterceptor implements HandlerInterceptor{
     //在请求处理之前进行调用(Controller方法调用之前
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.printf("preHandle被调用\n");
        return true;   
    }
 
    //请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle被调用\n");
    }
 
    //在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("afterCompletion被调用\n");
    }
}

然后创建一个配置类,用于注册拦截器

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    /**
     * 注册拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/a.do");
    }
}    

addPathPatterns和excludePathPatterns可以分别指定要拦截的请求和排除的请求,参数也可以是一个List<String>

需要注意的是,拦截器是基于spring的,且只有通过DispatcherServlet的请求才能被拦截。

过滤器与拦截器的区别?

过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符

拦截器,是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

错误是如何处理的?

封装一个返回对象统一使用,里面有状态码code、数据data、错误信息mes等,使用try{}catch进行捕获,然后进行返回。

protected static final Logger logger = LoggerFactory.getLogger(TestController.class);//使用的slf4j

配置文件

logging.path=F:\\logtest\\log  #将日志文件生成到系统盘路径
 
logging.level.web=info  #简单设置一下日志等级
 
logging.file=log\\myboot.log  #将日志文件生成到项目绝对路径

分布式异常如何捕获?

使用ELK分布式日志收集

spring mvc的原理?

spring aop底层是怎么实现的?

动态代理,在不修改原有类对象方法的源代码基础上,通过代理 对象实现原有类对象方法的增强,也就是拓展原有类对象的功能。

@Aspect //作用是把当前类标识为一个切面供容器读取 
@Component
public class LogInterceptor {

    private final Logger logger = LoggerFactory.getLogger(LogInterceptor.class);

    @Before(value = "execution(* com.example.aop_demo.*.*(..))")

    public void before(){
        logger.info("login start!");
    }

    @After(value = "execution(* com.example.aop_demo.*.*(..))")
    public void after(){
        logger.info("login end!");
    }

}
@RestController
public class TestController {

    @RequestMapping(value = "/TestAction",method = RequestMethod.GET)
    public String TestAction(){

        System.out.println("进来了");

        return "测试AOP";
    }
}
<!-- aop -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
    <version>2.3.4.RELEASE</version>
</dependency>


spring aop用场景?

日志、权限、持久化等
mq使用场景?

解耦、异步、削峰。系统间的通信,多个系统进行信息通知、通知其他系统进行非实时的报表生成。
redis使用场景?

缓存用户的登录信息、热点数据的缓存、排行榜相关问题、redis由于incrby命令可以实现原子性的递增,可以解决计数器相关问题、分布式锁

//原子操作自增
RedisAtomicLong atomic = new RedisAtomicLong("",redisTemplate.getConnectionFactory());
long l = atomic.incrementAndGet();
//原子操作自增
redisTemplate.opsForValue().increment("K1");


redis集群如何使用?

主从复制,在从节点redis.conf中设置salveof 主节点的IP 主节点的port

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部