本帖最后由 yuchengmin 于 2018-9-13 10:23 编辑
1、谈谈你对Spring的理解 Spring容器的主要核心是:控制反转(IOC), 依赖注入(DI)和面向切面(AOP) ① 控制反转: 传统的java开发模式中,当需要一个对象时,我们会自己使用new或者getInstance等直接或者间接调用构造方法创建一个对象。而在spring开发模式中,spring容器使用了工厂模式为我们创建了所需要的对象,直接调用就可以了; ② 依赖注入: spring使用javaBean对象的set方法或者带参的构造方法为我们在创建所需对象时将其属性自动设置所需要的值的过程,就是依赖注入的思想。 ③ 面向切面编程: 将一个个的对象某些类似的方面横向抽成一个切面,对这个切面进行一些如权限控制、事物管理,记录日志等,底层是动态代理。 spring的启动过程? ① 创建全局的上下文环境,这个上下文就是ServletContext; ② 在web容器启动时,会触发容器初始化事件, 其contextInitialized方法会被调用,在这个方法中,spring会初始 化一个启动上下文,这个上下文被称为根上下文,即WebApplicationContext; ③ 监听器初始化完毕后,开始初始化web.xml中配置的Servlet。
2、Spring中的几种设计模式? ① 单例模式: spring的配置文件中设置bean默认为单例模式, spring中有两种代理方式,若目标对象实现了若干接口,spring使用jdk的类代理, 没有实现任何接口,spring使用CGLIB库生成目标类的子类; ② 模板方式模式——用来解决代码重复的问题。比如:RestTemplate, 当我们从服务消费端去调用服务提供者的服务的时候,使用了RestTemplate; ③ 前端控制器模式——spring提供了前端控制器DispatherServlet来对请求进行分发; ④ 试图帮助(view helper)——spring提供了一系列的JSP标签,高效宏来帮助将分散的代码整合在试图中; ⑤ 依赖注入——贯穿于BeanFactory/ApplacationContext 接口的核心理念; ⑥ 工厂模式——在工厂模式中, 通过使用同一个接口来指向新创建的对象。Spring中使用beanFactory来创建对象的实例。
3、bean的生命周期? 单例对象:scope="singleton",一个应用只有一个对象的实例。它的作用范围就是整个应用。 生命周期: 对象出生:当应用加载,创建容器时,对象就被创建了。 对象活着:只要容器在,对象一直活着。 对象死亡:当应用卸载,销毁容器时,对象就被销毁了。 多例对象:scope="prototype",每次访问对象时,都会重新创建对象实例。 3.1、BeanFactory和FactoryBean的区别? BeanFactory是IOC最基本的容器,负责生产和管理bean,它为其他具体的IOC容器提供了最基本的规范,FactoryBean是一个接口,当在IOC容器中的Bean实现了FactoryBean后,通过getBean(String BeanName)获取到的Bean对象.( 并不是FactoryBean的实现类对象,而是这个实现类中的getObject()方法返回的对象。)
4、Spring的常用注解 注解装配在 spring 中默认是关闭的。必须在 Spring 配置文件中配置 <context:annotation-config/>元素,开启注解装配。
一、用于装配Bean的注解 @Component(value=”xxx”): 把资源让spring来管理。相当于在xml中配置一个bean。value可以省略,value的属性值作为bean的id; @Component的三个衍生注解: @Controller(value=”xxx”):一般用于将表现层装配到容器中,使用方法和@Componet一样; @Service(value=”xxx”):一般用于将业务层装配到容器中,使用方法和@Component一样; @Repository(value=”xxx”):一般用于将持久层装配到容器中,使用方法和@Component一样。 二、用于属性注入的注解 @Autowired:只能按照bean类型注入,如果有多个类型匹配,默认将属性名称作为id去容器中查找; @Qualifier:一般和@Autowired配合使用,用来注入指定id的bean,做方法的参数中可以独立使用; @Resource:用来注入指定id的bean类型,相当于@Autowired+@Qualifier; @Value:只能注入基本类型等数据,不能注入bean类型,可以使用${}在资源文件中获取数据,前提是,外部资源文件被加载。 三、作用域 @Scope:用于指定bean的作用域,一般就是singleton和prototype 四、生命周期相关的 @PostConstruct:用于指定某一个方法为初始化方法; @PreDestroy:用于指定某一个方法为销毁方法。 五、其他配置类相关的 @Configuration:声明一个类为配置类,用于替代applicationContext.xml的; @ComponentScan:用于开启注解扫描的包; @Import:用于导入其他类的; @PropertySource:用于加载外部资源文件的; @Bean:用于将方法返回的bean类型的对象装配到容器中。 六、Junit相关的 @RunWith:用于加载配置文件,初始化spring容器的; @ContextConfiguration:用于指定配置文件或者配置类的。
5、spring的事务传播特性? ① PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启; ② PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行; ③ PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常; ④ PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起; ⑤ PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务; ⑥ PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常; ⑦ PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。
6、HTTP/1.1与HTTP/1.0的区别? ① 可扩展性: HTTP/1.1 在消息中增加版本号和OPTIONS方法, 它用于获取当前URL所支持的方法。若请求成功,则它会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET, POST”; ② 缓存: HTTP/1.1 在 1.0 的基础上加入了一些 cache 的新特性; ③ 带宽优化: HTTP/1.1中在请求消息中引入了range头域,它允许只请求资源的某个部分; ④ 长连接: 在一个TCP连接上可以传送多个 HTTP 请求和响应,减少了建立和关闭连接的消耗和延迟。 6.1、HTTP与HTTPS有什么区别? HTTP是一个客户端和服务器端请求和应答的标准, HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层区别主要如下: ① https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用; ② http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议; ③ http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443; ④ http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
7、http常见的状态码有哪些? 200 OK //客户端请求成功; 301 Moved Permanently(永久移除),请求的URL已移走。Response中应该包含一个Location URL, 说明资源现在所处的位置 ; 302 found //重定向; 400 Bad Request //客户端请求有语法错误,不能被服务器所理解; 401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用; 403 Forbidden //服务器收到请求,但是拒绝提供服务; 404 Not Found //请求资源不存在,eg:输入了错误的URL; 500 Internal Server Error //服务器发生不可预期的错误; 503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常;
8、Mybatis的编程步骤是什么样的? ① 创建SqlSessionFactory ② 通过SqlSessionFactory创建SqlSession ③ 通过sqlsession执行数据库操作 ④ 调用session.commit()提交事务 ⑤ 调用session.close()关闭会话
9、Redis的持久化? ①RDB 持久化:该机制可以在指定的时间间隔内生成数据集的时间点快照, 非常适合用于进行备份, 可以最大化 Redis 的性能; ②AOF 持久化:记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集,使用 AOF 持久化会让 Redis 变得非常耐久, 对于相同数量的数据集而言,AOF文件通常要大于RDB文件, AOF在运行效率上往往会慢于RDB; ③无持久化:让数据只在服务器运行时存在。 两者的区别: RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。 AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。 9.1、Redis有哪几种数据结构? String——字符串,hash(键值对),list(列表),set(集合),zset(有序集合) 9.2、Redis常见的性能问题都有哪些?如何解决? (1)Master写内存快照, 会阻塞主线程的工作; (2)Master AOF持久化,如果不重写AOF文件,AOF文件过大会影响Master重启的恢复速度; (3)Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源; (4)Redis 主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave 和 Master 最好在同一个局域网内。 9.3、redis存满之后的解决方案? ① 增加内存,因为redis是基于内存的k-v键值对存储的,内存越大,可存储的数据越多; ② 使用内存淘汰策略: 修改redis.conf中maxmemory-policy选项,设置删除redis键的淘汰规则, redis中并不会准确的删除所有键中最近最少使用的键,而是随机抽取3个键,删除这三个键中最近最少使用的键; ③ 集群:设置redis主从,避免redis单点故障,构建读写分离架构,满足读多写少的应用场景, 即使有了主从复制,每个数据库都要保存整个集群中的所有数据,容易形成木桶效应, 这时要用到分片集群,所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.,客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
10、数据库的分库分表? 当数据比较大的时候,对数据进行分表操作,首先要确定需要将数据平均分配到多少张表中,也就是:表容量。 10.1、用户中心数据库切分方法|范围法 以用户中心的业务uid为划分依据,将数据水平切分到两个数据库实例上去,user_db1存储0到1千万的uid数据,user_db2存储1到2千万的数据切分策略简单,扩容简单,数据量和请求量不均匀 10.2、用户中心数据库切分方法|哈希法 以用户中心的业务uid为划分依据,将数据水平切分到两个数据库实例上去, user_db1存储uid%2=0的数据,user_db2存储uid%2=1的数据 切分策略简单,数据量和请求量均匀,扩容麻烦,增加一个库需要重新hash。 垂直分库就是根据业务耦合性,将关联度低的不同表存储在不同的数据库。做法与大系统拆分为多个小系统类似,按业务分类进行独立划分。与"微服务治理"的做法相似,每个微服务使用单独的一个数据库。
|