- 浏览: 1087517 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
skyesx:
这是2PC实现,更常用的是一个柔性事务的实现,可以参考http ...
Spring分布式事务实现 -
ddbird:
这第一句就不严谨“分布式事务是指操作多个数据库之间的事务”,显 ...
Spring分布式事务实现 -
呵呵6666:
基于互联网支付系统的微服务架构分布式事务解决方案http:// ...
Spring分布式事务实现 -
小黄牛:
写得不错,交流群:472213887
Spring分布式事务实现 -
jiaoqf321456:
这明明是用的apache的压缩,给ant.jar有半毛钱关系吗 ...
使用ant.jar进行文件zip压缩
在Java 语言中,从织入切面的方式上来看,存在三种织入方式:编译期织入、类加载期织入和运行期织入。编译期织入是指在Java编译期,采用特殊的编译器,将切面织入到Java类中;而类加载期织入则指通过特殊的类加载器,在类字节码加载到JVM时,织入切面;运行期织入则是采用CGLib工具或JDK动态代理进行切面的织入。
AspectJ采用编译期织入和类加载期织入的方式织入切面,是语言级的AOP实现,提供了完备的AOP支持。它用AspectJ语言定义切面,在编译期或类加载期将切面织入到Java类中。
AspectJ提供了两种切面织入方式,第一种通过特殊编译器,在编译期,将AspectJ语言编写的切面类织入到Java类中,可以通过一个Ant或Maven任务来完成这个操作;第二种方式是类加载期织入,也简称为LTW(Load Time Weaving)。
使用AspectJ LTW有两个主要步骤,第一,通过JVM的-javaagent参数设置LTW的织入器类包,以代理JVM默认的类加载器;第二,LTW织入器需要一个 aop.xml文件,在该文件中指定切面类和需要进行切面织入的目标类。
设置-javaagent JVM参数的方法:
(1)在Eclipse下的设置:
运行类->右键单击->Run As->Run...,可以在弹出的Run设置窗口设置该类的各项运行属性,切换到Arguments Tab页,在VM arguments中通过-javaagent指定AspectJ 织入器类包。-javaagent:E:\workspace\lib\spring2.5\aspectjweaver.jar
(2)在Tomcat下的设置
打开<Tomcat_Home>\bin\catalina.bat,在该批处理文件头部添加以下的设置:
set JAVA_OPTS=-javaagent:E:\workspace\lib\spring2.5\aspectjweaver.jar
一、配置LTW织入器的aop.xml配置文件
LTW织入器在工作时,首先会查找类路径下META-INF /aop.xml的配置文件,并根据配置文件的设置进行织入的操作。
二、切面织入的目标类和切面实例
三、Spring配置文件applicationContext.xml
四、测试
AspectJ采用编译期织入和类加载期织入的方式织入切面,是语言级的AOP实现,提供了完备的AOP支持。它用AspectJ语言定义切面,在编译期或类加载期将切面织入到Java类中。
AspectJ提供了两种切面织入方式,第一种通过特殊编译器,在编译期,将AspectJ语言编写的切面类织入到Java类中,可以通过一个Ant或Maven任务来完成这个操作;第二种方式是类加载期织入,也简称为LTW(Load Time Weaving)。
使用AspectJ LTW有两个主要步骤,第一,通过JVM的-javaagent参数设置LTW的织入器类包,以代理JVM默认的类加载器;第二,LTW织入器需要一个 aop.xml文件,在该文件中指定切面类和需要进行切面织入的目标类。
设置-javaagent JVM参数的方法:
(1)在Eclipse下的设置:
运行类->右键单击->Run As->Run...,可以在弹出的Run设置窗口设置该类的各项运行属性,切换到Arguments Tab页,在VM arguments中通过-javaagent指定AspectJ 织入器类包。-javaagent:E:\workspace\lib\spring2.5\aspectjweaver.jar
(2)在Tomcat下的设置
打开<Tomcat_Home>\bin\catalina.bat,在该批处理文件头部添加以下的设置:
set JAVA_OPTS=-javaagent:E:\workspace\lib\spring2.5\aspectjweaver.jar
一、配置LTW织入器的aop.xml配置文件
LTW织入器在工作时,首先会查找类路径下META-INF /aop.xml的配置文件,并根据配置文件的设置进行织入的操作。
<?xml version="1.0" encoding="UTF-8"?> <aspectj> <aspects> <!-- ①切面类 --> <aspect name="quickstart.aspectj.Monitor" /> </aspects> <weaver options="-showWeaveInfo -XmessageHandlerClass:org.springframework.aop.aspectj.AspectJWeaverMessageHandler"> <!-- ② 指定需要进行织入操作的目标类范围 --> <include within="quickstart.service..*" /> </weaver> </aspectj>
二、切面织入的目标类和切面实例
package quickstart.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import quickstart.dao.PersonDao; import quickstart.model.Person; import quickstart.service.PeopleService; public class PeopleServiceImpl implements PeopleService{ //通过类型(byType为默认)的自动连接可能会有多个候选, //通过使用@Qualifier注解,使用名称(byName)来限定 @Autowired @Qualifier("personDao") private PersonDao personDao; @Transactional(propagation = Propagation.REQUIRED) public void savePerson(Person person) { personDao.save(person); } @Transactional(readOnly = true, propagation = Propagation.REQUIRED) public Person findPersonById(Integer id) { return personDao.findById(id); } @Transactional(readOnly = true, propagation = Propagation.REQUIRED) public List findPersonByJPQL(String jpql){ return personDao.findByJPQL(jpql); }
package quickstart.aspectj; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; @Aspect public class Monitor { @Pointcut("execution(* quickstart.service.impl.*.*(..))") public void anyService(){} @Before("quickstart.aspectj.Monitor.anyService()") public void log(JoinPoint joinPoint){ System.out.println("Service Method " + joinPoint.getSignature().getName() + " Invocation!"); } }
三、Spring配置文件applicationContext.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-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"> <!-- 需要指定factory-method="aspectOf"属性,以便确保Spring从AspectJ获取切面实例,而非自己创建该实例。 --> <bean id="momitor" class="quickstart.aspectj.Monitor" factory-method="aspectOf"/> <!-- 自动装配注解Bean后置处理器 --> <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> <!-- JPA注解Bean后置处理器 --> <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> <!-- 利用Spring的实体管理器工厂来创建JPA实体管理器 --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="database" value="MYSQL" /> <property name="showSql" value="true" /> <!-- <property name="generateDdl" value="true" /> --> </bean> </property> </bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=UTF-8" /> <property name="username" value="root" /> <property name="password" value="root" /> </bean> <!-- 声明一个Spring提供的JPA事务管理器,传入的参数是Spring中的实体管理器工厂 --> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <!-- 开启Spring提供的基于注解的声明式事务管理 --> <tx:annotation-driven transaction-manager="transactionManager" /> <!-- 直接使用Spring的 JpaTemplate --> <bean id="jpaTemplate" class="org.springframework.orm.jpa.JpaTemplate"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <bean id="personDao" class="quickstart.dao.impl.PersonDaoImpl" autowire="byName"/> <bean id="peopleService" class="quickstart.service.impl.PeopleServiceImpl"/> </beans>
四、测试
package logcd.test; import java.util.List; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import quickstart.model.Address; import quickstart.model.Person; import quickstart.service.PeopleService; public class JpaServiceTest { private static ApplicationContext appContext; private static PeopleService peopleService; @BeforeClass public static void Init(){ appContext = new ClassPathXmlApplicationContext("applicationContext.xml"); peopleService = (PeopleService)appContext.getBean("peopleService"); } @Test public void findById(){ Person person = peopleService.findPersonById(new Integer(2)); System.out.println(person.getFirstName()+person.getLastName()); //System.out.println(person.getAddress().getStreetName()); } @Test public void findByJPQL(){ StringBuilder jpql = new StringBuilder(); jpql.append(" FROM Person p JOIN FETCH p.address"); List list = peopleService.findPersonByJPQL(jpql.toString()); for(Object obj : list){ Person person = (Person)obj; System.out.println(person.getFirstName() + person.getLastName()); System.out.println(person.getAddress().getStreetName()); } } }
发表评论
-
SpringBoot开发WebService之Axis
2019-07-14 23:56 4598一、服务器端发布WebService服务 1、POM.xml文 ... -
SpringBoot开发WebService之CXF
2019-07-14 23:56 1197一、在服务器端的WebSerivce服务发布 1、POM.xm ... -
SpringBoot项目非web方式启动
2019-07-03 17:02 46611、springboot 1.x中以非web方式启动 @S ... -
SpringBoot使用Druid数据库密码加密
2019-03-06 23:28 14191、生成公钥、私钥和密码加密串 java -cp drui ... -
Spring Annotation
2010-12-02 17:14 0Spring2.x引入了组件自动扫描机制,可以在类路径底 ... -
Spring分布式事务实现
2010-11-10 14:28 83116分布式事务是指操作多个数据库之间的事务,spring的 ... -
Spring3 Annotation + Hibernate3-jpa2.0 + CGLIB + 多数据源
2010-08-19 09:30 10470一、定义一个测试用Entity。 @Entity pub ... -
使用iBatis2.0
2010-05-26 10:20 0一、NULL问题 ibatis操作oracle数据库时, ... -
Spring2.0 AOP AspectJ 注释实现
2010-01-04 14:24 5533一、AOP基本概念 切面(Aspect): 一个关注点的模块 ... -
Spring + JPA + Hibernate配置
2010-01-04 14:24 34689<1>persistence.xml放到类路径下的 ... -
配置spring数据源
2009-11-06 16:47 1207配置一个数据源 Spring在第三方依赖包中包含了两 ... -
hibernate的dialect
2009-07-23 10:04 5399一、hibernate的dialect RDBM ... -
spring ibatis入门
2009-04-20 14:16 3835一、applicationContext.xml <?x ... -
Hibernate缓存配置/批量处理
2009-03-25 21:50 10898Hibernate除了自动对Se ... -
Hibernate的一级与二级缓存
2009-03-25 21:24 1669缓存是介于应用程序和物理数据源之间,其作用是为了降低应用 ... -
spring jdbcTemplate使用
2008-07-15 17:17 78157一、使用示例 (1)springJdbcContext.xml ... -
Spring2.X以AspectJ 式AOP 配置事务
2008-07-10 13:23 2027(1)配置: Spring的事务管理是通过AOP代理实 ... -
spring 事务管理
2008-07-08 16:35 11915声明式的事务管理(Declarative transactio ... -
Hibernate中one-to-many/many-to-one和many-to-many
2008-06-28 17:03 3927<1>one-to-many/many-to-on ... -
Hibernate中的对象one-to-one关系
2008-06-26 22:55 2438(1) 通过主健参考,限制2个数据表中的主健使用相同的值 c ...
相关推荐
NULL 博文链接:https://thinkdifferent.iteye.com/blog/2037754
使用AspectJ的Spring Boot加载时编织示例 这是一个用AspectJ编织Spring Boot加载时间的示例。 这是前面的的延续。 加载时间编织 加载时编织是一种二进制编织,其中已编译的Java类在运行时(而不是编译时)作为输入。...
spring-aspectj-compiletime-weaving 这是一个示例项目,说明了如何在 java 8 环境中结合 spring 使用 aspectj。 UnmanagedClass 类用于说明如何在非托管 bean 中自动装配 bean。
Table of Contents 前言 1. 简介 1.1. 概览 1.1.1. 使用场景 2. Spring 2.0和 2.5的新特性 ...2.3.4. 对AspectJ装载时织入(AspectJ load-time weaving)的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置
Spring 使用AspectJ 实现 AOP(基于xml文件、基于注解)
AspectJ_sample 这是在Maven项目中使用AspectJ的示例。 AspectJLTWSample:加载时编织示例AspectJSample:编译时编织示例
2.3.4. 对AspectJ装载时织入(AspectJ load-time weaving)的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. 对Websphere 事务管理的完整支持 2.4.3. JPA 2.4.4. 异步的JMS 2.4.5. JDBC ...
要在 Spring 应用中使用 AspectJ 注解, 必须在 classpath 下包含 AspectJ 类库: aopalliance.jar、aspectj.weaver.jar 和 spring-aspects.jar等jar包,文件已打包上传。
Spring demo to demonstrate aop using aspectj with xml based configuration.
Spring 使用AspectJ 实现 AOP之前置通知小例子,实际跑过,验证可信。
使用AspectJ的Spring Boot Source Weaving(编译时)示例 这是一个使用AspectJ进行Spring Boot源编织(编译时)的示例。 源编织 当所有源代码(包括注释类,方面类和目标类)都可用时,AspectJ源编织是编译时编织。 ...
用于在Spring 2.0中集成AspectJ AspectJ LTW织入器 ognl.jar OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以...
许多开发人员都对aop感兴趣 —— 特别是对aspectj感兴趣,这个java编程语言的开源...如果想了解aop如何改变软件开发的方式,如何使用aspectj使代码更加模块化,更易于开发、维护、演进和部署,那么本书确实很适合你。
除了Spring的aop,还有AspectJ框架的aop,这里是在Spring框架中使用AspectJ框架实现AOP的补充jar包,还有一个jar包会随着Spring框架的版本更新而更新。这也是分开成spring框架包和在Spring框架中使用AspectJ框架实现...
aspectj-1.7.0.jar aspectj的包
Spring spectJ AOP 前置通知 后置通知 返回通知 异常通知 环绕通知
aspectj
什么是AOP AOP是 Aspect Oriented Programming 的缩写,即面向切面编程,和平常遇到的...如果使用原生AspectJ在项目中配置会非常麻烦,在GitHub上有个开源的SDK gradle_plugin_android_aspectjx基于gradle配置即可。
Aspectj驱动Aspectj驱动Aspectj驱动Aspectj驱动Aspectj驱动Aspectj驱动Aspectj驱动Aspectj驱动Aspectj驱动Aspectj驱动
android用aspectj在android如何用动态代理的