北京用友实习java一面

自我介绍

学习 方式

Springboot 和Spring的区别

首先在配置上,spring需要是xml或者java类的配置,从而去定义bean的依赖关系,而springboot是约定大于配置的,只需要去使用一些注解就能够简化开发,并且springboot只需要去配使用starter就能实现依赖管理,

此外springboot还内嵌了Tomcat,实现热部署,快速重启的作用

关键字:配置,启动,Tomcat,Starter

Spring 事务介绍一下

​ 一般用@Transactional,声明式事务的实现,当然也可以进行编程式实现用TransactionTemplate 也可以实现,重点说一下注解的方式,还是基于AOP去实现的,大概了解就是他会有一个平台管理事务的接口**PlatformTransactionManager,也有对应的事务的状态信息,比如什么隔离级别,回滚什么的,还有个接口是事务的运行状态。所以一共就是三个接口**

事务的传播机制这个取决于注解里面对于的progation的属性配置,默认用的就是就是PROPAGATION_REQUIRED

如果外部方法没有开启事务的话,Propagation.REQUIRED修饰的内部方法会新开启自己的事务,且开启的事务相互独立,互不干扰。

如果外部方法开启事务并且被Propagation.REQUIRED的话,所有Propagation.REQUIRED修饰的内部方法和外部方法均属于同一事务 ,只要一个方法回滚,整个事务均回滚。

@Service
Class A {
    @Autowired
    B b;
    @Transactional(propagation = Propagation.xxx)
    public void aMethod {
        //do something
        b.bMethod();
    }
}

@Service
Class B {
    @Transactional(propagation = Propagation.xxx)
    public void bMethod {
       //do something
    }
}


在这种情况下就会当第二个方法报错,那么第一个方法也会进行回滚,因此如果我把第一个方法里面把第二个方法进行trycatch并且记录日志,由于异常被捕获,所以不会自动回滚。

此外的常用两种还有progation.new,使用这个后就会去开始对应新的事物,比如a方法报错,那么b就不会进行回滚,但是如果b方法报错,并且异常没有被捕获,因此a会判定为出现错误,因此都会回滚。

还有progation.nested,这个就相当于内嵌了一个事务,比如b用这个,a仍然是默认,那么b报错,b回滚。a不会回滚。取决于外部方法有木有开启一个事务

使用上:

如果对于数据库的操作,单条的sql语句就不需要去开启事务,反之成立

SpringAOP在事务的运用呢

首先刚刚说的注解仍然是在基于AOP实现的,AOP又是基于动态代理实现的,这取决于目标有没有去实现接口,如果实现了接口,会默认使用JDK的动态代理,如果没有,会走Cglib进行,其实也就是去生成对应的代理对象,如何走前后以及规定的回滚逻辑,此外还要注意在一个类里面实现自调用的问题,因为他是基于这是因为 Spring AOP 工作原理决定的。因为 Spring AOP 使用动态代理来实现事务的管理,它会在运行的时候为带有 @Transactional 注解的方法生成代理对象,并在方法调用的前后应用事物逻辑。如果该方法被其他类调用我们的代理对象就会拦截方法调用并处理事务。但是在一个类中的其他方法内部调用的时候,我们代理对象就无法拦截到这个内部调用,因此事务也就失效了。解决办法就是避免同一类中自调用或者使用 AspectJ 取代 Spring AOP 代理。

Mysql的隔离级别默认

四个隔离机制,默认是可重复读的操作,它主要去解决了脏读和不可重复读的操作。因为它只能看到事务的启动之前已经提交的数据

@Qualifier的运用

这里首先就是去解决不同的bean,或者说同种类型的bean,当自动注入的时候不知道如何进行注入,这个时候就可以用这个注解,并且去声明里面的name属性,在注入的时候进行指定名字进行注入就行

@AutoWired和@Resource的区别

