1.对于spring的理解?spring的特性?(ioc,aop)
答:Spring是一个轻量级框架,是为了提高了项目的开发管理与维护。Spring有两个核心模块。一个是IOC,一个是AOP。
IOC: 就是控制反转的意思,指的是我们将对象的控制权从应用代码本身转移到外部容器,主动变被动。通过IOC容器在程序运行期间基于JAVA反射机制
动态的创建对象,配置对象,建立对象之间的依赖关系,管理对象的生命周期。
而DI作为依赖注入,是实现IOC控制反转的一种手段。常见的依赖注入方式有:set方式注入和构造器方式注入。
通过依赖注入在程序运行期间动态的注入依赖对象,建立对象之间的依赖关系,降低对象之间的耦合度。
AOP:面向切面编程,是对面向对象编程的补充。我们将通用的业务功能代码块封装起来作为切面,通过指定切入点,也就是指定切面作用的目标方法,
最后通过不同类型的通知,告诉容器在调用目标方法的什么时机插入切面代码块。像Spring的声明式事物管理就是基于AOP,在程序运行期间,通过动态代理技术
给service层的bean追加事物管理,保证事物的ACID特性。我们可以通过AOP将一些任务单独封装,通过动态代理技术,在不改变原有代码的情况下追加
功能,提高代码的复用和简化编程。
Spring还提供了很多优秀的插件,像springmvc,springjdbc,springorm等等
除此之后spring还可以用来集成其他优秀的框架,像mybatis,hibernate,struts等等。
2.spring是如何去创建对象的?生命周期是怎么样的?
这里可参考文章:https://blog.csdn.net/nwpu_geeker/article/details/79098797
1) 调用无参数构造器
2) 带参数构造器
3) 工厂创建对象
bean生命周期:
scope控制bean的生命周期,scope的取值有5种取值:
在Spring 2.0之前,有singleton和prototype两种;
在Spring 2.0之后增加另外三种:request,session和global session类型,它们只实用于web程序,通常是和XmlWebApplicationContext共同使用。
singleton 默认 单一实例 所有引用这个bean使用的都是一个,由spring控制。只要不销毁或者推出它就一直存在。
prototype 标准 每次引用spring都返回一个新的,这个对象完全属于引用者。一般用来定义不能共享使用的对象类型。
3.创建对象的细节问题
1) 对象创建: 单例/多例
在bean.xml配置文件中,配置scope=”singleton”,为单例创建对象,如果不配置,默认也是单例方式。主要应用于service/dao层还有一些utils工具类等只需要在服务器启动时初始化一次即可。
scope=”prototype”,表示多例方式创建对象,也就是当用户需要使用这个对象时即创建对象,在ssh项目整合中主要应用于Action对象。这种方式一般在服务器启动时不会创建对象,在每次使用才创建。
2) 什么时候创建?上面其实已经说了
scope=”prototype” 在用到对象的时候,才创建对象。(在ioc容器初始化之后)
scope=”singleton” 在服务器启动时候(容器初始化之前), 就已经创建了bean,且整个应用只有一个。
3)是否延迟创建
lazy-init=”false” 默认为false, 不延迟创建,即在启动时候就创建对象
lazy-init=”true” 延迟初始化, 在用到对象的时候才创建对象
(只对单例有效)因为多例本来就是访问对象时才创建。
4) 创建对象之后,初始化/销毁
init-method=”init_user” 【对应对象的init_user方法,在对象创建好之后执行 】
destroy-method=”destroy_user” 【在调用容器对象的destroy方法时候执行,(容器用实现类)】
4.mybatis主要的执行器有哪些?
Mybatis有三种基本的Executor执行器:
SimpleExecutor、ReuseExecutor、BatchExecutor。
SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供下一次使用。简言之,就是重复使用Statement对象。
BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。
作用范围:Executor的这些特点,都严格限制在SqlSession生命周期范围内。
Mybatis中如何指定使用哪一种Executor执行器?
答:在Mybatis配置文件中,可以指定默认的ExecutorType执行器类型,也可以手动给DefaultSqlSessionFactory的创建SqlSession的方法传递ExecutorType类型参数。
5.mybatis中#与$的区别?
1 #是将传入的值当做字符串的形式,eg:select id,name,age from student where id =#{id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id ='1'.
2 $是将传入的数据直接显示生成sql语句,eg:select id,name,age from student where id =${id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id = 1.
3 使用#可以很大程度上防止sql注入。(语句的拼接)
4 但是如果使用在order by 中就需要使用 $.
5 在大多数情况下还是经常使用#,但在不同情况下必须使用$.
我觉得#与的区别最大在于:#{} 传入值时,sql解析时,参数是带引号的,而的区别最大在于:#{} 传入值时,sql解析时,参数是带引号的,而{}穿入值,sql解析时,参数是不带引号的。
一 : 理解mybatis中 $与#
在mybatis中的$与#都是在sql中动态的传入参数。
eg:select id,name,age from student where name=#{name} 这个name是动态的,可变的。当你传入什么样的值,就会根据你传入的值执行sql语句。
二:使用$与#
#{}: 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符 。
${}: 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。
name-->cy
eg: select id,name,age from student where name=#{name} -- name='cy'
select id,name,age from student where name=${name} -- name=cy