在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...