睁眼写BUG,闭眼改BUG。

Spring_理论

2020.03.02

上一篇 >> Spring_AOP

Spring的笔记到此就结束了 有点乱,希望对大家有所帮助,有什么提议可以留言或联系我.

fighting!fighting!

自动注入

  • 在spring配置文件中对象名和ref="id" id名相同使用自动注入,可以不配置
  • 两种配置办法
    • 中通过autowire=""配置,只对这个生效
    • 中通过 default-autowire="" 配置,表当前文件中所有都是全局配置内容
  • autowire="" 可取值
    • default:默认值,根据全局default-autowire=""值 默认全局和局部都没有配置情况下,相当于 no
    • no:不自动注入
    • byName:通过名称自动注入,在spring 容器中找类的id
    • byType:根据类型注入
      • 在spring容器中 不可以出现两个相同类型的
    • constructor:根据构造方法注入
      • 提供对应参数的构造方法(构造方法参数中包含注入对象的那个)
      • 底层使用byName ,构造方法参数名和其他的id相同

Spring 中加载properties文件

  • 在src下新建 xxx.properties文件

  • 在spring配置文件中先引入 xmlns:context,在下面添加

    • 如果需要记载多个配置文件逗号分隔
  • 添加了属性文件记载,并且在中开启自动注入注意的地方

    • SqlSessionFactoryBean的id不能叫做sqlSessionFactory
    • 修改
      • 把原来通过ref引用替换成value赋值自动注入只能影响ref,不会影响value赋值
  • 在被spring管理的类中通过@Value("$")取出propreties中内容

    • 添加注解扫描
    • key和变量名可以不相同
    • 变量类型任意只要保证key对应的 value能转换成这个类型就可以

scope 属性

  • 的属性
  • 作用:控制对象有效范围(单列,多列等)
  • 标签对应的对象默认时单列的
    • 无论获取多少次,都是同一个对象
  • scope可取值
    • singleton 默认时单例
    • prototype 多例,每次获取重新实列化
    • request 每次请求重新实例化
    • session 每个会话对象内,对象时单例的
    • application 在application对象内时单例的
    • global session spring 推出的一个对象,依赖于 spring-webmvc-protlet,类似于session

单列设计模式

  • 作用:在应用程序有保证最多只能有一个实列
  • 好处:
    • 提升运行效率
    • 实现数据共享.案例:application 对象
  • 懒汉式
    • 由于添加了锁,所以导致效率低
  • 饿汉式
  • 解决了懒汉式中多线程访问可能出现同一个对象和效率低问题

声明式事务

  • 编程式事务:

    • 由程序员来编写事务控制代码
    • OpenSessionInView 编程式事务
  • 声明式事务

    • 事务控制代码已经由spring写好.程序员只要声明出哪些方法需要进行事务控制和如何进行事务控制
  • 声明式事务都是针对于 ServiceImpl类下方法的

  • 事务管理器基于通知(advice)的

  • 在spring配置文件中配置声明式事务

    <context:property-placeholder location="classpath:db.properties,classpath:second.pr operties"/> <bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverMa nagerDataSource"> <property name="driverClassName" value="${jdbc.driver}"></property> <property name="url" value="${jdbc.url}"></property> <property name="username" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> </bean>
    <!-- spring-jdbc.jar 中 --> <bean id="txManager"
    class="org.springframework.jdbc.datasource.DataSour ceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean>
    <!-- 配置声明式事务 --> <tx:advice id="txAdvice"
    transaction-manager="txManager"> <tx:attributes>
    <!-- 哪些方法需要有事务控制 --> <!-- 方法以 ins 开头事务管理 --> <tx:method name="ins*" /> <tx:method name="del*" /> <tx:method name="upd*" /> <tx:method name="*" /> </tx:attributes> </tx:advice> <aop:config>
    <!-- 切点范围设置大一些 --> <aop:pointcut expression="execution(*
    com.bjsxt.service.impl.*.*(..))"
    id="mypoint" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="mypoint" /> </aop:config>
    
    
  • 声明式事务中属性解释

    • name="" 哪些方法需要有事务控制

      • 支持*通配符
    • readonly="boolean" 是否是只读事务.

      • 如果为true,告诉数据库此事务为制度事务.数据优化,会对性能有一定提升,所以只要是查询的方法,建议使用此数据.
      • 如果false(默认值),事务需要提交的事务,建议新增,删除,修改
    • propagation 控制事务传播行为.

      • 当一个具有事务控制的方法被另一个有十五控制的方法调用后,需要如何管理事务(新建事务?在事务中执行?把事务挂起?报异常?)
      • REQUIRED(默认值):如果当前有事务,就在事务中执行,如果当前没有事务,新建一个事务.
      • SUPPORTS:如果当前有事务就在事务中执行,如果当前没有事务,就在非事务状态下执行
      • MANDATORY:必须在事务内部执行,如果当前有事务,就在事务中执行,如果没有事务,报错.
      • REQUIRES_NEW:必须在事务中执行,如果当前没有事务,新建事务,如果当前有事务,把当前事务挂起.
      • NOT_SUPPORTED:必须在非事务下执行,如果当前没有事务,正常执行,如果当前有事务,把当前事务挂起.
      • NEVER:必须在非事务状态下执行,如果当前没有事务,正常执行,如果当前有事务,报错.
      • NESTED:必须在事务状态下执行.如果没有事务,新建事务,如果当前有事务,创建一个嵌套事务.
    • isolation="" 事务隔离级别

      • 在多线程或并发访问下如何保证访问到的数据具有完整性的

      • 脏读

        • 一个事务a读取到另一个事务b中未提交的数据,另一个事务中数据可能进行了改变,此时a事务读取的数据可能和数据库中数据说不一致的,此时认为数据库是脏数据,读取脏数据过程叫做脏读
      • 不可重复读

        • 主要针对的是某行数据
        • 主要针对的操作是修改操作
        • 当事务a第一次读取事务后,事务b对事务a读取的数据进行修改,事务a中再次读取的数据和之前读取的数据不一致,过程不可重复度
      • 幻读


        此处省略无数理论(百度或找原笔记瞅瞅)