2.AOP的开发步骤
(1)普通业务组件(最平常的类)
(2)定义切入点(Pointcut)
(3)定义增强处理(Advise)
2.AOP的选择及几种实现方式
(1)使用AspectJ (见上篇示例)
(2)使用Spring AOP(可以使用注解的方式(推荐)和xml配置方式(了解))
以下主要讲Spring AOP的注解方式。
package springAop;
public interface UserDao {
int addUser();
void updataUser();
void deleteUser();
void findUser();
}
package springAop.imp;
import org.springframework.stereotype.Repository;
import springAop.UserDao;
//开启注解Repository,会自动扫描配置下会发布bean到容器
@Repository
public class UserDaoImp implements UserDao{
@Override
public int addUser() {
System.out.println("add user ......");
return 6666;
}
@Override
public void updataUser() {
System.out.println("update user ......");
}
@Override
public void deleteUser() {
System.out.println("delete user ......");
}
@Override
public void findUser() {
System.out.println("find user ......");
}
}
package springAop;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.AfterReturning;;
//必须要开启@Aspect注解。5中通知注解才有效
@Aspect
public class MyAspect {
@Before("execution(* springAop.imp.UserDaoImp.addUser(..))")
public void before(){
System.out.println("前置通知...");
}
@AfterReturning(value="execution(* springAop.imp.UserDaoImp.addUser(..))",returning = "returnVal")
public void AfterReturning(Object returnVal){
System.out.println("后置通知...."+returnVal);
}
}
<?xml version="1.0" encoding="GBK"?>
<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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
<!-- 指定自动搜索Bean组件、自动搜索切面类 -->
<context:component-scan base-package="springAop.imp"></context:component-scan>
<!-- 定义目标对象,由于开启了自动扫描。不再需要下边的bean,二选一即可 -->
<!-- <bean id="userDaoImp" class="springAop.imp.UserDaoImp" /> -->
<!-- 启动@AspectJ支持。以下两行可以启动,不启用也不我会出错。注意要aspect的三个jar包 -->
<!-- <aop:aspectj-autoproxy/> -->
<!-- <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" /> -->
</beans>
测试:
package springAop;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import springAop.imp.UserDaoImp;
public class Test {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");
UserDaoImp u = ac.getBean("userDaoImp",UserDaoImp.class);
u.addUser();
/*UserDaoImp u =new UserDaoImp();
u.addUser();*/
}
}
前置通知...
add user ......
后置通知....6666