spring 入门介绍 ioc aop 事物

  1. 概述

Spring 5.0.6版本

   Spring 是一个一站式的框架,是一个轻量级的开源框架,是一个半成品的项目是解决一部分领域的业务

   一站式:j2ee中三层架构的 web (springmvc)    service(spring)    dao(spring  jdbcTemplate)

   轻量级:非侵入性的,高内聚低耦合

   开源:源代码开放的

   

框架好处:

提高开发效率,减少程序员的工作量

 

 

 

 

  下载地址:http://repo.spring.io/release/org/springframework/spring/5.0.6.RELEASE/

 

 

 

 

 

 

 

 

  1. Ioc

Ioc : 控制反转:将对象的创建及管理(生命周期)交由spring ioc 大工厂来管理

Ioc : 底层实现就是一个大工厂

Ioc 也称 依赖注入  DI   依赖注入是在ioc基础上完成的

 

  1. Ioc 案例
  1. 创建一个java project 工程
  2. 导入核心jar包 beans  core   context    expreession   logging
  3. 创建配置文件 applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="accountDao"

        class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao">

        <!-- additional collaborators and configuration for this bean go here -->

    </bean>

    <bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao">

        <!-- additional collaborators and configuration for this bean go here -->

    </bean>

    <!-- more bean definitions for data access objects go here --></beans>

 

  1. 创建spring ioc 容器

 

// create and configure beans

ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");// retrieve configured instance

PetStoreService service = context.getBean("petStore", PetStoreService.class);// use configured instanceList<String> userList = service.getUsernameList();

 

 

  1. Bean的配置

   生命周期的几个属性  init-method   destroy-method   

   懒加载  lazy-init

   属性赋值:构造注入   setter注入

   P 空间 简化属性setter注入

   自动装配  autowire : byName  |  byType

   复杂 类型 注入:

        Array

        List

        Set

        Map

        Properties

 

  1. 注解 

   @Component    @Controller   @Service         @Repository    创建对象的

   @Autowired     @Resource    @Value(#{spEL(id[‘key’])})   @Value(${})  注入值

   @Scope 作用域

  1. Aop

面向切面编程(将业务功能和非业务功能分离)底层就是动态代理

动态代理:jdk  cglib

Jdk : 针对的是接口

Cglig :针对的是实现的子类

 

   应用场景:

       审计日志    系统监控    事务控制    权限控制   ....

 

   

   切面

   连接点

   切点

   切点表达式

   通知

 

实例:使用注解形式配置aop

   1.导包  需要到 aop 包    aspects 包  aspectjweaver-1.9.1.jar  aopalliance-1.0.jar

   2.开启aop 注解

     <!-- 开启aop 注解驱动 -->

     <!-- <aop:aspectj-autoproxy></aop:aspectj-autoproxy> -->

   3.配置

     @Aspect 配置切面

     @Component创建对象

     @Befor   前置

     @After   后置

@Around   环绕

@AfterReturning   最终

@AfterThrowing   异常

  切点表达式:

    execution(public * *(..))

 

名称以“set”开头的任何方法的执行:

execution(* set*(..))

 

执行AccountService接口定义的任何方法:

execution(* com.xyz.service.AccountService.*(..))

 

执行服务包中定义的任何方法:

execution(* com.xyz.service.*.*(..))

 

执行服务包或子包中定义的任何方法:

execution(* com.xyz.service..*.*(..))

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

实例:使用xml形式配置aop

    <!-- 切面      切点= 切点表达式 (配置连接点) 通知  -->

     <!-- 目标组件 -->

     <bean id="myAop" class="com.zc.sp.aop.MyAop"></bean>

     <aop:config>

          <aop:aspect ref="myAop"><!-- 切面 -->

          <!-- 切点

          

            切点表达式:execution(* com.zc.sp.service.impl.*.*(..))

            表达式(连接点:需要增强的方法)

          -->

              <aop:pointcut expression="execution(* com.zc.sp.service.impl.*.*(..))" id="pt"></aop:pointcut>

              <!-- 后置通知  -->

              <aop:after method="end" pointcut-ref="pt"/>

          </aop:aspect>

          

     </aop:config>

 

  1. 事务

   事务:指的是逻辑上的一组操作,这组操作要么一起成功要么一起失败

特性:

   原子性:事务是一个不可分割的工作单位,事务中的操作要么都成功要么都不成功

   一致性:事务前后数据的完整性必须保存一致

   隔离性:多个用户访问数据库时,一个用户的事务不能被其他用户的事务所干扰多个并发事务之间数据要相互隔离

   持久性:一个事务一旦被提交,就永久性的保存到数据库中

 

事务管理的3个接口:

   platformTransactionManager  事务管理器

   transactionDefinition  事务定义的信息(隔离,传播,超时,只读)

   transactionStatus 事务具体运行状态

 

看api

 

      

事务如果不考虑隔离性就会引发安全问题:如 脏读   不可重复读   幻读

隔离级别就是解决这样的问题:

 

  脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据则是无效的

  不可重复读 :在同一事务中,多次读取同一事务返回的结果有所不同

幻读 :一个事务读取了几行记录后,另一个事务就插入了一些记录,幻读就发生了,再后来的查询中,第一个事务就会发现有些原来没有的记录

 

 

 

 

 

Mysql 默认的隔离级别是 repeatable_read

Oracle 默认的隔离级别是  read_commited

 

 

 

 

分三类:

  前三个一类:支持当前事务,在同一个事务里面

  456 为一类:不在同一个事务里面

  最后一个:a 执行完设置一个保存点,b执行异常可以回滚到保存点或者最初状态

 

 

Spring 事务

编程式事务 (不讲)

声明式事务:

    Xml :

       <!-- 配置事务管理器-->

     <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <property name="dataSource" ref="dataSource"/>

     </bean>

     

     

     

     <!-- 配置事务的通知属性 -->

     <!--  <tx:advice id="txAdvice" transaction-manager="txManager">

        <tx:attributes>

            查询时只读

            <tx:method name=" find*" read-only="true"/>

            所有的方法都有  isolation="DEFAULT" propagation="REQUIRED" 默认事务

            <tx:method name="*" />

        </tx:attributes>

    </tx:advice> -->

     

     <!-- 配置aop -->

     <!-- <aop:config>

           <aop:pointcut expression="execution(* com.zc.sp.service.impl.*.*(..) )" id="pt"/>

           <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>

     </aop:config> -->

 

  

 

 

    注解:在业务实现类上添加一个事务注解@Transactional

       <!-- 配置事务管理器-->

     <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <property name="dataSource" ref="dataSource"/>

     </bean>

     

     <!-- 配置事务驱动,开启事务注解 -->

     <tx:annotation-driven transaction-manager="txManager"/>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值