spring3.0 - AOP编程

了解一下基础知识:
切面(Aspect):关注点的模块化,关注点可能横切多个对象
连接点(Join point): 运用程序执行过程中需要入插切面模块的某一点, 主要强调的是一个具体的”点”
概念,该点可以是一个方法、一个属性、构造函数、类静态初始化块,甚至一条语句。
切入点(Pointcut):一个或多个连接点,可以理解成一个点的集合
通知(Advice):定义切面中实际的逻辑实现,如日志的写入实际代码,或是安全检查的实际代码。
  前置通知(before advice):在方法的调用之前
  最终通知(after advice):在方法的最后,并且在所有其它通知之后
  环绕通知(around advice):分别在方法的调用之前和之后
  后置通知(after returning advice):在方法的最后
  异常通知(after throwing advice):在方法出现异常时

第一步,导入相关的jar包:aspectjweaver-1.6.8.jar(提供注解org.aspectj.lang.annotation.Aspect等)、spring-aop-3.0.4.RELEASE.jar(提供自动代理创建器org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator)、aopalliance-1.0.jar(提供拦截器功能)。
第二步,配置springMVC-servlet.xml
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"

<!--配置aop自动创建代理-->
    <aop:aspectj-autoproxy/>
    <bean id="aopSecurity" class="com.aliks.test.aop.util.SecurityHandlerAOP"/>

第三步,AOP类处理
@Component
@Aspect
public class SecurityHandlerAOP {
private int num=0;
// 在执行指定方法前执行
@Before("execution(* com.aliks.test.mvc.service.*.*(..))")
protected void checkUserSecurity() {
System.out.println("在方法执行前通知!");
num++;
System.out.println("访问次数:"+num);
}

@After("execution(* com.aliks.test.mvc.service.*.*(..))")
protected void checkResult() {
System.out.println("在方法执行后通知!");
}

}
第四步,需要切面的类和方法
@Service("userManager")
public class UserManagerImpl implements UserManager {

@Override
public void addUser(String name) {
System.out.println("add user name:"+name);

}
第五步:controller层请求进入
@Controller
public class HelloWoldController {
@Autowired
private UserManager userManager;

@RequestMapping("/hello")
public ModelAndView helloWold()
{
System.out.println("start");
String message =new ToolTest().getString();
//调用service层
//增加用户名称测试
userManager.addUser("admin Test");
return new ModelAndView("hello","message",message);
}
}
第六步:测试结果
在方法执行前通知!
访问次数:1
add user name:admin Test
在方法执行后通知!


切入点(Pointcut):一个或多个连接点,可以理解成一个点的集合
// 使用一个返回值为void,方法体为空的方法来命名切入点 
@Pointcut("execution(* com.aliks.test.mvc.service.*.*(..))")
private void check(){}
// 在执行指定方法前执行
@Before("check()")
protected void checkBefore() {
System.out.println("Before-在方法执行前通知!");
num++;
System.out.println("Before-访问次数:" + num);
}

猜你喜欢

转载自qiuhuihui.iteye.com/blog/2091807
今日推荐