Spring AOP例子

本文介绍了一个使用Spring AOP实现的简单示例项目,包括Person实体类、DAO接口及其实现类的设计,通过MyTransaction类实现了事务管理的切面,详细展示了如何在applicationContext.xml中配置切面及切入点。
摘要由CSDN通过智能技术生成

    1、建项目 springAOP/cn.google.spring.aop

        导入Person.java,Person.hbm.xml,hibernate.cfg.xml

		public class Person {
			private long pid;
			private String pname;
			private String psex;
			封装……
		}

		<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
			"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

		<hibernate-mapping>
			<class name="cn.heima.i_aop.Person">
				<id name="pid" column="id" length="200" type="java.lang.Long">
					<generator class="increment"></generator>
				</id>
				<property name="pname" column="pname" length="20" type="java.lang.String"></property>
					
				<property name="psex" column="psex" length="10" type="java.lang.String"></property>
			</class>
		</hibernate-mapping>

		<!DOCTYPE hibernate-configuration PUBLIC
			"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
			"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
		<hibernate-configuration>
			<session-factory>
				<property name="connection.username">root</property>
				<property name="connection.password">root</property>
				<property name="connection.url"> jdbc:mysql://localhost:3306/my001 </property>
			
				<property name="hbm2ddl.auto">update</property>
				<property name="show_sql">true</property>
				<property name="current_session_context_class">thread</property>


				<mapping resource="cn/heima/i_aop/User.hbm.xml" />

			</session-factory>
		</hibernate-configuration>


    2、建接口 PersonDao.java

		public interface  PersonDao{
			public  void  savePerson(Person  person);
		}

    3、建实现类 PersonDaoImpl,继承Hibernate 的工具类

		public  class  PersonDaoImpl  extends  HibernateUtils  implements  PersonDao{
			@Override
			public  void  savePerson(Person  person){
				sessionFactory.getCurrentSession().save(person);
			}
		}

 Hibernate 的工具类:

		public class HibernateUtils{
			public static SessionFactory sessionFactory;
			static{
				Configuration configuration = new Configuration();
				configuration.configure("/spring_sh/springAOP/cn/itcast/spring/hibernate.cfg.xml");
				sessionFactory = configuration.buildSessionFactory();
			}
		}

   4、建 MyTransaction.java   

		public  class  MyTransaction  extends  HibernateUtils{
			private  Transaction  transaction;

			// 通过该参数,获得目标方法的一些信息
			public  void  beginTransaction(JoinPoint  joinPoint){
				s.o.p("bbb");
				transaction = sessionFactory.getCurrentSession().beginTransaction();

			}

			public  void  commit(Object  var){
				s.o.p(var)
				transaction.commit();
			}

			public  void  finallyMethod(){
				s.o.p("finally method");
			}
			
			// 异常通知
			public  void  throwingMethod(Throwable  ex){
				s.o.p(ex.getMessage());
			}

			// 环绕通知
			public  void  aroundMethod(ProceedingJoinPoint  jointPoint) throws  Throwable{
				jointPoint.proceed();	// 调用目标方法
				s.o.p("aa");
			}
		}

    5、建 applicationContext.xml,导入springAOP命名空间

		<beans xmlns="http://www.springframework.org/schema/beans"
			xmlns:aop="http://www.springframework.org/schema/aop" 
			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">

		</beans>

    6、导入 springAOP 的jar包

        在 spring/spring-framework-2.5.5/lib/aspectj 中两个jar包导入
        分别是:aspectjrt.jar
                      aspectjweaver.jar

    7、在 5 中的applicationContex.xml 中

		<beans xmlns="http://www.springframework.org/schema/beans"
			xmlns:aop="http://www.springframework.org/schema/aop" 
			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">

		    <!-- 
			导入目标类,导入切面
		     -->       
		     <bean id="personDao" class="cn.itcast.spring.aop.sh.PersonDaoImpl"></bean> 
		     <bean id="myTransaction" class="cn.itcast.spring.aop.sh.MyTransaction"></bean>

		     <!-- 
			aop的配置
		      -->
		      <aop:config>
				<!-- 
					 切入点表达式:定位方法用,有的方法需要切面配合,有的不需要
				 -->
				<aop:aspect   ref="myTransaction">
					<aop:pointcut   expression="execution(* cn.itcast.spring.aop.sh.PersonDaoImpl.*(..))"   id="perform"/>
					<aop:before  method="beginTransaction"  pointcut-ref="perform"/>
					<aop:after-returning  method="commit"  pointcut-ref="perform"  returning="var"/>
				</aop:aspect>
		      </aop:config>
		</beans>



execution(public  * * (..))          所有的公共方法


execution(* set* (..))         以set开头的任意方法


execution(* com.xyz.service.AccountService.* (..))              com.xyz.service.AccountService 类中的所有方法


execution(* com.xyz.service.*.* (..))                com.xyz.service 包中的所有的类的所有的方法


execution(* com.xyz.service..*.* (..))                 com.xyz.service 包及子包中的所有的类的所有的方法


execution(* cnitcast.spring.sh..*.* (String, ?, Integer))               com.xyz.service 包中的所有的类的有三个参数:
第一个参数为String,
第二个参数为任意类型,
第三个参数为Integer类型的方法。

    8、测试类PersonTest.java

		public  class  PersonTest{
			@Test
			public  void  test(){
				ApplicationContext context = new ClassPathXmlApplicationContext("cn/itcast/spring/aop/sh/applicationContext.xml");
				PersonDaoImpl personDao = (PersonDaoImpl)context.getBean("personDao");
				Person person = new Person();
				person.setPname("aaas");
				personDao.savePerson(person);
			}
		}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值