目录
一、Sping复习
1、概述
Spring是一个轻量级Java开源工具,它是为了解决企业应用开发的复杂性而创建的,即简化Java开发。
- 优点:sping是一个轻量级的,非侵入式的,IOC,AOP,一站式的,简化企业级开发而生的。核心包非常小。
业务代码中不侵入框架代码;
IOC:控制反转,将生成对象的权利反转给了spring框架,依赖注入DI为属性注入值
AOP:面向切面编程,将一些与业务代码无关的公共部分抽取出来,使用时,通过代理对象调用,从而达到不修改源代码的基础上增加功能。代码的耦合度降低。
一站式框架:数据持久层,web控制层…
2、如何搭建
- 创建spring配置文件,sping.xml文件
- 在sping.xml文件中配置,需要让sping管理的类,
- spring框架读取xml文件,解析xml
- 通过工厂模式 + 反射机制 创建对象 + 代理模式
- 在需要使用对象时,从spring容器注入对象即可
3.spring中常用的注解标签
@Component(value=“user”)
@Service
@Repository
以上注解都可以实现创建对象功能,只是为了后续扩展功能,在不同的层
使用不同的注解标记
@Scope(value=“prototype”) 原型
@Scope(value=“ singleton ”) 单例
4.spring+jdbc
jdbcTemplate 管理数据源(阿里巴巴Druid)事务管理
事务管理的最基本的原理是使用AOP,声明式事务和编程式事务,
- 事务传播行为,是spring 框架自身对事物进行功能上的增强,
5、spring 集成 mybatis
Spring 集成 Mybatis 其核心是将 SqlSessionFactory 交由 Spring 管理,并由
Spring 管理对 dao 接口的代理实现。
导入mybatis jar包
(1)Spring结合mybatis插件包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency
(2)配置sqlSessionFactory
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="mybatis-config.xml"></property>
<property name="mapperLocations" value="com/ff/*Mapper.xml">
</property>
</bean>
(3)指定生成接口代理
<bean id="mapperFactory"
class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ff.ssm.dao"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory">
</property>
</bean
(4)在service中注入Dao代理接口,此接口有Spring代理实现
@Autowired
DeptDao deptDao;
6、spingMVC
二、sping进阶
1、BeanFactory 和 ApplicationContext
new User( )创建了一个User对象,把由sping框架创建的对象称为一个bean。
2. BeanFactory 接口是spring 框架中最基础的接口,定义了如何获取bean的方法。
3. ApplicationContext接口间接的继承了BeanFactory接口,在此基础之上扩展功能。
(1)BeanFactory 和ApplicationContext
- BeanFactory 是最基础的,面向spring框架本身的 。在使用对象时才去创建。
- ApplicationContext 是面向应用的,增加了功能(支持AOP事务),适合于web应用程序,在服务器启动时就创建。
2、SpringBean的生命周期
一个对象什么时候生(创建),什么时候销毁?
- spring中的bean可能经过5个阶段:
- 实例化 : 创建一个原始的对象,例如new对象,通过反射机制实现的(可以读到类名)
- 属性赋值 : UserService 注入UserDao userDao;为对象的属性进行赋值
- 初始化 :最早在Servlet 先创建一个对象,然后调用init()进行初始化,我们的bean如果实现来某些接口,就可以去执行这些方法,用来初始化我们的对象重点在于对类进行功能提升。
- 将 bean 对象放入到容器中,使用
- 销毁
3、Spring中的bean是线程安全的吗?
-
1.servlet是线程安全的吗? servlet是线程不安全的
-
2.servlet是单例的还是多例的? 是单例的,在服务器启动时由服务器创建,只创建来一个。
-
3、单例bean和单原型bean
class UserController{
User user; //单例bean 把一次请求看做是一个线程,很多个请求,那就是多个线程。多个线程共享一个
//原型bean 是每次使用时,会创建一个对象,不共享 ,是线程安全
UserService userService;
} -
4.单例bean是线程不安全的,单例bean,多个线程共享同一个。
-
5.单例bean分为:
-
(1) 有状态bean,这个变量可以存储数据。
-
(2) 无状态bean ,不存储数据的bean
-
假设UserController ,User , UserService 都是单例的。
class UserController{
User user; //User 作为数据存储的对象,存储对象信息的,是有状态的,不安全的
UserService userService; //不存储数据,是无状态的,安全的
}
- 6.原型bean是线程安全的
4、Bean循环依赖
此情况只在spring中出现,因为spring创建对象时,可以为属性自动注入值,注入时就需要查找所依赖的对象。
- 解决方法:
- 在spring中提供一个3级缓存机制,每一个缓存可以理解为一个map容器(把不同的对象做一个临时存储)
- 一级缓存:存放创建,初始化完成的完整的bean
- 二级缓存:存储原始的对象
- 三级缓存:假如B类如果需要增强的功能,那么把这个半成品的B对象继续放在3级缓存中去增强功能。
5、Servlet的过滤器与Spring拦截器区别
(1)区别主要在底层实现方式有所不同:
-
Servlet过滤器:过滤器实现是依赖于tomcat,请求会先到达过滤器,然后进入Servlet。
-
Spring 拦截器:是框架内部封装的,请求是先到达servlet,根据映射地址,去匹配拦截器,最终到达控制器。