其实java并发的东西还没整理完,昨天只是整理了一小部分,juc下面所有的东西都是重点。今天又接到了几家公司的面试邀请,所以打算,先把广度扩出来,然后再细细深挖。
Spring 的优点?
1.spring属于低耦合,代码污染度低。
2.spring种的di机制将对象之间的依赖关系交给框架处理 ,减少组件的耦合度。
3.spring提供了aop技术,支持一些通用技术,比如安全,事务,日志,权限等集中式管理,从而提供更好的复用。
4.spring对主流应用框架提供了集成支持。
对SpringAop的理解?
Aop称为切面编程,用于将那也与业务逻辑无关,但却对多个对象产生影响的公共行为和逻辑,抽取称为一个可重用的的模块。减少代码的重复度,降低模块之间的耦合度。
Aop是基于动态代理实现的。实现动态代理主要有2种方式:1,JDK动态代理。2,cglib动态代理。
jdk代理只能代理接口,不能代理类。cglib是基于继承实现的,如果父类用final修饰那么就无法代理。
对SpringIOC的理解?
ioc是控制反转,是将对象的创建权反转了,Spring容器根据配置文件去创建实例和管理实例之间的依赖关系。
DI注入:应用程序在运行时依赖IOC容器来注入对象需要的外部资源。
ioc注入方法:1.通过构造器注入。2.setter注入。3.根据注解注入。
实现原理:通过dom4j方法解析xml,将解析出来的对象注册到beanfactory。
Spring中bean的Scope?
1.singleton(单一实例):容器创建时只存在一个单例,从容器定义到第一次被请求而初始化开始,只要容器不销毁或退出。
2.prototype(多例):每次请求都会产生一个新对象给请求方,之后就由这个对象自生自灭。
下面三种知识和web程序:
3.requesrt(特殊多例):每次请求都会产生一个新的对象,当请求结束以后该对象的生命周期结束。
4.session(特殊多例):容器会为每个会话创建一个新的对象。当session结束以后该对象的生命周期结束。
5.gloabal session(特殊多例):只有应用在基于porlet的web应用程序中才有意义,它映射到porlet的global范围的session,如果普通的servlet的web 应用中使用了这个scope,容器会把它作为普通的session的scope对待。
BeanFactory和ApplicationContext有什么区别?
BeanFactory和ApplicationContext都可以做为bean的容器。ApplicationConext时BeanFactory的子接口。
BeanFactory:spring最底层的接口,包括了各种bean的定义,读取bean的配置文件,管理bean的配置,实例化,控制bean的生命周期,维护bean之间的依赖关系。ApplicationContext作为子接口除了原来的功能拓展了好多功能。
1.继承MessageSource,因此支持国际化。
2.统一资源文件的访问格式。
3.提供在监听器中注册多个事件。
4.同时加载多个配置文件。
beanFactory:只有在第一次调用bean的时候才会对该bean进行加载实例化,在启动容器的时候不会加载bean。缺点:无法及时检测出错误。
Application:他是在容器启动时,一次性加载所有的bean。缺点:内存占用比较多,当配置bean多的时候,那么程序启动比较慢。
Spring中Bean的生命周期?
1.实例化bean。
在beanFactory容器中,当客户请求一个尚未初始化的bean的时侯,容器就会调用createbean方法进行实例化。
在applicationConetxt容器中,当容器启动结束后,通过获取BeanDefinition对象中的信息,实例化所有的bean。
2.设置对象属性
实例化的对象被封装在beanWrapper对象中,然后spring根据BeanDefinition的信息以及beanWrapper提供的的设置属性的接口完成依赖注入。
3.处理Aware接口
Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入bean:
4.BeanPostProcessor
如果想对bean进行一些自定义的处理,就可以实现这个接口,那将会调用postProcessBeforeInitialization(Object obj, String s)方法。
5.initalizingBean和init-method方法
如果bean在spring的配置文件上配置了init-method,则会调用其配置的初始化方法。
6.如果实现了beanpostprocessor接口,那么在方法bean初始化结束的时候调用postProcessAfterInitialization(Object obj, String s)方法。
这样一个bean就初始化成功了,可以自己使用。
7.DisposaBean
当bean不在需要的时候,会进入清理阶段,如果实现了DisposableBean这个接口,那么会调用其实现的destory()接口。
8.destory-method方法
如果bean的spring配置了destory-method属性,会自动调用其配置的销毁方法。
Spring的单例bean是线程安全的吗?
Spring框架没有对多线程的封装处理,关于bean的线程安全和并发问题需要开发者自己解决。实际上并没有大部分bean并没有可选状态,在某种程度上是线程安全的。
@Autowired和@Resource之间的区别?
@Autowired是按照类型配置注入的,默认情况下他要求依赖对象必须存在。、
@Resource默认是按照名称来装配注入的,只有找不到与名称匹配的bean才会按照类型。
Spring中事务传播行为?
事务传播主要是事务中嵌套着事务。
主要用的有使用当前事务和开启新的事务。
SpringMVC的执行流程?
https://blog.csdn.net/huaixiaohai_1/article/details/97662301
SpringMVC的优点?
1.支持各种视图技术,不仅仅是jsp
2.与Spring架构集成
3.清晰的角色配置:前端控制器(DispatcherServlet),请求到处理器映射(handlerMapper),处理器适配器(HandlerAdapter),视图解析器(ViewResolver)
4.支持各种请求资源的映射
SpringMVC怎么实现重定向和转发?
1.转发:在返回值前边加上“forward”,比如“forward:user.do”
2.重定向:在返回值前面加上"redirect",比如“redirect:user.do”
重定向与转发的区别?
重定向是2次请求,在重定型的过程中,传输的信息会丢失。
转发是一次请求。
如何解决中文乱码问题?
post乱码:通过在web.xml配置编码拦截器。
get乱码:修改tomcat配置文件编码
Springmvc前端控制器是不是单例的?怎么保证并发安全?
是单例的,使用同步会影响性能,控制器里边不能写字段。
Mybatis中#{}与${}的不同?
#{}是预编译处理,${}是字符串替换
在处理#{}的时候,会将sql中的#{}替换成?,调用PreparedStatement的set方法来赋值。
在处理${}的时候,会将${}替换为字符串
使用#{}能有效地防止sql注入
Mapper接口中的方法能重载吗?为什么?
不能,因为Mapper接口中没有实现类,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可定为唯一一个MapperStatement。在Mybatis中,每一个<select>、<insert>、<update>、<delete>标签,都会被解析为一个MapperStatement对象。
如何获取自动生成的主键值?
insert方法返回一个int类型的值,这个是插入的行数。也可以使用genera什么那个属性,这样会自动注入到你insert的实体类中。
Mybatis延迟加载原理?
延迟加载:提交了sql语句以后不会立马去查询,等到真正用的时候才会去查。
使用cglib创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null,就会单独的发送实现保存好的查询关联B对象的sql,把B查询出来以后调用getName().
Mybatis中的一二级缓存?
一级缓存:基于PerpetualCatch的本地hashmap本地缓存,其存储作用域为Session,当session flush或close以后,该session中所有的缓存失效,默认一级缓存开启。
二级缓存:与一级缓存机制相同,不同的是存储对象为mapper,可以自定义存储位置,默认不开启。