Spring是什么?有哪些优点?
1.Spring是一个轻量级的开源框架
说是轻量级那肯定有重量级的说法,这里说的轻量级是指首先Spring占空间极小,只有2MB,
2.Spring的两大核心技术IOC和AOP
ioc:即控制反转,控制反转的意思就是把newJava对象的权力交给spring,在之前的ssh项目中写的application-biz中写的bean节点,spring通过bean节点中的信息通过反射来生成对象,我们手动new对象就类似于人类社会的手工时代生产一个东西,而spring工厂产生对象就像工厂时代生产一个东西。并且spring底层对bean的创建都是使用的单例模式,这样就不会产生大量重复调用一个方法而产生大量的重复的对象,就比如没有使用spring依赖注入的jsp+servlet的项目大量的访问就会产生大量的**dao的对象。
spring的注入方式有哪些?
setter注入
<bean id="person" class="com.wl.Person">
<!--
使用property标签注入属性值
name:类属性名称
value属性:往属性中注入的值
-->
<property name="username" value="哈哈哈"></property>
</bean>
构造注入
<!-- 注册userService -->
<bean id="userService" class="com.lyu.spring.service.impl.UserService">
<constructor-arg name="userDao" ref="userDaoJdbc"></constructor-arg>
<constructor-arg name="user" ref="user"></constructor-arg>
</bean>
<!-- 注册实体User类,用于测试 -->
<bean id="user" class="com.lyu.spring.entity.User"></bean>
<!-- 注册jdbc实现的dao -->
<bean id="userDaoJdbc" class="com.lyu.spring.dao.impl.UserDaoJdbc"></bean>
接口注入
aop:即面向切面,在一般的ssh项目和ssm项目中aop最常用的用途就是事务管理和日志管理,就比如项目中的一个用户模块的添加需要调用数据库添加操作,删除需要调用数据库的删除语句,需要在操作前开启事务,操作后提交事务,所有的对象在进行数据库操作时都要进行进行事务操作,这样就形成一个切面,由添加操作,删除操作这些切点变成配置文件中add*,update*,delete*这样的线,然后所有的对象进行数据库操作形成事务切面,日志管理就是在一个用户登陆系统开始记录所有操作的信息,比如删了什么东西,什么时候登陆的等等,需要使用到面向切面编程。面向切面的本质就是拦截器。
我理解的切面的定义:切面就是与业务代码关系不大,但是却对多个对象能产生影响的公共代码,就可以将其拿出配置成切面。
3.spring能够集成其他很多的框架
就比如ssh ssm,这些都是通过spring进行集成,其他还有shiro,Quartz
SpringMVC与Struts2的区别
1.是否为侵入式
springMVC是非侵入式的,不需要继承或者实现,只需要提供注解,而Struts2需要继承SupperAction或者不继承
2.框架入口
SpringMVC的入口是Dispatcherservlet,而Struts2的入口是struts2准备并且执行过滤器
3.效率
SpringMVC的使用是基于注解开发,Struts2是基于配置开发,但是在搞完Struts2之后也了解到Strust2也可以使用注解,springMVC的访问可以直接访问到方法,而Struts2则需要到配置文件先配置类的访问路径再配置方法的访问路径,所以SpringMVC的速度更加快,Struts2提供的s标签比SpringMVC提供的from标签的使用场景更加全面
Mybatis与Hibernate的区别
Mybatis和Hibernate都是基于orm的框架
效率:
Hibernate是完全封装的orm框架,基本不需要手写sql语句,sql语句被封装,可以直接使用,开发可以更加注重业务代码,而Mybatis属于半自动的框架,需要自己编写SQL代码,但是对与比较庞大的系统,关系比较复杂的系统,Hibernate则会查出许多的多余的数据,从而浪费性能。
SQL优化方面:
Hibernate完全封装,能够自动生成完整的SQL语句,sql优化比较困难,但是也可以通过传入原生的sql代码来进行操作,但是这样就失去了使用Hibernate的意义,而Mybatis则是自己手写SQL,比较易于sql优化,能够减少不必要的性能损耗,Mybatis需要自己管理映射关系,而Hibernate是完整的orm框架,只需要管理对象关系就能维持数据库表关系
关于MyBatis防止sql注入
#{}是经过预编译的,是安全的;${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入
关于缓存
一级缓存
Hibernate和Mybatis的一级缓存都是默认开启的,Mybatis的一级缓存是存在与sqlSession层,使用同一个sqlSession进行同一个查询时就会使用到一级缓存,而Hibernate时存在于Session层
Hibernate和Mybatis的二级缓存都是需要手动开启的
Mybatis的二级缓存在SqlSessionFactory层面给各个SqlSession 对象共享
<cache/>
需要手动配置 比如:
<cache eviction="LRU" flushInterval="100000" size="1024" readOnly="true"/>
如果一条语句每次都需要最新的数据,就意味着每次都需要从数据库中查询数据,可以把这个属性设置为false,如:
<select id="selectAll" resultMap="BaseResultMap" useCache="false">
刷新缓存(就是清空缓存)
二级缓存默认会在insert、update、delete操作后刷新缓存,可以手动配置不更新缓存,如下:
<update id="updateById" parameterType="User" flushCache="false" />