使用AspectJ LTW(Load Time Weaving)

阅读更多
    在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下的设置
打开\bin\catalina.bat,在该批处理文件头部添加以下的设置:
set JAVA_OPTS=-javaagent:E:\workspace\lib\spring2.5\aspectjweaver.jar

一、配置LTW织入器的aop.xml配置文件
    LTW织入器在工作时,首先会查找类路径下META-INF /aop.xml的配置文件,并根据配置文件的设置进行织入的操作。


	
		
		
	
	
		
		
	


二、切面织入的目标类和切面实例
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



	
	
	
	
	
    
    
    

	
    
        
        
            
                
                
                
            
        
    

    
        
        
        
        
    
	
	 
    
        
    

	
    
 	
 	
	
		
	

	
	
	


四、测试
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());
		}
	}
}

你可能感兴趣的:(Spring,AOP,JPA,配置管理,JVM)