一、AOP注解开发

  此处需要回忆一遍AOP的概念。简单的来说,AOP就是利用动态代理技术,做到不触动源代码但却扩展了功能。那么就需要一个被扩展的对象和一个“新的功能”,例如说给某类的saveUser方法增加输出日志需求,此时输出日志该事件就是一个“新的功能”。举这个例子的重点只是为了突出,AOP技术需要关注两个方面,一个是接受者,而另一个是输出点。要利用AOP,必然需要将这两个对象做出关联。而所谓AOP注解开发,就是如何将这两个对象建立关系。

  当然,以上理解仅仅为个人的话语解读,不具有严谨的用词,有任何理解错误,望不吝赐教。

  在AOP的xml开发中,xml核心配置如下

  1. <aop:config>
  2. <--切入点(接受对象)-->
  3. <aop:pointcut expression="execution(* com.itheima.service.impl.*.*(..))" id="aa"/>
  4. <--切面(新功能)-->
  5. <aop:aspect ref="logger">
  6. <aop:before method="log" pointcut-ref="aa"/>
  7. </aop:aspect>
  8. </aop:config>

  因此,注解只需要做到清楚表达以上两点内容,再配套一些基本的要求,例如托管类。此外,为了让程序的复用性更强,我们只需要对“新功能”对象做处理,告诉它要为谁增强方法即可做到关联,以下为实例:

  • 导入jar包 aop联盟包、 aspectJ实现包 、 spring-aop-xxx.jar 、 spring-aspect-xxx.jar
  • 导aop约束 ,打开扫描约束开关<aop:aspectj-autoproxy/>
  • 托管两个类,在类上加注解@Compone
  •  然后再“新的功能”类上配置注解
  1. @Aspect //这个注解,是和aop有关,用于表示该类是一个功能扩展类,专门用来做增强的。
  2. public class Logger {
  3. @Before("execution(* com.gaga.service.impl.*.*(..))")
  4. public void log(){
  5. System.out.println("输出日志了~~~!");
  6. }

二、jdbc模板

  所谓jdbc模板,就是Spring对于dao层的技术支持。和DBUtils的功能的目的是一样的,就是为了操作数据库。回想以下,如果什么框架都没有,只有java原生代码提供给我们的prepareStatement、createStatement、遍历resultSet那一套东西。那我们的操作便会过于臃肿。

  虽然操作数据库有更专业的框架,例如Hibernate\Mybatis等等。但作为一个负责Service层的框架,自然会有向两边扩展的思想,因此便有了该部分模板。

  spring其实对dao层的大部分技术有提供模板支持

  1. 例子:
  1. public void testDemo(){
  2.  
  3. //数据源,连数据库。 连什么类型的数据, 哪个库, 账号 & 密码
  4. DriverManagerDataSource dataSource =new DriverManagerDataSource();
  5. dataSource.setDriverClassName("com.mysql.jdbc.Driver");
  6. dataSource.setUrl("jdbc:mysql:///stus");
  7. dataSource.setUsername("root");
  8. dataSource.setPassword("root");
  9.  
  10. //1. 创建jdbc模板
  11. JdbcTemplate jdbcTemplate = new JdbcTemplate();
  12. jdbcTemplate.setDataSource(dataSource);
  13.  
  14. String sql = "insert into t_user values(null , ? , ? )";
  15.  
  16. //2. 执行添加操作,其实它的用法和以前的queryrunner一样。
  17. jdbcTemplate.update(sql , "66666","zhangsan");
  18. }

  2.配置C3P0连接池(注入写法)

  为了方便修改数据库连接信息,通常在src下使用properties文件来记录他们。主要是方便修改

  •   导入Jar包  c3p0-0.9.5.2.jar   mchange-commons-java-0.2.12.jar
  •   配置xml
    •  在src下新建一个properties文件,内容如下 名:jdbc.properties
  1. driverClass=com.mysql.jdbc.Driver
  2. jdbcUrl=jdbc:mysql:///user
  3. user=root
  4. password=root
    •  在xml里面导入jdbc.properties ,并且在dataSource里面引用

      1. <bean id="us" class="com.gaga.service.impl.UserServiceImpl">
      2. <property name="userDao" ref="userDao"></property>
      3. </bean>
      4.  
      5. <bean id="userDao" class="com.gaga.dao.impl.UserDaoImpl">
      6. <property name="jdbcTemplate" ref="jdbcTemplate"></property>
      7. </bean>
      8.  
      9. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
      10. <property name="dataSource" ref="dataSource"></property>
      11. </bean>
      12.  
      13.  <context:property-placeholder location="classpath:jdbc.properties"/>
      14.             <!-- 使用c3p0连接池 -->
      15.           <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
      16.               <property name="driverClass" value="${driverClass}"></property>
      17.               <property name="jdbcUrl" value="${jdbcUrl}"></property>
      18.               <property name="user" value="${user}"></property>
      19.               <property name="password" value="${password}"></property>
      20.           </bean>

  以上配置将service\dao\jdbcTemplate\连接池都用IOC做了托管,并且用了DI注入,也就是说1.例子中的一堆堆代码可以简化为如下。只需要声明模板,然后直接可以使用,创建对象什么的都交给Spring。核心便是这个

  1. @Repository("ud")
  2. public class UserDaoImp implements UserDao {
  3.  
  4. @Autowired
  5. private JdbcTemplate jdbcTemplate;
  6.  
  7. public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
  8. System.out.println("userDao的set方法---");
  9. this.jdbcTemplate = jdbcTemplate;
  10. }
  11. @Override
  12. public void save() {
  13. String sql = "insert into bbb values(null,?)";
  14. jdbcTemplate.update(sql, "66666666");
  15. }
  16. }

