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文件恢复数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值