Spring-Aop注解形式案例<三>
来源:互联网 发布:淘宝童装便宜货源 编辑:程序博客网 时间:2024/05/22 10:33
问题?Spring-Aop注解形式案例
我们知道,在spring中,spring提供了注解的形式,来达到对象的依赖注入。当然我们也可以直接用依赖注入将bean
这里写的是Spring-Aop注解形式案例
工具类:
package cn.itcast.spring.sh.aop;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;public class HibernateUtils {public static SessionFactory sessionFactory;static{Configuration configuration = new Configuration();configuration.configure("cn/itcast/spring/sh/aop/hibernate.cfg.xml");sessionFactory = configuration.buildSessionFactory();//Session session = sessionFactory.openSession();//Transaction transaction = session.beginTransaction();//transaction.commit();}}
持久化类:Person
package cn.itcast.spring.sh.aop;import java.io.Serializable;public class Person implements Serializable{private Long pid;private String pname;private String psex;public Person(){}public Person(String pname){this.pname = pname;}public Long getPid() {return pid;}public void setPid(Long pid) {this.pid = pid;}public String getPname() {return pname;}public void setPname(String pname) {this.pname = pname;}public String getPsex() {return psex;}public void setPsex(String psex) {this.psex = psex;}}
映射文件:Person.hbm.xml
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><!-- 用来描述一个持久化类name 类的全名 table 可以不写 默认值和类名一样 catalog 数据库的名称 一般不写 --><class name="cn.itcast.spring.sh.aop.Person"><!-- 标示属性 和数据库中的主键对应name 属性的名称column 列的名称 --><id name="pid" column="pid" length="200" type="java.lang.Long"><!-- 主键的产生器 就该告诉hibernate容器用什么样的方式产生主键 --><generator class="increment"></generator></id><!-- 描述一般属性 --><property name="pname" column="pname" length="20" type="string"></property><property name="psex" column="psex" length="10" type="java.lang.String"></property></class></hibernate-mapping>
hibernate配置文件:hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><!-- 用来描述一个持久化类name 类的全名 table 可以不写 默认值和类名一样 catalog 数据库的名称 一般不写 --><class name="cn.itcast.spring.sh.aop.Person"><!-- 标示属性 和数据库中的主键对应name 属性的名称column 列的名称 --><id name="pid" column="pid" length="200" type="java.lang.Long"><!-- 主键的产生器 就该告诉hibernate容器用什么样的方式产生主键 --><generator class="increment"></generator></id><!-- 描述一般属性 --><property name="pname" column="pname" length="20" type="string"></property><property name="psex" column="psex" length="10" type="java.lang.String"></property></class></hibernate-mapping>
目标接口:(这里我们采用jdk的形式(实现接口))
package cn.itcast.spring.sh.aop;public interface PersonDao {public String savePerson(Person person);}
目标类:
package cn.itcast.spring.sh.aop;import org.springframework.stereotype.Repository;@Repository("personDao1")public class PersonDaoImpl extends HibernateUtils implements PersonDao {public String savePerson(Person person) {sessionFactory.getCurrentSession().save(person);System.out.println("执行保存操作了。");return "返回值";}}
切面类:
package cn.itcast.spring.sh.aop;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.hibernate.Transaction;import org.springframework.stereotype.Component;/** * @Aspect * @author Administrator *Aspect相当于<aop:config></aop:config> */@Component("myTransaction")@Aspectpublic class MyTransaction extends HibernateUtils {private Transaction transaction;/** * 通过一些参数可以获取目标方法的相关信息,报告目标方法名称、返回值参数、异常信息等 * 不过相应的也要在配置文件中进行设置(通过实验,好像只配置后置及异常就可以只用了),不然就获取不了。 * 注:环绕通知不可以跟前置通知和后置通知一起用,因为环绕通知已经把两个通知的东西做了,它可以调用目标方法 * * *///写这个的目的就相当于早aop配置中写了://<aop:pointcut expression="execution(* cn.itcast.spring.sh.aop.PersonDaoImpl.*(..))" id="aa()"/>@Pointcut("execution(* cn.itcast.spring.sh.aop.PersonDaoImpl.*(..))")private void aa(){}//叫方法签名:方法类型必须是void,修饰符最好是pivate//注解形式:前置通知@Before("aa()")public void beginTransaction(JoinPoint joinPoint){System.out.println("开启事务");this.transaction = sessionFactory.getCurrentSession().beginTransaction();}//注解形式:后置通知@AfterReturning(value="aa()",returning="val")public void commit(Object val){//提交事务this.transaction.commit();System.out.println("关闭事务");}}
applicationContext.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"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-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"><!-- AOP注解讲解 :将目标类和切面放入到spring容器管理,启动扫描注解解析器 注:一般不用这个,因为有弊端--><!-- 使用条件:AOP的条件如下xmlns:aop="http://www.springframework.org/schema/aop" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"扫描注解解析器的条件如下xmlns:context="http://www.springframework.org/schema/context"http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd" --> <context:component-scan base-package="cn.itcast.spring.sh.aop"></context:component-scan> <!-- 启动aop的注解解析器 --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy></beans>
测试类:
package cn.itcast.spring.sh.aop;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class PersonTest {@Testpublic void test(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("cn/itcast/spring/sh/aop/applicationContext.xml");PersonDao personDao = (PersonDao)applicationContext.getBean("personDao1");Person person1 = new Person();person1.setPname("李大鹏11");person1.setPsex("男");personDao.savePerson(person1);} }
结果:
总结:想对来说,不管是用xml的形式来实现,还是用注解的方式来实现,都可以。xml的形式有点儿是效率高,缺点是繁琐
注解的缺点是效率低,优点是简单。
0 0
- Spring-Aop注解形式案例<三>
- Spring-Aop注解形式案例<二>
- spring注解形式aop实现
- Spring AOP定义以及注解形式实现
- AOP的实现:Spring注解形式拦截
- spring框架详解(五)--AOP注解形式
- Spring基于注解形式的 AOP的原理流程及源码解析(三)
- Spring-注解的方式配置AOP-案例
- maven下搭建注解形式的Spring aop
- spring aop注解的三种方式
- Spring AOP的实现机制(三)---@AspectJ形式的Spring AOP和基于Schema的AOP
- Spring Aop开发基于AspectJ注解方式的案例
- Spring学习笔记(三)Spring注解方式实现AOP
- Spring的注解形式
- Spring的注解形式
- spring(AOP) 注解实现aop
- Spring AOP(三)——通过@AspectJ注解切面
- Spring In Action(三):基于注解的AOP
- 第6章2节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-获取命令字串
- Maximum Product Subarray
- 杭电ACM1160——FatMouse's Speed
- WCF程序的发布
- Maven工程使用Log4j
- Spring-Aop注解形式案例<三>
- shell之读取/etc/passwd中user及其id
- Parse Generator + Visual Studio 2013配置方法
- iOS推送相关注意点
- Android 使用imageLoader来加载显示图片
- 12.7 coding-python-mongo相关代码笔记
- 玩转ptrace
- 七牛---音视频切片关于用户认证
- CentOS下防火墙的配置