三、Spring事务管理

  正如标题所述,Spring会对事务做管理。但需要注意只是做管理,实际操作还是依据不同的框架的做法(不同的实现)。

  这里不得不提,Spring其中的伟大之一在于AOP。那么我们就可以利用它来对某部分功能加入事务的功能。而,当我们要利用Spring来进行事务管理的时候,正所谓人在屋檐下,不得不低头。你用人家的,那也得遵守别人定下的规矩。

  Spring统一规定,要操作事务,必须使用管理员!

  1. 管理事务的规范是 PlatformTransactionManager
  2. jdbc | mybatis : DataSourceTransactionManager
  3. hibernate : HibernateTransactionManager

  Spring对事务的支持,有三种写法:编程式事务、xml声明式事务、注解声明式事务。

  这三种写法中,最简介的为注解式事务。以下列出三种写法的实例,推荐后者。

  • 编程式事务

    1. @Test
    2. public void test(){
    3.  
    4. //事务的管理员是用来管理事务的,包含了打开事务、 提交事务、 回滚事务
    5. final DriverManagerDataSource dataSource = new DriverManagerDataSource();
    6. dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    7. dataSource.setUrl("jdbc:mysql:///stus");
    8. dataSource.setUsername("root");
    9. dataSource.setPassword("root");
    10.  
    11. DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
    12. transactionManager.setDataSource(dataSource);
    13.  
    14. //1. 创建事务的模板对象。
    15. TransactionTemplate transactionTemplate = new TransactionTemplate();
    16. transactionTemplate.setTransactionManager(transactionManager);
    17.  
    18. //事务事务的模板对象
    19. transactionTemplate.execute( new TransactionCallback<Object>() {
    20.  
    21. //在事务里面执行这个方法。
    22. @Override
    23. public Object doInTransaction(TransactionStatus arg0) {
    24.  
    25. //添加操作
    26. JdbcTemplate jdbcTemplate = new JdbcTemplate();
    27. jdbcTemplate.setDataSource(dataSource);
    28.  
    29. String sql = "insert into t_user values ( null , ? , ?)";
    30. jdbcTemplate.update(sql, "123","王五");
    31.  
    32. int a = 1 / 0 ;
    33.  
    34. jdbcTemplate.update(sql, "6666","赵六");
    35.  
    36. return null;
    37. }
    38. });
    39.  
    40. }

    编程式事务

  • xml声明式事务
  1. <!-- 以下属于事务的配置 如果要用事务了,那么事务的管理员是谁啊。 -->
  2. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  3. <property name="dataSource" ref="dataSource"></property>
  4. </bean>
  5.  
  6. <!--
  7. 以上配置,到目前为止,只是说明了,如果要开启事务,管理员是谁。 但是缺少了一个东西。
  8. 就是哪一个方法到底要用事务呀? -->
  9. <aop:config>
  10. <aop:pointcut expression="execution(* com.gaga.service.impl.*.*(..))" id="aa"/>
  11. <aop:advisor advice-ref="advice01" pointcut-ref="aa"/>
  12. </aop:config>
  13.  
  14. <tx:advice id="advice01" transaction-manager="transactionManager">
  15. <tx:attributes> <!-- 对 id="aa"表达式找到的那一堆方法,进行过滤配置,表示谁才能用事务管理, 如果是* ,表示前面找到的那一堆都用事务管理 -->
  16. <tx:method name="save*"/>
  17. <tx:method name="update*"/>
  18. <tx:method name="delete*"/>
  19. </tx:attributes>
  20. </tx:advice>

