Sping进阶

目录

一、Sping复习

1、概述

Spring是一个轻量级Java开源工具,它是为了解决企业应用开发的复杂性而创建的,即简化Java开发。

  • 优点:sping是一个轻量级的,非侵入式的,IOC,AOP,一站式的,简化企业级开发而生的。核心包非常小。
    业务代码中不侵入框架代码;
    IOC:控制反转,将生成对象的权利反转给了spring框架,依赖注入DI为属性注入值
    AOP:面向切面编程,将一些与业务代码无关的公共部分抽取出来,使用时,通过代理对象调用,从而达到不修改源代码的基础上增加功能。代码的耦合度降低。
    一站式框架:数据持久层,web控制层…

2、如何搭建

  1. 创建spring配置文件,sping.xml文件
  2. 在sping.xml文件中配置,需要让sping管理的类,
  3. spring框架读取xml文件,解析xml
  4. 通过工厂模式 + 反射机制 创建对象 + 代理模式
  5. 在需要使用对象时,从spring容器注入对象即可

3.spring中常用的注解标签

@Component(value=“user”)
@Service
@Repository
以上注解都可以实现创建对象功能,只是为了后续扩展功能,在不同的层
使用不同的注解标记
@Scope(value=“prototype”) 原型
@Scope(value=“ singleton ”) 单例

4.spring+jdbc

jdbcTemplate 管理数据源(阿里巴巴Druid)事务管理
事务管理的最基本的原理是使用AOP,声明式事务和编程式事务,

  1. 事务传播行为,是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

springMVC详细链接
Sping进阶

二、sping进阶

1、BeanFactory 和 ApplicationContext

new User( )创建了一个User对象,把由sping框架创建的对象称为一个bean。
2. BeanFactory 接口是spring 框架中最基础的接口,定义了如何获取bean的方法。
3. ApplicationContext接口间接的继承了BeanFactory接口,在此基础之上扩展功能。

(1)BeanFactory 和ApplicationContext

  1. BeanFactory 是最基础的,面向spring框架本身的 。在使用对象时才去创建。
  2. ApplicationContext 是面向应用的,增加了功能(支持AOP事务),适合于web应用程序,在服务器启动时就创建。

2、SpringBean的生命周期

一个对象什么时候生(创建),什么时候销毁?

  • spring中的bean可能经过5个阶段:
  1. 实例化 : 创建一个原始的对象,例如new对象,通过反射机制实现的(可以读到类名)
  2. 属性赋值 : UserService 注入UserDao userDao;为对象的属性进行赋值
  3. 初始化 :最早在Servlet 先创建一个对象,然后调用init()进行初始化,我们的bean如果实现来某些接口,就可以去执行这些方法,用来初始化我们的对象重点在于对类进行功能提升。
  4. 将 bean 对象放入到容器中,使用
  5. 销毁

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; //不存储数据,是无状态的,安全的
}

  1. 6.原型bean是线程安全的

4、Bean循环依赖

Sping进阶
此情况只在spring中出现,因为spring创建对象时,可以为属性自动注入值,注入时就需要查找所依赖的对象。

  • 解决方法:
  1. 在spring中提供一个3级缓存机制,每一个缓存可以理解为一个map容器(把不同的对象做一个临时存储)
  2. 一级缓存:存放创建,初始化完成的完整的bean
  3. 二级缓存:存储原始的对象
  4. 三级缓存:假如B类如果需要增强的功能,那么把这个半成品的B对象继续放在3级缓存中去增强功能。

5、Servlet的过滤器与Spring拦截器区别

(1)区别主要在底层实现方式有所不同:

  • Servlet过滤器:过滤器实现是依赖于tomcat,请求会先到达过滤器,然后进入Servlet。

  • Spring 拦截器:是框架内部封装的,请求是先到达servlet,根据映射地址,去匹配拦截器,最终到达控制器。
    Sping进阶

上一篇:【Spring源码解读】SpringAOP源码


下一篇:002SpringIOC002基于XML文件配置Bean