Spring相关问题汇总
1、Spring的Bean的作用域
作用域限定了Spring Bean的作用范围。配置bean的作用域的代码如下
<bean id="..." class="...." scope="singleton">
</bean>
- 1、singleton-单例(默认)
使用该属性定义Bean时,IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例。 - 2、prototype-多例
使用该属性定义bean时,IOC容器可以创建多个bean实例,每次返回的都是一个新的实例。 - 3、request
该属性仅对HTTP请求产生作用,使用该属性定义bean时,每次HTTP请求都会创建一个新的bean,适用于WebApplicationContext环境。 - 4、session
该属性仅用于HTTP Session,同一个session共享一个bean实例,不同session使用不同的实例。 - 5、global-session
该属性仅用于HTTP Session,用session作用域不同的是,所有的session共享一个bean实例。
2、Spring Bean的生命周期
todo
3、SpringMVC的流程或原理
1、DispatcherServlet
主控制器,所有SpringMVC请求首先进入Dispatcherservlet,实例化Spring容器对象,然后调用HandlerMapping。
2、HandlerMapping
处理器映射,负责维护请求URL和Controller之间的映射关系,根据请求找到对应的controller进行处理。
3、XXXController
业务控制器。调用service,Mapper等处理逻辑。
4、ViewResolver
视图解析器。解析controller返回的结果,定位视图jsp组件,进行展示。
4、Spring中拦截器的使用
1、编写拦截器,实现HandlerInterCeptor接口,实现约定的三个方法。
public class MyInterceptor implements HandlerInterceptor {
//在方法处理前执行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("方法执行前执行");
return false;
}
//在方法处理后执行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("方法执行后执行");
}
//在视图生成后执行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("视图生成后执行");
}
}
2、拦截器配置规则
<!--配置拦截器,指定要拦截的资源-->
<mvc:interceptors>
<mvc:interceptor>
<!--path 指定要拦截的资源地址 **表示当前路径及子路径-->
<mvc:mapping path="/**"/>
<!--表示不拦截的资源-->
<mvc:exclude-mapping path="/test/**"/>
<bean class="com.hujunjie.web.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
5、Spring AOP结构
将通用业务和传统业务隔离,通过AOP配置实现功能叠加效果。
1、Aspect(切面)
指封装了通用业务逻辑,可以切入到其他目标组件方法上。
2、PointCut(切入点)
是一个表达式,用于指定被切的目标组件和方法。
- 方法限定表达式
execution(修饰符 返回类型 方法名(参数列表) 抛出异常)
```java
// 所有以load开头的方法
execution(* load*(..)) // ..指代参数可有可无
// 包下及包中所有类所有方法被切入
execution(* cn.xdl.web.controller..*.*(..))
- 类型限定表达式
within(包名.类名)
// 包下所有类所有方法被切入
within(cn.xdl.controller.*)
// 包下以及子包下所有方法被切入
within(cn.xdl.controller..*)
3、Advice(通知)
指切入的时机,比如方法调用前、调用后等。
try{
@Around 环绕通知前置部分
@Before 前置通知
// 执行目标组件方法
@AfterReturning 后置通知
环绕通知后置部分
}catch(){
@AfterThrowing 异常通知
}finally{
@After 最终通知
}
AOP原理:
在使用AOP之后,Spring容器返回的组件对象是采用动态代理技术生成的动态代理对象(是原有组件的子类),动态代理对象将原有组件方法进行了重写,在重写的方法中调用切面追加的功能和原有组件的功能
6、Spring中的动态代理技术
Spring中的动态代理技术有cglib和java api proxy两种模式。
- CGLIB技术:采用子类模式生成动态代理对象,默认目标组件没有接口采用。
- Proxy技术:采用接口模式生成动态代理对象,默认目标组件有接口采用。
在使用中,可以追加proxy-target-class=“true”强制采用cglib模式,建议使用,更安全些。
<aop:aspect-autoProxy proxy-target-class="true" />
7、Mybatis
1、创建SqlSessionFactoryBuilder对象,调用build方法读取mybatis-config.xml配置文件,返回SqlSessionFactory对象
2、由SQLSessionFactory创建SQLSession对象
3、通过SqlSession实例获得Mapper对象,并运行Mapper中的sql语句,返回封装结构。
public static void main(String[] args) {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = factory.openSession();
//获得接口对象,调用接口中的方法。
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> list = mapper.getUserByName("tom");
}
Mybatis作用:
- 封装了获取连接,执行sql,释放连接过程
- 封装了将ResultSet结果映射成实体对象过程
- 封装了将实体对象映射到SQL参数过程
- 封装了多表关联查询的对象映射
- 封装了动态SQL技术,分页查询,缓存等功能
#{}和${}区别:
- #{}采用SQL预编译机制执行(PreparedStatement),${}是非预编译(Statement)
- #{}可以预防SQL注入,尽量使用#{}
Mybatis中的分页:
使用PageHelper插件
1、引入PageHelper
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>1.2.15</version>
</dependency>
2、在配置文件中添加plugin
<configuration>
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
</plugin>
</plugins>
</configuration>
3、使用
设置PageHelper参数,执行查询第几页,一页多少条
Page page = PageHelper.startPage(1,5);
// 只对后面第一个查询有效
List lsit = userDao.findPage();
8、Redis持久化机制
- RDB模式
又称为快照模式。按照配置指定的固定频率拍照,也可以使用save命令。
save 900 1 // 15分钟改变一次
RDB最快一分钟备份一次,数据会有丢失现象,恢复速度快,默认开启。 - AOF模式
又称为日志模式。将执行的每一个命令(除了查询命令)都保存到aof文件中,然后将来可以根据aof文件恢复数据。