Spring中使用Aop

在spring中使用aop的条件

1:加入aop名称空间




如果目标类(target)没有实现接口就会抛出异常,因为spring默认是使用java的动态代理来实现的,如果目标类没有实现接口就没有办法产生代理对象,所以应该倒入cglib包,这样就没有这个限制了,就算目标类没有实现接口也能正确产生代理对象。

实现spring的aop有两种方式一种是基于注解的 而另一种是基于声明式,下面将分别举例说明

1:基于注解的方式的aop的实现,这里只象征性的使用了@Before advice  spring还支持 @AfterReturnning @AfterThrowing @After @Around

如果要实现基于注解的方式的aop首先要在配置文件中添加aop的注解的支持



    
    
    
    

2:定义一个普通的java类,而这个类就是你的切面程序

01.package test.spring.service;  
02.import org.aspectj.lang.annotation.Aspect;  
03.import org.aspectj.lang.annotation.Before;  
04./**  
05. * 加入@Aspect注解声明这个一个切面程序  
06. * @author weipeng  
07. *  
08. */  
09.@Aspect  
10.public class AopLog {  
11.    @Before("execution(public * test.spring.dao.impl.UserDaoImpl.*(..))")   //织入的方法执行之前  
12.    public void before(){  
13.        System.out.println("before...");  
14.    }  
15.} 


还有另外一种方式就是使用pointcut

package test.spring.service;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
/**
 * 加入@Aspect注解声明这个一个切面程序
 * @author weipeng
 *
 */
@Aspect
public class AopLog {
	/**
	 * 用@Pointcut定义一个切入点集合
	 */
	@Pointcut("execution(public * test.spring.dao.impl.UserDaoImpl.*(..))")
	public void myCut(){};
	
	@Before("myCut()")
	public void before(){
		System.out.println("before...");
	}
}

IUserDao.java

package test.spring.dao;

public interface IUserDao {
	public void add();
	public void del();
}

UserDaoImpl.java 这个就是目标类 实现了IUserDao 接口

package test.spring.dao.impl;
import test.spring.dao.IUserDao;
public class UserDaoImpl implements IUserDao {
	@Override
	public void add() {
		// TODO Auto-generated method stub
		System.out.println("user add...");
	}
	@Override
	public void del() {
		// TODO Auto-generated method stub
		System.out.println("user del...");
	}
}

UserService.java

package test.spring.service;

import javax.annotation.Resource;

import test.spring.dao.IUserDao;

public class UserService {

	private IUserDao userDao;

	public IUserDao getUserDao() {
		return userDao;
	}
	@Resource
	public void setUserDao(IUserDao userDao) {
		this.userDao = userDao;
	}
	
	public void userAdd(){
		userDao.add();
	}
	public void userDel(){
		userDao.del();
	}
}


spring配置文件



    
    
    
    
    
    
    


测试类

package test.spring.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import test.spring.service.UserService;

public class UserServiceTest {

	@Test
	public void userServiceTest(){
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
		
		UserService us=(UserService) ac.getBean("userService");
		
		us.userAdd();
	}
}

输出:

before...
user add...
2:基于XML配置的AOP的实现

1:切面类AopLog.java 此时的切面类完全是一个普通的切面类

package test.spring.service;
/**
 * 
 * @author weipeng
 *
 */
public class AopLog {
	public void before(){
		System.out.println("before...");
	}
}

IUserDao.java

package test.spring.dao;

public interface IUserDao {
	public void add();
	public void del();
}

UserDaoImpl.java 目标类

package test.spring.dao.impl;
import test.spring.dao.IUserDao;
public class UserDaoImpl implements IUserDao {
	@Override
	public void add() {
		// TODO Auto-generated method stub
		System.out.println("user add...");
	}
	@Override
	public void del() {
		// TODO Auto-generated method stub
		System.out.println("user del...");
	}
}

spring配置文件



    
    
    
    
    	
    	
    		
    	
    
    
    


测试类:
package test.spring.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import test.spring.service.UserService;

public class UserServiceTest {

	@Test
	public void userServiceTest(){
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
		
		UserService us=(UserService) ac.getBean("userService");
		
		us.userAdd();
	}
}


输出:

before...
user add...












你可能感兴趣的:(Spring,string,aop)