首先是提供者 @Autowired 是 Spring 提供的注解,@Resource` 是 JDK 提供的注解。

第一个注解主要是用根据类型去匹配的,优先去匹配对应接口类型进行匹配,那么当多个类型的时候就会用名字去注入,这时候建议是使用@Qualfier去操作,传入value指定bean的名字,一般是接口小写。第二个注解就是根据名字去注入,都要去传入对应的bean的名字,他的属性是name

使用@Autowired 支持在构造函数、方法、字段和参数上使用。@Resource 主要用于字段和方法上的注入,不支持在构造函数或参数上使用。

GC 的CMS,并且思考如果并发过程老年区出现大对象,或者碎片化过多怎么办

这里走一遍CMS的流程,标记-清除算法,jdk8,注重用户的暂停时间,流程

首先就是老年代的算法,会先单独标记gcroot,并发标记剩下的,如何在单独标记刚刚并发造成的,最后并行清理

缺点就是会产生大量的内存碎片,这时候如果并发清理的时候出现大对象,他会要么OOM,要么退化成serial Old的算法,这时候进行的gc耗时就很长(多线成标记-整理)

Docker基本使用

只介绍一些基本命令,以及概念

Kafka

这里大概说一下他的架构,以及生产-订阅的设计模式

topic,partition,broker,consumer

spring框架的设计模式

单例模式

体现在bean的默认,prototype,底层用的是concurrentHashmap,去写的一个哈希表,大部分无状态是线程安全的

工厂模式

BeanFactory延迟注入(使用到某个 bean 的时候才会注入),相比于ApplicationContext 来说会占用更少的内存,程序启动速度更快。

ApplicationContext:容器启动的时候,不管你用没用到,一次性创建所有 beanBeanFactory 仅提供了最基本的依赖注入支持,ApplicationContext 扩展了 BeanFactory ,除了有BeanFactory的功能还有额外更多功能,所以一般开发人员使用ApplicationContext会更多。

代理模式

实际上就是动态代理的一些操作

Spring AOP 属于运行时增强,而 AspectJ 是编译时增强。 Spring AOP 基于代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)

适配器模式

这个体现在Spring MVC里面的DispatchServlet,这个就会进行,并且映射出对应的handler,开始由HandlerAdapter 适配器处理。HandlerAdapter 作为期望接口,具体的适配器实现类用于对目标类进行适配,Controller 作为需要适配的类。

@Component 和 @Bean 的区别是什么?

  • @Component 注解作用于类,而@Bean注解作用于方法。
  • @Component通常是通过类路径扫描来自动侦测以及自动装配到 Spring 容器中(我们可以使用 @ComponentScan 注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中)。@Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean告诉了 Spring 这是某个类的实例,当我需要用它的时候还给我。
  • @Bean 注解比 @Component 注解的自定义性更强,而且很多地方我们只能通过 @Bean 注解来注册 bean。比如当我们引用第三方库中的类需要装配到 Spring容器时,则只能通过 @Bean来实现。

Bean的作用域

singleton : IoC 容器中只有唯一的 bean 实例。Spring 中的 bean 默认都是单例的,是对单例设计模式的应用。

prototype : 每次获取都会创建一个新的 bean 实例。也就是说,连续 getBean() 两次,得到的是不同的 Bean 实例。

剩下的比如什么seesion,request都是用于web应用

#我的实习日记#
全部评论
佬,项目问的多吗?
点赞 回复 分享
发布于 2024-08-14 23:39 山西

相关推荐

xdm 早上喝奶茶差点喷出来。事情是这样的,我们班有个哥们儿,简称 L,去年秋招拿了字节sp,专业方向是后端。我们当时都震惊:这哥们儿平时课上从来不发言,期末小组作业基本是划水的那种,刷题平台 commit记录我点进去看过,绿格子稀稀拉拉。但他面试一路绿灯。一面二面三面 hr 面,全过,给的还是sp。当时班级群里恭喜他的、问他经验的、约饭的,热闹了一周。他说自己"运气好,准备充分"。我们都信了,直到三月初他入职。入职第二周开始,班里另一个进字节的同学W(在隔壁组的)开始跟我他的不对劲。一开始是写代码慢,后来写不出来,再后来是组里 mentor 让他fix 一个简单 bug 都搞了一下午没动静。最离谱的是上周。W 说他们大部门搞了个新人分享会,让新人讲一下自己负责模块的设计思路。L 上去讲了 20分钟,全程念稿子,问答环节别人随便问一个"那你这里为什么用 Redis 不用 Memcached",他直接卡 30秒说"这个我回去再确认一下"。会后他 mentor 直接找 leader 谈,leader 找 hr 谈,hr调出了他面试录像,全程对比口型和回答节奏,发现他二三面有大量时长在偷偷看屏幕外(推测开了双机位 AI 答题)。(这段是 W后来转述给我的,他自己也是听他组里同事八卦来的)昨天下班前,W 告诉我L 被辞退了,让他自己走,不走就走仲裁但会发函到学校。L 现在已经回学校了,朋友圈仅三天可见。我说真的,我不是个心眼小的人,但是我看到这个消息的时候真的有种"嗯,挺好"的感觉。去年秋招我投字节后端,简历挂。我准备了八个月,背 八股 + 刷 500 题 +项目改了三版,连面试机会都没拿到。班里这哥们儿凭着一个外挂上岸,最后还是被甩出来了。不是说作弊就一定会被发现,但是当面试拿到的 offer远远超出真实能力的时候,迟早会有这一天。试用期三个月不是给你过家家的,是真的要写代码、要在会议上回答问题、要扛需求的。我现在反而有点同情他。同情他相信"上岸就是终点"。发出来不是为了嘲笑谁,就是想说给那些正在被身边作弊上岸的同学搞得很 emo 的 uu 们听——别急,回旋镖很长,但它一定会回来。你继续刷你的题,写你的项目,背你的八股。该是你的迟早是你的,不是你的早晚还得还回去。xdm 共勉。
牛客12588360...:我不想评论面试方式,作弊是绝对不对的,但是你八股加刷题也不过是个做题小子,他穿帮纯粹是他菜,你也没有高明到哪里去
点赞 评论 收藏
分享
码客明:想好了就冲,考完研三年后又是一个行情
点赞 评论 收藏
分享
评论
13
38
分享

创作者周榜

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