- 浏览: 468155 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
yuan_bin1990:
您好,请问下demo如何运行啊,准备研究研究,但不知道入口啊。 ...
ssh2(struts2+spring2.5+hibernate3.3)自动生成代码程序 -
luyulong:
[b][/b][i][/i][ ...
jQuery进度条插件 jQuery progressBar -
txin0814:
mark..
读取文件目录 -
vurses:
[align=center][color=red][size= ...
include 与 jsp:include区别 -
Roshan2:
http://lijiejava.iteye.com/blog ...
Spring AOP 入门实例
(1)配置:
Spring的事务管理是通过AOP代理实现的,其中的事务通知由元数据驱动。代理对象与事务元数据结合产生一个AOP代理,它使用一个PlatformTransactionManager实现,配合TransactionInterceptor,在方法调用前后实施事务。
(2)测试
附:pointcut里的语法
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)其中带问号的modifiers-pattern?(public/protected) 和 declaring-type-pattern? throws-pattern? 可以不填
如execution(* *..BookManager.save(..))
第一颗* 代表ret-type-pattern 返回值可任意,
*..BookManager 代表任意Pacakge里的BookManager类。
如果写成com.xyz.service.* 则代表com.xyz.service下的任意类
com.xyz.service..* com.xyz.service则代表com.xyz.service及其子package下的任意类
save代表save方法,也可以写save* 代表saveBook()等方法
(..) 匹配0个参数或者多个参数的,任意类型
(x,..) 第一个参数的类型必须是X
(x,,,s,..) 匹配至少4个参数,第一个参数必须是x类型,第二个和第三个参数可以任意,第四个必须是s类型。
Spring的事务管理是通过AOP代理实现的,其中的事务通知由元数据驱动。代理对象与事务元数据结合产生一个AOP代理,它使用一个PlatformTransactionManager实现,配合TransactionInterceptor,在方法调用前后实施事务。
- <?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:context="http://www.springframework.org/schema/context"
- 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-2.5.xsd
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
- http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
- <description>springApp</description>
- <!-- dataSource for MySQL -->
- <bean id="dataSource"
- class="org.apache.commons.dbcp.BasicDataSource"
- destroy-method="close">
- <property name="driverClassName"
- value="com.mysql.jdbc.Driver" />
- <property name="url"
- value="jdbc:mysql://localhost:3306/springapp" />
- <property name="username" value="root" />
- <property name="password" value="****" />
- </bean>
- <!-- Hibernate SessionFactory for MySQL -->
- <bean id="sessionFactory"
- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <property name="mappingDirectoryLocations">
- <list>
- <value>classpath:/</value>
- </list>
- </property>
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">
- org.hibernate.dialect.MySQLDialect
- </prop>
- <prop key="hibernate.show_sql">true</prop>
- <prop key="hibernate.jdbc.fetch_size">50</prop>
- <prop key="hibernate.jdbc.batch_size">100</prop>
- </props>
- </property>
- </bean>
- <!--Transaction -->
- <bean id="txManager"
- class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- <property name="sessionFactory" ref="sessionFactory" />
- </bean>
- <aop:config> <!--use CGLIB:proxy-target-class="true-->
- <aop:pointcut id="serviceOperator" expression="execution(* com.logcd.business.service.*.*(..))"/>
- <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperator"/>
- <!--
- <aop:advisor pointcut="execution(* com.logcd.business.service..*Service.*(..))" advice-ref="txAdvice"/>
- -->
- </aop:config>
- <tx:advice id="txAdvice" transaction-manager="txManager">
- <tx:attributes>
- <tx:method name="find*" read-only="true" />
- <tx:method name="load*" read-only="true" />
- <tx:method name="is*" read-only="true"/>
- <tx:method name="save*"
- rollback-for="Exception"/>
- <tx:method name="insert*"
- rollback-for="Exception" />
- <tx:method name="remove*"
- rollback-for="Exception"/>
- <tx:method name="add*"
- no-rollback-for="Exception" />
- </tx:attributes>
- </tx:advice>
- <!--Transaction -->
- <!-- DAO -->
- <bean id="genericDao" lazy-init="true" abstract="true"
- class="com.logcd.bo.dao.impl.GenericDaoImpl">
- <property name="sessionFactory">
- <ref local="sessionFactory" />
- </property>
- </bean>
- <bean id="customersDao" parent="genericDao"
- class="com.logcd.bo.dao.impl.CustomersDaoImpl" />
- <bean id="customerDao" parent="genericDao"
- class="com.logcd.bo.dao.impl.CustomerDaoImpl" />
- <bean id="addressDao" parent="genericDao"
- class="com.logcd.bo.dao.impl.AddressDaoImpl" />
- <bean id="customerManageService"
- class="com.logcd.business.service.impl.CustomerManageServiceImpl"
- autowire="byName"/>
- </beans>
<?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:context="http://www.springframework.org/schema/context" 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-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> <description>springApp</description> <!-- dataSource for MySQL --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/springapp" /> <property name="username" value="root" /> <property name="password" value="****" /> </bean> <!-- Hibernate SessionFactory for MySQL --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mappingDirectoryLocations"> <list> <value>classpath:/</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.jdbc.fetch_size">50</prop> <prop key="hibernate.jdbc.batch_size">100</prop> </props> </property> </bean> <!--Transaction --> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <aop:config> <!--use CGLIB:proxy-target-class="true--> <aop:pointcut id="serviceOperator" expression="execution(* com.logcd.business.service.*.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperator"/> <!-- <aop:advisor pointcut="execution(* com.logcd.business.service..*Service.*(..))" advice-ref="txAdvice"/> --> </aop:config> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="find*" read-only="true" /> <tx:method name="load*" read-only="true" /> <tx:method name="is*" read-only="true"/> <tx:method name="save*" rollback-for="Exception"/> <tx:method name="insert*" rollback-for="Exception" /> <tx:method name="remove*" rollback-for="Exception"/> <tx:method name="add*" no-rollback-for="Exception" /> </tx:attributes> </tx:advice> <!--Transaction --> <!-- DAO --> <bean id="genericDao" lazy-init="true" abstract="true" class="com.logcd.bo.dao.impl.GenericDaoImpl"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean> <bean id="customersDao" parent="genericDao" class="com.logcd.bo.dao.impl.CustomersDaoImpl" /> <bean id="customerDao" parent="genericDao" class="com.logcd.bo.dao.impl.CustomerDaoImpl" /> <bean id="addressDao" parent="genericDao" class="com.logcd.bo.dao.impl.AddressDaoImpl" /> <bean id="customerManageService" class="com.logcd.business.service.impl.CustomerManageServiceImpl" autowire="byName"/> </beans>
(2)测试
- package com.logcd.test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import com.logcd.bo.Customers;
- import com.logcd.business.service.CustomerManageService;
- import junit.framework.TestCase;
- public class SpringServiceTest extends TestCase {
- private CustomerManageService customerManageService;
- protected void setUp() throws Exception {
- super.setUp();
- ApplicationContext app = new ClassPathXmlApplicationContext("appContext.xml");
- customerManageService = (CustomerManageService) app.getBean("customerManageService");
- }
- protected void tearDown() throws Exception {
- super.tearDown();
- }
- public void testService() throws Exception{
- Customers cus = new Customers();
- cus.setName("testService");
- cus.setAge(29);
- customerManageService.saveCustomers(cus);
- }
- }
package com.logcd.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.logcd.bo.Customers; import com.logcd.business.service.CustomerManageService; import junit.framework.TestCase; public class SpringServiceTest extends TestCase { private CustomerManageService customerManageService; protected void setUp() throws Exception { super.setUp(); ApplicationContext app = new ClassPathXmlApplicationContext("appContext.xml"); customerManageService = (CustomerManageService) app.getBean("customerManageService"); } protected void tearDown() throws Exception { super.tearDown(); } public void testService() throws Exception{ Customers cus = new Customers(); cus.setName("testService"); cus.setAge(29); customerManageService.saveCustomers(cus); } }
附:pointcut里的语法
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)其中带问号的modifiers-pattern?(public/protected) 和 declaring-type-pattern? throws-pattern? 可以不填
如execution(* *..BookManager.save(..))
第一颗* 代表ret-type-pattern 返回值可任意,
*..BookManager 代表任意Pacakge里的BookManager类。
如果写成com.xyz.service.* 则代表com.xyz.service下的任意类
com.xyz.service..* com.xyz.service则代表com.xyz.service及其子package下的任意类
save代表save方法,也可以写save* 代表saveBook()等方法
(..) 匹配0个参数或者多个参数的,任意类型
(x,..) 第一个参数的类型必须是X
(x,,,s,..) 匹配至少4个参数,第一个参数必须是x类型,第二个和第三个参数可以任意,第四个必须是s类型。
- aspectjweaver.jar (1.8 MB)
- 下载次数: 1
发表评论
-
Spring AOP 入门实例
2011-09-26 13:42 1440以Struts2+Spring为例,要求必须在登录之后才能实现 ... -
Spring MVC blog
2011-09-14 11:15 0REST in Spring 3: @MVC Pos ... -
Spring REST 是什么
2011-09-06 16:41 1006概述 REST是英文Repr ... -
Spring Rest
2011-09-06 16:31 3329由于下一版本的rapid-framwork需要集成spring ... -
spring 事务管理
2010-06-16 21:40 1016声明式的事务管理(Declarative transactio ... -
spring使用RMI暴露服务
2010-06-16 21:38 1649(1)定义接口: Java代码 pack ... -
spring jdbcTemplate使用
2010-06-16 21:36 1963(1)springJdbcContext.xml J ... -
Spring远程访问Web服务
2010-06-16 21:05 1044一、介绍 目前,Sp ... -
在SPRING中实现事务暂停
2010-06-11 14:00 971摘要 Spring框架是一个流行的基于轻量级控制反转容器的J ... -
Spring的事务属性意义------transactionAttributes
2010-05-25 08:56 928PROPAGATION_REQUIRED--支持当前事务,如果 ... -
spring java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter. <init>(Z)V
2010-05-20 17:57 1596因为cglib 包和asm包冲突 开始用的cglib包是cgl ... -
Spring整合webService xfire
2010-05-07 10:14 1667注意,需要下载Xfire1.2.6、spring2.0,hib ... -
实现JSON和POJO的相互转换
2010-04-25 22:14 1433import java.util.Collection; ... -
spring注解注入
2010-04-13 22:20 1767以前在使用spring是通过xml来注入的,每次增加一个ser ... -
关于spring 乱码经验
2009-12-29 13:47 1320spring 集成框架的乱码问题,真是搞了很久,下面我就提几点 ...
相关推荐
最后,Spring 1.x的AOP支持还允许自定义切点表达式,这是通过实现`org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator`类并注册到Spring容器来完成的。这种方式使得基于注解的切面...
在Spring AOP中,如果使用AspectJ注解或XML配置来定义切面,那么这个库是必不可少的,因为它使得Spring能够理解并执行AspectJ的切面定义。 2. **aspectjweaver.jar**:AspectJ Weaver `aspectjweaver.jar`是...
Spring AOP(面向切面编程)是Spring框架的一个重要组成部分,它提供了一种模块化和声明式的方式来处理应用程序中的横切关注点,如日志、事务管理等。在传统的面向对象编程中,这些关注点通常会侵入到业务逻辑中,而...
Spring框架是Java开发中广泛应用的一个开源框架,它以其强大的依赖注入(DI)和面向切面编程(AOP)能力而闻名。"com.springsource.org.aopalliance-1.0.0.jar"是Spring框架的一个关键组件,它包含了AOP Alliance库...
Spring AOP基于AspectJ提供了一种声明式的AOP支持,使得开发者可以专注于业务逻辑,而无需关心切面的实现细节。 总的来说,AspectJ Weaver 1.6.8.RELEASE作为一个成熟稳定的版本,为Java开发者提供了强大的AOP支持...
AOP Alliance是由Spring社区创建的一个开源项目,其主要目的是定义一组公共接口,这些接口被各种AOP框架广泛采纳,如Spring AOP和AspectJ。通过这些接口,开发者可以编写与具体AOP实现无关的代码,增加了代码的可...
总之,"Spring框架(6)AspectJ实现AOP共7页.pdf.zip"这份资料详细介绍了如何在Spring中使用AspectJ进行AOP编程,内容涵盖了切面、切点、通知、织入等多个关键概念,对于理解和实践Spring AOP具有很高的参考价值。...
Spring框架作为Java EE中的核心组件,提供了丰富的AOP支持,而`aopalliance`库则使得Spring能够与其他AOP框架如AspectJ进行无缝集成。例如,通过使用Spring的`@Aspect`注解定义切面,并结合`@Before`、`@After`等...
在Spring AOP中,切面可以通过注解或XML配置来定义。 - 连接点(Join Point):连接点是程序执行过程中的一个特定点,例如方法的调用或字段的访问。 - 切入点(Pointcut):切入点是连接点的集合,定义了切面将在...
Spring AOP,即Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为应用程序提供了一种模块化和声明式的方式来处理横切关注点,如日志、事务管理、性能监控等。在本"Spring-AOP源码Demo...
2. **配置AspectJ**:在Spring的配置文件中启用AspectJ自动代理,可以通过`<aop:aspectj-autoproxy>`标签来实现。 3. **定义切面**:创建一个Java类作为切面,该类需要使用`@Aspect`注解。在切面类中,我们可以定义...
在Spring框架中,AOP(Aspect Oriented Programming,面向切面编程)是其核心特性之一,它允许开发者将关注点从主业务逻辑中分离出来,如日志、事务管理等,形成独立的切面,实现代码的解耦和模块化。本篇将深入探讨...
首先,Spring AOP是Spring框架对传统面向对象编程的补充,它主要处理那些分散在应用程序各处的横切关注点,如日志、事务管理、性能监控等。通过AOP,这些关注点可以被模块化为独立的切面,从而提高代码的可读性和可...
其中,类文件可能包含了切面和被通知的对象,配置文件可能包含了Spring和AspectJ的配置,测试用例则用来验证AOP功能是否正常工作。 通过这个实验,你可以深入理解Spring和AspectJ如何协同工作,提升代码的可维护性...
Spring的AOP模块提供了一种声明式的方式来管理横切关注点,如日志记录、事务管理等。它支持四种类型的通知:前置通知(Before)、后置通知(After)、返回通知(After Returning)、异常通知(After Throwing)。...
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者定义“切面”,这些切面封装了关注点,如日志、事务管理或性能度量,从而将它们与业务逻辑分离。AspectJ是Java平台的一个开源项目,提供了...
其次,Spring的AOP特性允许我们定义横切关注点,如日志、事务管理等,这些关注点可以被编织到业务逻辑中,而不必侵入到核心代码。在4.3.x版本中,Spring提供了多种通知类型,包括前置、后置、环绕、异常和最终通知,...