Java 语言有哪些特点?
- 面向对象(封装,继承,多态);
- 平台无关性( Java 虚拟机实现平台无关性);
- 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持);
- 支持网络编程并且很方便( Java 语言诞生本身就是为简化网络编程设计的,因此 Java 语言不仅支持网络编程而且很方便);
- 编译与解释并存;
谈谈对于 Spring IoC 的了解
IoC(Inversion of Control:控制反转) 是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。不过, IoC 并非 Spring 特有,在其他语言中也有应用。
为什么叫控制反转?
- 控制:指的是对象创建(实例化、管理)的权力
- 反转:控制权交给外部环境(Spring 框架、IoC 容器)

将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。 IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。
谈谈对于 Spring AOP 的了解
AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
Spring AOP 就是基于动态代理的,如果要代理的对象,实现了某个接口,那么 Spring AOP 会使用 JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候 Spring AOP 会使用 Cglib 生成一个被代理对象的子类来作为代理,如下图所示:

SpringAOPProcess
Linux环境如何设置jdk环境变量
设置环境变量(修改/etc/profile)
vi /etc/profile
Linux如何查看进程
ps -aux
ps -ef | grep
Java常用注解及原理
注解主要有四个部分的作用:
- 生成文档:即将元数据生成为Javadoc文档;
- 编译检查:编译器在编译阶段会对代码进行检查,例如@override注解会提示编译器查看其是否重写了父类的方法;
- 编译动态处理:主要是用作动态生成代码,例如一些帮助类、方法,通过注解实现自动生成;
- 运行动态处理:典型的例子是使用反射来注入实例;
Java提供了三种注解:
自带的标准注解(见下);
元注解(指修饰注解的注解,是最基准的注解);
自定义注解(用户可以自定义注解,如@Retention、@Target、@Inherited、@Documented、@Repeatable 等)。
- @Configuration
标注在类上,相当于把该类作为spring的xml配置文件中的,用来配置spring容器(上下文)。
- @Bean
标注在方法上(返回某个实例的方法),等价于spring的xml配置文件中的,作用为:注册bean对象。@Bean注解默认作用域为单例singleton作用域。
- @ComponentScan
标注在类上,用于对Component进行扫描;
- @WishlyConfiguration
组合注解,可以替代注解2-3;
上述1-4,是配置类的相关注解;
- @Component
一般是在类上,表明其是一个组件,告知Spring该类会创建Bean;
- @Repository
表明该对象是数据访问层(DAO)使用的;
- @Service
表明该对象是业务逻辑层(SERVICE)使用的;
- @Controller
这是控制器的声明,表明该对象在展现层使用;
以上5-8都是有关声明bean的注解;
- @Resource:自动依赖注入
- @Autowired:自动依赖注入;
注:两者的用法很相似,都是用作依赖注入,但是Resource是默认按照Name注入,而Autowired是按照Type注入的;
Vue生命周期详解
创建阶段
创建阶段可以看做一个vue实例生命的开始,可以把这一阶段比作组件从受精卵到胚胎的过程,这个阶段 vue组件开始初始化,vue开始观察数据,这个阶段有 beforeCreate 和 created 两个生命周期钩子函数。
beforeCreate
beforeCreate:是new Vue()之后触发的第一个钩子,此时 data、methods、computed以及watch上的数据和方法还未初始化,都不能被访问。
❝ 在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。 ❞
created
created:在实例创建完成后被立即调用,此时已完成以下的配置:数据观测 (data observer),property 和方法的运算,watch/event 事件回调。然而,挂载阶段还没开始,$el property 目前尚不可用,也就是可以使用数据,更改数据,在这里更改数据不会触发updated函数。
可以做什么:
- data 和 methods 都已经被初始化好了,如果要调用 methods 中的方法,或者操作 data 中的数据,最早可以在这个阶段中操作。
- 无法与Dom进行交互,如果非要想,可以通过vm.$nextTick来访问Dom。
- 异步数据的请求适合在 created 的钩子中使用,例如数据初始化。
挂载阶段
这个阶段是vue实例的出生阶段,这个阶段将实现 DOM 的挂载,这标志着我们可以在浏览器里中看到页面了。
beforeMount
beforeMount:发生在挂载之前,在这之前 template 模板已导入渲染函数编译。此时虚拟Dom已经创建完成,即将开始渲染。在这一阶段也可以对数据进行更改,不会触发updated。
❝ 执行到这个钩子的时候,在内存中已经编译好了模板了,但是还没有挂载到页面中,此时,页面还是旧的。 ❞
mounted
mounted:在挂载完成后发生,此时真实的Dom挂载完毕,数据完成双向绑定,可以访问到Dom节点,使用$refs属性对Dom进行操作。
❝ 执行到这个钩子的时候,就表示vue实例已经初始化完成了。此时组件脱离了创建阶段,进入到了运行阶段。 如果我们想要通过插件操作页面上的DOM节点,最早可以在和这个阶段中进行。 ❞
「注意」:mounted 不会保证所有的子组件也都一起被挂载。如果你希望等到整个视图都渲染完毕,可以在 mounted 内部使用 vm.$nextTick。
javascript复制代码mounted: function () { this.$nextTick(function () { // Code that will run only after the // entire view has been rendered }) }
运行阶段
vue实例不可能一直保持不变,就像人随着年龄的增长,形体会发生变化。当vue实例中的数据发生改变时,DOM 也会发生变化。
beforeUpdate
beforeUpdate:发生在更新之前,也就是响应式数据发生更新,虚拟dom重新渲染之前被触发,你可以在当前阶段进行更改数据,不会造成重新渲染,但会再次触发当前钩子函数。
updated
updated:发生在更新完成之后,此时 Dom 已经更新。现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态。如果要相应状态改变,最好使用计算属性或 watcher 取而代之。最好不要在此期间更改数据,因为这可能会导致无限循环的更新。
「注意」:updated 不会保证所有的子组件也都一起被重绘。如果你希望等到整个视图都重绘完毕,可以在 updated 里使用 vm.$nextTick。
javascript复制代码updated: function () { this.$nextTick(function () { // Code that will run only after the // entire view has been re-rendered(代码将在整个视图重新渲染后执行) }) }
销毁阶段
vue实例的消亡阶段。实例还可以被使用,直到destroyed(),我们可以最后做一些想做的事情。
beforeDestroy
beforeDestroy:发生在实例销毁之前,在这期间实例完全可以被使用,我们可以在这时进行善后收尾工作,比如清除计时器。
❝ Vue实例从运行阶段进入到了销毁阶段,这个时候上所有的 data 和 methods , 指令, 过滤器 ……都是处于可用状态。还没有真正被销毁。 ❞
destroyed
destroyed:发生在实例销毁之后,这个时候只剩下了dom空壳。组件已被拆解,数据绑定被卸除,事件监听器被移除,所有子实例也统统被销毁。
❝ 在大多数场景中你不应该调用这个方法。最好使用 v-if 和 v-for 指令以数据驱动的方式控制子组件的生命周期。 ❞
MySQL:索引详解
定义:索引是存储引擎用于快速找到记录的一种数据结构。举例说明:如果查找一本书中的某个特定主题,一般会先看书的目录(类似索引),找到对应页面。在MySQL,存储引擎采用类似的方法使用索引,高效获取查找的数据。
1、表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
- A、正确选择复合索引中的主列字段,一般是选择性较好的字段;
- B 、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
- C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
- D、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
8、频繁进行数据操作的表,不要建立太多的索引;
9、删除无用的索引,避免对执行计划造成负面影响;
一个班级考试表,满分100分,查出不同分数的人数和对应的人的名字