zoukankan      html  css  js  c++  java
  • Java SSM(八)——Spring事务控制和小结

    iwehdio的博客园:https://www.cnblogs.com/iwehdio/

    1、JdbcTemplate

    Spring框架提供的一个对象,对原始Jdbc API对象的简单封装。

    • 作用:用于与数据库交互,实现对表的CRUD操作。

    • 创建工程,导入依赖:

      <dependencies>
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-context</artifactId>
              <version>5.0.2.RELEASE</version>
          </dependency>
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-jdbc</artifactId>
              <version>5.0.2.RELEASE</version>
          </dependency>
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-tx</artifactId>
              <version>5.0.2.RELEASE</version>
          </dependency>
          <dependency>
              <groupId>mysql</groupId>
              <artifactId>mysql-connector-java</artifactId>
              <version>5.1.6</version>
          </dependency>
      </dependencies>
      
    • JdbcTemplate的基本使用:

      public class demo1 {
          public static void main(String[] args) {
      
              //Spring的内置数据源
              DriverManagerDataSource ds = new DriverManagerDataSource();
              ds.setDriverClassName("com.mysql.jdbc.Driver");
              ds.setUrl("jdbc:mysql://localhost:3306/spring");
              ds.setUsername("root");
              ds.setPassword("root");
              //设置数据源
              JdbcTemplate jt = new JdbcTemplate();
              jt.setDataSource(ds);
              jt.execute("insert into account(name,money) values('ccc', 1000)");
          }
      }
      
    • 使用IOC注入:

      • bean.xml:

        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource"></property>
        </bean>
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
            <property name="url" value="jdbc:mysql://localhost:3306/spring"></property>
            <property name="username" value="root"></property>
            <property name="password" value="root"></property>
        </bean>
        
      • demo2.java:

        public class demo2 {
            public static void main(String[] args) {
        
                ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
                JdbcTemplate jt = ac.getBean("jdbcTemplate", JdbcTemplate.class);
                jt.execute("insert into account(name,money) values('ddd', 1200)");
            }
        }
        
    • JdbcDaoSupport的使用:

      • 简化创建JdbcTemplate,可以让Dao实现类继承JdbcDaoSupport。
      • 在实现类中使用super.getJdbcTemplate()获取父类对象。

    2、事务控制

    Spring的事务控制也可以用配置实现。

    • Spring提供了接口PlatformTransactionManager进行事务控制:

      • 实现类DataSourceTransactionManager
    • Spring中基于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"
            xmlns:aop="http://www.springframework.org/schema/aop"
            xmlns:tx="http://www.springframework.org/schema/tx"
            xsi:schemaLocation="
                http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/tx
                http://www.springframework.org/schema/tx/spring-tx.xsd
                http://www.springframework.org/schema/aop
                http://www.springframework.org/schema/aop/spring-aop.xsd">
        </beans>
        
      • 配置步骤:

        1. 配置事务管理器:

          <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
              <property name="dataSource" ref="datasource"></property>
          </bean>
          
        2. 配置事务通知:

          <tx:advice id="txAdvice" transaction-manager="transactionManager"></tx:advice>
          
          • id 属性:事务通知的唯一标志。
          • transaction-manager 属性:给事务通知提供一个事务管理器引用。
        3. 配置AOP中的通用切入点表达式:

          <aop:config>
              <aop:pointcut id="pt" expression="execution(* cn.iwehdio.service.Impl.*.*(..))"></aop:pointcut>
          </aop:config>
          
        4. 建立事务通知和切入点表达式的对应关系(<aop:config>标签内):

          <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"></aop:advisor>
          
        5. 配置事务的属性(<tx:advice>标签内):

          <tx:attributes>
              <tx:method name="*" propagation="REQUIRED" read-only="false" ></tx:method>
              <tx:method name="find*" propagation="SUPPORTS" read-only="true"></tx:method>
          </tx:attributes>
          
          • name 属性:指定Service中的的方法名。
          • isolation 属性:指定事务的隔离级别,默认DEFAULT使用数据库的隔离级别。
          • propagation 属性:指定事务的传播行为,默认REQUIRED一定有事务(增删改)。查询选择SUPPORTS。
          • read-only 属性:指定事务是否只读,只有查询方法可以设置为true,默认false。
          • timeout 属性:指定事务的超时时间,默认-1永不超时。
          • no-rollback-for 属性:指定一个异常,产生该异常时,事务不回滚,产生其他异常时,事务回滚。没有默认值,表示任何异常都回滚。
          • rollback-for 属性:指定一个异常,产生该异常时,事务回滚,产生其他异常时,事务不回滚。没有默认值,表示任何异常都回滚。
    • 基于注解的声明式事务控制:

      1. 配置事务管理器:

        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="datasource"></property>
        </bean>
        
      2. 开启Spring对注解事务的支持:

        <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
        
      3. 在需要事务支持的地方使用@Transactional注解。

      4. @Transactional注解的属性中进行对事务属性的控制。

    • 基于纯注解的声明式事务控制:

      • 开启纯注解事务支持:@EnableTransactionManagement
    • 编程式事务控制:

      1. 在配置文件中配置事务管理器。
      2. 在配置文件中配置事务模板对象,注入事务管理器对象。
      3. 在需要进行事务控制的方法内,重写事务模板对象的TransactionCallback()下的doInTransaction()方法,将事务代码放入其中。
      4. 在bean.xml中再业务层注入事务模板对象。

    3、IOC

    (1)XML配置

    • IOC 的 bean.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">
      </beans>
      
    • 获取核心容器:

      ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
      
    • <bean>标签:

      • 表示把对象交给Spring管理,存入IOC容器。
      • 使用默认构造方法创建:
        • id 属性:键,调用时引用该id。
        • class 属性:所要创建的类的全类名。
      • 使用工厂方法创建(使用某个类中的方法创建):
        • factory-bean 属性:工厂类全类名。
        • factory-method 属性:工厂中创建对象的方法。
      • 使用静态工厂中的静态方法创建:
        • class 属性:工厂类全类名。
        • factory-method 属性:静态方法。
      • bean 的作用范围:
        • 默认情况下是单例的。也就是多次创建的是同一个对象。
        • scope 属性:用于指定作用范围:
          • singleton:单例、默认值。
          • prototype:多例。
        • init-method和destroy-method 属性用于指定初始化前和销毁后的方法。
    • 依赖注入:

      • 使用构造函数注入:<bean> 标签中的 <constructor-arg>标签。
        • value 属性:用于提供基本类型和String类型的数据。
        • ref 属性:用于引入其他的 bean 类型数据,即在 Spring 的 IOC 核心容器中出现过的 bean 对象。
      • set 方法注入:<bean> 标签中的 <property>标签。
        • name 属性:注入时调入的 set 方法名称(属性名)。
        • value 属性:提供基本类型和String的数据。
        • ref 属性:提供 bean 类型数据。

    (2)注解配置

    • 启用注解并配置注解扫描的包:

      <?xml version="1.0" encoding="UTF-8"?>
      <beans 
          xmlns:context="http://www.springframework.org/schema/context"
          xsi:schemaLocation="http://www.springframework.org/schema/context
              http://www.springframework.org/schema/context/spring-context.xsd">
      
          <context:annotation-config/>
          <context:component-scan base-package="所要扫描的包"></context:component-scan>
      
      </beans>
      
    • maven 导入注解支持:

      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      
    • @Compoent注解:

      • 用于将当前类对象存入Spring容器中。
      • value 属性:用于指定 bean 的 id(取出时的索引),默认为当前类名(首字母小写)。
      • 相同的功能:
        • @Controller:一般用于表现层。
        • @Service:一般用于业务层。
        • @Respository:一般用于持久层。
    • @Autowired注解:

      • 自动按照类型注入,只要容器中有唯一的一个 bean 对象和要注入的变量类型匹配,就可以注入成功。
    • @Qualifier注解:

      • value 属性:在按照类型注入的基础上再按照名称注入。在给类成员变量注入时不能单独使用,但在给成员方法注入时可以单独使用。
    • @Resource注解:

      • name 属性:直接按照 bean 的 id 注入,指定 id 。
    • @Value注解:

      • value 属性:指定数据的值,用于注入基本类型和String类型。可以使用Spring的 EL 表达式($(表达式))。
    • @Scope注解:

      • value 属性:用于指定 bean 的作用范围取值。
    • 和生命周期相关的注解:

      • @PreDestroy:用于指定销毁方法。
      • @PostConstruct:用于指定初始化方法。

    (3)新注解

    • 创建配置类SpringConfiguratuon,它的作用是与bean.xml相同的。

    • @Configuration注解:

      • 表示当前类是一个配置类。

      • 获取核心容器:

        ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguratuon.class);
        
    • @ComponentScan注解:

      • 指定使用注解所要扫描的包。
      • value 属性/basePackages 属性:={"包名"}
    • @Bean注解:

      • 用于把当前的返回值作为 bean 对象存入 Spring 的 IOC 中。
      • name 属性:指定 bean 的 id,默认值是方法名。
    • @Import注解:

      • 用于导入其他的配置类(父配置类的子配置类)。
      • value 属性:子配置类的字节码对象。
    • @PropertySource注解:

      • 用于配置 property 的文件位置。

      • value 属性:指定文件的名称和路径,classpath 关键字表示文件在类路径下。

    4、AOP

    (1)XML配置

    • AOP 的 bean.xml 约束:

      <beans xmlns:aop="http://www.springframework.org/schema/aop"
             xsi:schemaLocation="http://www.springframework.org/schema/aop
              http://www.springframework.org/schema/aop/spring-aop.xsd">
      </beans>
      
    • maven 导入切入点表达式解析器:

      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      
    • <aop:config>标签:

      • 表明开始AOP的配置,AOP的配置都在该标签下。
    • <aop:aspect>标签:

      • 表明配置切面,在<aop:config>标签内,通知配置都在此标签内。

      • id 属性:给切面提供一个唯一索引。

      • ref 属性:指定通知类bean的id。

    • <aop:before>标签:

      • 表示前置通知,在<aop:aspect>标签内。

      • method 属性:用于指定通知类中那个方法是前置通知。

      • pointcut 属性:指定切入点表达式,含义是指的是对业务层中的那些方法进行增强。

      • <aop:after-returning>标签:表示后置通知。

      • <aop:after-throwing>标签:表示异常通知。

      • <aop:after>标签:表示最终通知。

      • <aop:around>标签:表示环绕通知。

        • 使用ProceedingJoinPoint接口的方法proceed()方法调用切入点方法,使用getArgs()方法获取参数:
    • 切入点表达式:execution(表达式)

      • 表达式:访问修饰符 返回值 全类名.方法名(参数列表)
      • 全通配写法:* *..*.*(..)
      • 一般而言,切入点写到业务层实现类下的所有方法。
      • 通用切入点表达式<aop:pointcut>
        • id 属性:指定被索引的键。在<aop:before>标签使用 pointcut-ref 指定。
        • expression 属性:切入点表达式。

    (2)注解配置

    • AOP 注解配置的约束:AOP的约束 + 注解的约束。

    • 配置Spring开启AOP注解支持:

      <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
      
      • 也可以使用注解@EnableAspectJAutoProxy
    • @Aspect表示当前类是一个切面类,在Logger类上。

    • @Before(切入点表达式):前置通知标签。

    • @AfterReturning(切入点表达式):后置通知标签。

    • @AfterThrowing(切入点表达式):异常通知标签。

    • @After(切入点表达式):最终通知标签。

    • @Around(切入点表达式):环绕通知标签。

    • 通用切入点表达式:

      @Pointcut("表达式")
      private void pt(){}
      @Before("pt()")
      public void before PrintLog(){}
      

    5、事务控制

    (1)XML配置

    • 事务控制的 bena.xml 配置:

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns:tx="http://www.springframework.org/schema/tx"
          xsi:schemaLocation="http://www.springframework.org/schema/tx
              http://www.springframework.org/schema/tx/spring-tx.xsd">
      </beans>
      
    • maven 注册事务控制:

      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      
    • 配置事务管理器:

      <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <property name="dataSource" ref="datasource"></property>
      </bean>
      
    • <tx:advice>标签:

      • 配置事务通知。
      • id 属性:事务通知的唯一标志。
      • transaction-manager 属性:给事务通知提供一个事务管理器引用。
    • <aop:advisor>标签:

      • <aop:config>标签内,建立事务通知和切入点表达式的对应关系。
      • advice-ref 属性:指向事务通知。
      • pointcut-ref 属性:指向切入点表达式。
    • <tx:attributes>标签:

      • <tx:advice>标签内,配置事务的属性。
    • <tx:method>标签:

      • <tx:attributes>标签内,配置所要拦截的方法。
      • name 属性:指定Service中的的方法名,可以用通配符。
      • isolation 属性:指定事务的隔离级别,默认DEFAULT使用数据库的隔离级别。
      • propagation 属性:指定事务的传播行为,默认REQUIRED一定有事务(增删改)。查询选择SUPPORTS。
      • read-only 属性:指定事务是否只读,只有查询方法可以设置为true,默认false。
      • timeout 属性:指定事务的超时时间,默认-1永不超时。
      • no-rollback-for 属性:指定一个异常,产生该异常时,事务不回滚,产生其他异常时,事务回滚。没有默认值,表示任何异常都回滚。
      • rollback-for 属性:指定一个异常,产生该异常时,事务回滚,产生其他异常时,事务不回滚。没有默认值,表示任何异常都回滚。

    (2)注解配置

    • 开启Spring对注解事务的支持:

      <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
      
    • @Transactional注解:

      • 在需要事务支持的地方使用该注解。
      • 在注解的属性中进行对事务属性的控制。

    iwehdio的博客园:https://www.cnblogs.com/iwehdio/

  • 相关阅读:
    AcRxClass::addX
    string.format("%s",name)
    strcmp 与 _tcscmp
    acedinitget
    判断实体的类型 相关操作
    accmcolor
    CAD类型转换
    图的存储结构及遍历
    并查集(Union/Find)
    设计模式--缺醒适配器模式
  • 原文地址:https://www.cnblogs.com/iwehdio/p/13089678.html
Copyright © 2011-2022 走看看