3.bean的生命周期
1.bean实例化
2.bean属性注入
3.调用BeanNameAware的setBeanName()方法
4.调用BeanFactoryAware的setBeanFactory()方法
5.调用ApplicationContextAware的setAppliactionContext()方法
6.调用BeanPostProcessor的预初始化方法
7.调用InitializingBean的afterPropertiesSet()方法
8.调用自定义初始化方法
9.调用BeanPostProcessor的初始化后方法
10.bean可以使用
11.调用DisposableBean的destory()方法
12.调用自定义销毁方法
13.结束
//解释
1.Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化
2.Bean实例化后对将Bean的引入和值注入到Bean的属性中
3.如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法
4.如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
5.如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。
6.如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。
7.如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用
8.如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。
9.此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。
10.如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。
4.springmvc框架运行流程
1.用户将请求发送至DispatcherServlet;
2.DispatcherServlet收到请求查询一个或多个HandlerMapping,找到处理该请求的Handler;
3.HandlerMapping根据请求找到相应的Handler,生成Handler对象返回给DispatcherServlet;
4.DispatcherServlet通过HandlerAdapter调用Handler;
5.Handler(Controller)调用业务逻辑(service)进行处理,处理完成返回ModelAndView;
6.HandlerAdapter将Handler处理结果ModelAndView返回给DispatcherServlet;
7.DispatcherServlet查询一个或多个ViewReslover(视图解析器),将ModelAndView传给指定的ViewReslover;
8.ViewReslover解析后返回具体View给DispatcherServlet;
9.DispatcherServlet对View进行渲染(将模型数据填充至视图中);
10.DispatcherServlet响应用户,View将结果显示在客户端。
5.redis当做缓存时,容易遇见的三种问题:
(1).击穿
(2).穿透
(3).雪崩
6.MySQL数据库怎么调优
1、选取最适用的字段属性
1) 使用enum而不是varchar。实际上,enum保存的是tinyint类型,但其显示为字符串。用这个字段来作一些选项列表就变得很合适了。比如你有一个字段,比如“性别”、“状态”或“所属部门”等,你知道这些字段的值是固定且有限的,那么可以考虑使用enum。
2) 尽量把字段设置为NOTNULL,这样在将来执行查询的时候,数据库不用去比较NULL值。
2、优化SQL语句
1)当只需要一条数据时使用LIMIT 1.我们作为开发者,是能够知道我们需要的数据的条数的,若已经知道结果只有一条的时候,一定要使用limit 1 ,这样一来,MySQL在查询到一条数据之后,会立即停止搜索,这会带来性能上的提升。
2)任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,
然后这样查询:
select id from t where num=0
select id from t where num=10 or num=20
3、建立合适的索引。上面说到了其实表的主键就是一种索引。如果某个字段你总要拿来做搜索条件的话,那么为它建立索引吧。这里的原理是,普通的字段建立了索引,索引树的子节点其实是主键,也就是说搜索的时候,先通过普通索引找到主键,再通过主键去查找表中的数据(这个过程叫做回表)。必要的时候,我们还可以建立覆盖索引,比如,需要通过身份证去查询姓名的这个查询很频繁,我们可以建立覆盖索引,也就是对身份证和姓名建立索引,如(idcard,name),这样的话,在索引树中不仅仅有对应的id,还有该行对应的name的值,此时就不需要根据id进行回表操作了。并且建立覆盖索引时需要注意一些原则,比如我现在数据库里只有一个主键索引,身份证姓名索引,此时我们还有一个查询——通过身份证查找地址,但是这个查询并不是很频繁,此时需不需要建立(idcard,address)这个覆盖索引呢?我们需要知道的是,建立索引是会占据表的磁盘空间的,并不是没有任何消耗的。其实这个是没必要的,因为建立了(idcard,name)这个覆盖索引之后,就不用再建立idcard这个索引了。建立覆盖索引需要注意索引的顺序,如果通过建立覆盖索引可以少维护一个索引的话,这个顺序可以优先考虑。另一个就是空间的问题了。比如(name,age)索引,name是比age要大的,索引可以考虑一个(name,age),一个(age)。还有一点需要知道:加了索引是会影响对于数据库写操作的性能的。原因是:数据库需要维护索引树的正确的状态,增加数据就会改变原来的结构,这个过程会带来性能的损耗。但是,不要以为建立索引,就可以为所欲为。其中有一些常用的规则需要去遵循以下的。
面试问题: 做过数据库优化吗?大数据量基础过吗?系统反应慢怎么查询?
这时候就需要你谈一下sql优化相关的内容 以下几个方面:
1、慢查询
2、索引
MYSQL的慢查询日志是Mysql提供的一种日志记录方式,它主要是用来记录mysql执行语句过程中,响应时间超过阀值的语句,这个阀值可以通过long_query_time去指定,比如说如果我们将long_query_time指定为5,则意思执行耗时5秒以上的语句都会被我们的慢查询日志给记录下来.
通过使用慢查询日志,我们可以先捕获耗时的语句,然后再结合explain执行计划进行全面的分析,从而达到优化的目的。默认情况下,mysql数据库并没有开启慢查询日志,因为开启慢查询日志记录本身就需要消耗数据库服务器性能,需要我们手动来开启,如果不是专门做优化的话,不建议开启慢查询日志
7.MySQL的索引种类
一、简介
MySQL目前主要有以下几种索引类型:
1.普通索引
2.唯一索引
3.主键索引
4.组合索引
5.全文索引
二、语句
CREATE TABLE table_name[col_name data type]
[unique|fulltext][index|key][index_name](col_name[length])[asc|desc]
1.unique|fulltext为可选参数,分别表示唯一索引、全文索引
2.index和key为同义词,两者作用相同,用来指定创建索引
3.col_name为需要创建索引的字段列,该列必须从数据表中该定义的多个列中选择
4.index_name指定索引的名称,为可选参数,如果不指定,默认col_name为索引值
5.length为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度
6.asc或desc指定升序或降序的索引值存储
三、索引类型
1.普通索引
是最基本的索引,它没有任何限制。它有以下几种创建方式:
(1)直接创建索引
CREATE INDEX index_name ON table(column(length))
(2)修改表结构的方式添加索引
ALTER TABLE table_name ADD INDEX index_name ON (column(length))
(3)创建表的时候同时创建索引
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) CHARACTER NOT NULL ,
`content` text CHARACTER NULL ,
`time` int(10) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
INDEX index_name (title(length))
)
(4)删除索引
DROP INDEX index_name ON table
2.唯一索引
与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
(1)创建唯一索引
CREATE UNIQUE INDEX indexName ON table(column(length))
(2)修改表结构
ALTER TABLE table_name ADD UNIQUE indexName ON (column(length))
(3)创建表的时候直接指定
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) CHARACTER NOT NULL ,
`content` text CHARACTER NULL ,
`time` int(10) NULL DEFAULT NULL ,
UNIQUE indexName (title(length))
);
3.主键索引
是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引:
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) NOT NULL ,
PRIMARY KEY (`id`)
);
4.组合索引
指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合
ALTER TABLE `table` ADD INDEX name_city_age (name,city,age);
5.全文索引
主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。fulltext索引配合match against操作使用,而不是一般的where语句加like。它可以在create table,alter table ,create index使用,不过目前只有char、varchar,text 列上可以创建全文索引。值得一提的是,在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE index创建fulltext索引,要比先为一张表建立fulltext然后再将数据写入的速度快很多。
(1)创建表的适合添加全文索引
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) CHARACTER NOT NULL ,
`content` text CHARACTER NULL ,
`time` int(10) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
FULLTEXT (content)
);
(2)修改表结构添加全文索引
ALTER TABLE article ADD FULLTEXT index_content(content)
(3)直接创建索引
CREATE FULLTEXT INDEX index_content ON article(content)
四、缺点
1.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行insert、update和delete。因为更新表时,不仅要保存数据,还要保存一下索引文件。
2.建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会增长很快。
索引只是提高效率的一个因素,如果有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。
五、注意事项
使用索引时,有以下一些技巧和注意事项:
1.索引不会包含有null值的列
只要列中包含有null值都将不会被包含在索引中,复合索引中只要有一列含有null值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为null。
2.使用短索引
对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个char(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
3.索引列排序
查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
4.like语句操作
一般情况下不推荐使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
5.不要在列上进行运算
这将导致索引失效而进行全表扫描,例如
SELECT * FROM table_name WHERE YEAR(column_name)<2017;
6.不使用not in和<>操作
8.谈谈你对spring的理解
1、IOC做什么
答:帮助我们管理bean、生产bean、管理bean与bean之间的依赖关系。
2、AOP做什么
答:面相切面编程,使用动态代理机制;
动态代理中:
jdk动态代理:
传入被代理对象返回代理对象,调用被代理对象中任何一个方法时,可以在其前后加上动作;(被代理对象必须实现接口)
cglib动态代理:
传入被代理对象返回代理对象,代理对象是被代理对象的子类,调用被代理对象中任何一个方法时,可以在其前后加上动作;(被代理对象可以不实现接口)
根据AOP中对于切面、切入点、通知、连接点,可以完成对具体一个package下的类进行拦截管理;
3、在你使用的框架中起到了一个什么作用
答:项目在启动时会去加载web.xml,根据xml之中配置内容进行加载,先去加载spring配置文件;根据spring-ioc,加载数据源或的数据信息,
根据SqlSessionFactoryBean向其内部注入数据源配置信息、mybatis配置信息(实体类地址)、映射文件地址,创建出sqlsessionfactory,使用IOCbean与bean之间依赖关系进行注入(ref),通过MapperScannerConfigurer对映射接口与映射文件进行绑定(映射接口在注入过程是通过MapperProxy进行实现的,FactoryBean完成注入和实例化,当调用映射接口时实际调用的是MapperProxy进行操作,调用的是映射文件中的namespace地址下的标签中的id,sqlsession同时在这时创建的),通过管理数据库事务,创建事务管理器(transactionManager),使用springAOP对事务进行管理,通过切点表达式与通知关联,定义需要开启事务的切面(package)和开启的方法名前缀(advice通知),事务的传播(REQUIRED),回滚机制(Throwable),并且开启事务的注解支持