xml声明式事务

  • 注解声明式事务

    a)xml中的配置

  1. <context:component-scan base-package="gaga"/>
  2. <aop:aspectj-autoproxy/>
  3. 1. 在xml中 声明注解事务的管理员
  4.  
  5. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  6. <property name="driverClass" value="${driverClass}"/>
  7. <property name="jdbcUrl" value="${jdbcUrl}"/>
  8. <property name="user" value="${user}"/>
  9. <property name="password" value="${password}"/>
  10. </bean>
  11. <!-- 以下属于事务的配置 如果要用事务了,那么事务的管理员是谁啊。 -->
  12. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  13. <property name="dataSource" ref="dataSource"></property>
  14. </bean>
  15.  
  16. <!-- 指定注解事务使用的管理员是谁 -->
  17. <tx:annotation-driven transaction-manager="transactionManager"/>

    b) 代码配置

  1. 2. 在业务逻辑类上或者方法上打注解
  2.  
  3.         类上的注解,表示类中的所有方法都用事务, 如果在方法上打注解,表示只有这个方法才会用事务
  4.             @Transactional
  5.             public class UserServiceImpl implements UserService {
  6.  
  7.             }
  8.             public class UserServiceImpl implements UserService {
  9.                // @Transactional
  10.                 @Override
  11.                 public void save() {
  12.             }

Spring---AOP注解开发&jdbc模板&Spring事务管理的更多相关文章

  1. Spring入门(三)— AOP注解、jdbc模板、事务

    一.AOP注解开发 导入jar包 aop联盟包. aspectJ实现包 . spring-aop-xxx.jar . spring-aspect-xxx.jar 导入约束 aop约束 托管扩展类和被扩 ...

  2. Spring笔记04_AOP注解开发_模板_事务

    目录 1. Spring基于AspectJ的注解的AOP开发 1. 1 SpringAOP的注解入门 1.2 Spring的AOP的注解通知类型 1.2.1 @Before:前置通知 1.2.2 @A ...

  3. 四、spring的JDBC模板和事务管理

    Spring的JDBC模板 Spring是JavaEE开发的一站式框架,对各种持久化技术都提供了简单的模板 ORM持久化技术 模板类 JDBC org.springframework.jdbc.cor ...

  4. java框架之Spring(3)-JDBC模板使用&事务管理

    下面内容使用到的 jar 包下载 JDBC模板使用 入门 1.导包,如要导入 Spring 的基本开发包.数据库驱动包.Spring 提供的 JDBC 模板包,如下: 2.测试: @Test publ ...

  5. 【Spring实战】—— 16 基于JDBC持久化的事务管理

    前面讲解了基于JDBC驱动的Spring的持久化管理,本篇开始则着重介绍下与事务相关的操作. 通过本文你可以了解到: 1 Spring 事务管理的机制 2 基于JDBC持久化的事务管理 Spring的 ...

  6. Spring aop注解失效

    问题 在spring 中使用 @Transactional . @Cacheable 或 自定义 AOP 注解时,对象内部方法中调用该对象的其他使用aop机制的方法会失效. @Transactiona ...

  7. Spring _day02_IoC注解开发入门

    1.Spring IoC注解开发入门 1.1 注解开发案例: 创建项目所需要的jar,四个基本的包(beans core context expression ),以及两个日志记录的包,还要AOP的包 ...

  8. Spring使用注解开发及使用java类进行配置bean

    Spring使用注解开发 说明 在spring4之后,想要使用注解形式,必须得要引入aop的包 在配置文件当中,还得要引入一个context约束 <?xml version="1.0& ...

  9. Spring AOP注解为什么失效?90%Java程序员不知道

    使用Spring Aop注解的时候,如@Transactional, @Cacheable等注解一般需要在类方法第一个入口的地方加,不然不会生效. 如下面几种场景 1.Controller直接调用Se ...

随机推荐

  1. ubuntu下spring环境搭建

    一.安装JDK 下载官网:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 部署: ...

  2. Ubuntu16.04 下python2 | python3

    在终端分别输入python,python2,python3 python和python2默认都是python2 python3才是python3 Ubuntu下是默认没有pip的,需要自己手动安装 s ...

  3. hdu1133 Buy the Ticket (卡兰特数应用+java大数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=1133 [题意] 电影票50块一张 有m个人手里正好有50块,n个人手里正好有100块,售票厅開始没有 ...

  4. Java经常使用日期操作具体解释

    Date类型大多数时间分量计算方法已经被Calendar代替 Date经常用法setTime getTime() new Date();默认获取当前的时间 SimpleDateFormat用来格式化和 ...

  5. sharpdevelop 调整代码字体显示大小

    SharpDevelop中使用ctrl+鼠标滚轮可以调整代码的字体显示大小

  6. [IT学习]跟阿铭学linux(第3版)

    1.安装Linux在虚拟化平台上 Windows Vmware Workstation,需要在本机上打开CPU对虚拟化的支持.Virtualization Cent OS7 已成功安装. 2.http ...

  7. bean的scope属性

    1.singleton  (默认属性)  Spring将Bean放入Spring IOC容器的缓存池中,并将Bean引用返回给调用者,spring IOC继续对这些Bean进行后续的生命管理.Bean ...

  8. Ubuntu grub2的启动配置文件grub.cfg,为了修改另人生厌的时间

    文章转自http://hi.baidu.com/detax/blog/item/90f18b54a8ef5253d00906e4.html 升级到Ubuntu 9.10后,就要接触grub2了,它和以 ...

  9. Lightoj 1029 - Civil and Evil Engineer

    1029 - Civil and Evil Engineer    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limi ...

  10. 关于数论【polya计数法】

    可以预见数论推公式是有多么蛋疼. 让我简明扼要的讲讲吧(多都说不出来,毕竟才做了两道题)其实呢,这个算法应该归入群论,有个有用的东西:置换群,它表示一个集合包括很多的置换.先讲讲置换吧:↓(这是个置换 ...