Chrisp's blog

Netease Java Curriculumn Spring Framwork

Spring

  • 核心技术
    • IOC 控制反转
    • AOP 面向切面编程
  • IoC容器=ApplicationContext -> org.springframework.context -> spring-context
  • 初始化容器,获取对象,使用对象
  • Bean的作用域有 singleton 和 prototype,分别对应单例和非单例。直接在application-context的bean里面scope设置。spring默认是singleton。需要修改
  • Bean生命周期回调,在application-context的bean里面init-method 和 destory-method设置。
  • spring 读取配置文件的bean这么写

    1
    2
    3
    4
    <bean id="headerProperties"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:header.properties"/>
    </bean>
  • 如果注入的是普通的数据类型,直接在bean的constructor-arg属性里面加上name和value即可,如果是注入的bean那么需要加上ref属性。

  • AOP 优点:代码重用,解耦
  • spring aop没有提供属性访问的aop
  • 需要声明哪些需要做aop操作。
  • 一些概念
    • Aspect 日志,安全等功能
    • join point 函数执行或者属性访问
    • advice 在某个函数执行点上要执行的切面功能
      • before 函数执行之前
      • after returning 函数返回之后
      • after throwing 函数抛出异常之后
      • after finally 函数返回之后
      • around 函数执行前后
    • pointcut 匹配横切目标函数的表达式
  • spring AOP实现方式 一种是xml,一种是整合AspectJ的注解。
  • xmlns - xml namespace缩写 作用类似于java中的package
  • schemalocation就定义了这个xml文件可以有哪些可以使用的元素
  • 如果使用的是annotation,那么一个bean的名字默认是类名首字母小写。

    Spring templete

  • Spring 访问数据库使用的是jdbcTemplete这个对象,查询使用queryForObject,插入使用update
  • 使用JdbcTemplete需要先将DataSource注入进来

    1
    JdcbTemplete jdbctemplete = new JdcbTemplete (DataSource);
  • 传播行为

    • 事务A调用事务B
    • PROPAGATION_MADATORY 必须在一个事务中运行,不存在则抛异常
    • PROPAGATION_NEVER不应该在事务中运行,存在则抛出异常
    • PROPAGATION_NOT_SUPPORTED不应该在事务中运行,存在则挂起
    • PROPAGATION_SUPPORTS 不需要事务,如果有则在事务中运行
    • PROPAGATION_REQUIRED 必须在事务中运行,如果不存在,则启动新事物(也是默认的传播行为),内部事务会影响外部事务
    • PROPAGATION_NESTED 必须在事务中运行,如果不存在,则启动新事物,与上一个不同的是,事务之间相互不影响(每个事务拥有自己的savepoints)
    • PROPAGATION_REQUIRES_NEW 必须在新事物中执行,挂起当前事务(独立physical事务)
  • 声明式事务需要
    • 定义一个事务管理器,与datasource相关
    • 定义事务Advice
    • 定义pointcut
  • 声明式事务可以有两种实现方式,schema和Annotation
    • schema的话就要配置advisor,pointcut,还要加上一大堆的配置
    • Annotation需要在application-context加上一句
      1
      <tx:annotation-driven transaction-manager="txManager"/>

spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作。
那么什么是检查型异常什么又是非检查型异常呢?
最简单的判断点有两个:
1.继承自runtimeexception或error的是非检查型异常,而继承自exception的则是检查型异常(当然,runtimeexception本身也是exception的子类)。
2.对非检查型类异常可以不用捕获,而检查型异常则必须用try语句块进行处理或者把异常交给上级方法处理总之就是必须写代码处理它。所以必须在service捕获异常,然后再次抛出,这样事务方才起效。