一、什么是Spring

1、管理Bean与Bean之间的关系

 

二、Spring环境搭建

1、依赖:spring-core,spring-context,spring-aop

2、配置文件

  当xml中配置相同bean id时,启动报错

 

三、Spring作用域

  singleton、prototype、request,session

 

四、SpringIOC

1、IOC:控制反转

  将Bean交给Spring容器进行管理

2、DI:依赖注入

  解决对象之间的依赖关系

  2.1 set方法注入

    bean中property标签,使用ref依赖对象关系

  2.2 构造函数注入

  2.3 注解

    配置文件中添加组件扫描标签<context:component-scan base-package="package_path"></context:component-scan>

    Autowired:默认使用byType进行装配,想使用名称匹配注入时配合Qualifier注解

    Resource:使用名称匹配注入

3、容器创建对象方式

  调用无参构造器---默认方式

  调用带参构造器

  工厂创建对象

 

五、SpringAOP

1、代理模式

  提供对目标对象的一种访问方式

  静态代理:需要生成代理类

  动态代理:不需要生成代理类,JDK(反射机制)和CgLib(字节码)

2、基础

  面向切面编程,权限控制、事务管理等。在不同的方法中,进行相同的操作。

  关注点:即重复代码

  切面:泛指交叉业务逻辑,即抽取的重复代码

  切入点: 切面具体织入的位置,拦截的哪些方法

3、使用方式

  注解:开启aop注解,<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

  Xml方式:

4、AOP通知类型:

  前置通知:目标方法之前执行   @Before

  后置通知:目标方法之后执行,始终执行 @After

  返回后通知:执行方法结束前执行,异常时不执行,后置通知后执行  @AfterReturning

  异常通知:异常时通知  @AfterThrowing

    全局捕获异常底层实现即使用AOP的异常通知

  环绕通知:环绕目标方法执行,传入ProceedingJoinPoint参数,执行proceed方法,前段在前置通知后,后段在后置通知后,后段通知能被异常通知打断  @Around

    如权限判断,当无权限时,不执行roceedingJoinPoint.proceed()方法

  

 

 

六、Spring事务

1、事务

  保证数据的一致性

  事务的特性:ACID-Atomicity,Consistency,Isolation,Durability(持久性)

2、Spring事务

  2.1 分类

    编程式事务:

    声明式事务:@Transactional

3、编程式事务

  3.1 获取数据源的api,通过api调用begin、commit、rollback

  3.2 配置文件

    <!-- 开启注解 -->
      <context:component-scan base-package="com.dy.programmingtransaction"></context:component-scan>
    <!-- 1. 数据源对象: C3P0连接池 -->
      <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://192.168.236.128:3306/test"></property>
        <property name="user" value="root"></property>
        <property name="password" value="19919123"></property>
      </bean>

    <!-- 2. JdbcTemplate工具类实例 -->
      <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
      </bean>

    <!-- 配置事务 -->
      <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
      </bean>\

  3.3 编程式事务编写

    

 

 

 

4、声明式事务

  使用AOP中的Around和AfterThrowing,捕获异常后回滚。

  注意:业务处理层一般不是用try,便于捕获异常。一般在控制层捕获异常。

  配置文件:开启注解事务<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>

5、事务传播行为

  5.1 事务传播行为

    即事务的传递

  5.2 事务传播行为分类 

  • PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
  • PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。(如果当前有事物,我就用当前事物,如果当前没有事物,就以非事物进行执行)
  • PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。 
  • PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。 
  • PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 
  • PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

七、源码查看

1、源码下载

  1.1 git源码下载地址:https://github.com/spring-projects/spring-framework/tags?after=v4.0.3.RELEASE

  1.2 maven下载源码:下载jar包目录下包含xx-sources.jar,可直接进入查看源码

    对应jar包右键properties下:

    

 

 

   1.3 Spring jar

    spring-core:核心jar

    spring-context:上下文,包含IOC具体实现

    spring-jdbc:数据库

    spring-aop:切面编程

  1.4 快捷键

    ctrl+t:查看包含什么子类

    ctrl+o:查看该类下的方法

2、SpringIOC

  2.1 BeanFactory----spring-beans

    定义了SpringIOC的基本形式。

  2.2 BeanDefinition----spring-beans

    xml解析

  2.3 IOC源码路径(ClassPathXmlApplicationContext)

    父类:AbstractRefreshableApplicationContext,执行refreshBeanFactory方法,一步步进行解析xml文件,注册bean到IOC容器

 

八、Spring Bean生命周期

1、生命周期

  1.Spring对Bean进行实例化(相当于程序中的new Xx())

  2.Spring将值和Bean的引用注入进Bean对应的属性中

  3.如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()方法 
    (实现BeanNameAware清主要是为了通过Bean的引用来获得Bean的ID,一般业务中是很少有用到Bean的ID的)

  4.如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanDactory(BeanFactory bf)方法并把BeanFactory容器实例作为参数传入。 
  (实现BeanFactoryAware 主要目的是为了获取Spring容器,如Bean通过Spring容器发布事件等)

  5.如果Bean实现了ApplicationContextAware接口,Spring容器将调用setApplicationContext()方法,把bean所在的应用上下文的引用传入. 
  (作用与BeanFactory类似都是为了获取Spring容器,不同的是Spring容器在调用setApplicationContext方法时会把它自己作为setApplicationContext 的参数传入,而Spring容器在调用setBeanDactory前需要

  程序员自己指定(注入)setBeanDactory里的参数BeanFactory )

  6.如果Bean实现了BeanPostProcess接口,Spring将调用它们的postProcessBeforeInitialization(预初始化)方法 
  (作用是在Bean实例创建成功后对进行增强处理,如对Bean进行修改,增加某个功能)

  7.如果Bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet方法,作用与在配置文件中对Bean使用init-method声明初始化的作用一样,都是在Bean的全部属性设置成功后执行的初始化

  方法。

  8.如果Bean实现了BeanPostProcess接口,Spring将调用它们的postProcessAfterInitialization(后初始化)方法(作用与6的一样,只不过6是在Bean初始化前执行的,而这个是在Bean初始化后执行的,

  时机不同 )

  9.此时,bean已经准备就绪,可以被程序使用了,Bean将一直驻留在应用上下文中给应用使用,直到应用上下文被销毁

  10.如果Bean实现了DispostbleBean接口,Spring将调用它的destory方法,作用与在配置文件中对Bean使用destory-method属性的作用一样,都是在Bean实例销毁前执行的方法。

 

 

九、SpringAOP

  spring容器启动,每个bean的创建都会先经过AbstractAutoProxyCreator类的postProcessAfterInitialization方法

 

十、Spring MVC流程

1、Spring MVC核心技术

  servlet进行包装

2、流程:

  请求交给DispatcherServlet进行管理

  执行DispatcherServlet中的doService方法,统一调用doDispatch方法执行请求

  根据HandlerMapping,获取Handler

  获取HandlerAdapter,可执行拦截器,调用Handler处理具体请求,返回ModelAndView

  视图解析ViewResolver

  

 

 

  

 

posted on 2019-08-31 20:46  dysdhd  阅读(152)  评论(0)    收藏  举报