AOP主要概念
**Cross Cutting Concern
是一种独立服务,它会遍布在系统的处理流程之中
**Aspect
对横切性关注点的模块化
**Advice
对横切性关注点的具体实现
**Pointcut(切入点)
它定义了Advice应用到哪些JoinPoint上,对Spring来说是方法调用、
**JoinPoint(连接点)
Advice在应用程序上执行的点或时机,Spring只支持方法的JoinPoint,这个点也可以使属性修改,如:Aspecj可以支持
**Weave(织入)
将Advice应用到Target Object上的过程叫织入,Spring支持的是动态织入
**Target Objec(目标)
Advice被应用的对象
**Proxy(代理)
Spring AOP默认使用JDK的动态代理,它的代理是运行时创建,也可以使用CGLIB代理
**Introduction
可以动态的为类添加方法
采用Annotation声明方式
引入jar包
* spring.jar
* log4j-1.2.14.jar
* commons-logging.jar
* aspectj/*.jar
建立userManger接口
package com.bjpowernode.spring;
public interface UserManager {
public void addUser(String username, String password);
public void delUser(int userId);
public String findUserById(int userId);
public void modifyUser(int userId, String username, String password);
}
建立 UserManagerImpl
package com.bjpowernode.spring;
public class UserManagerImpl implements UserManager {
public void addUser(String username, String password) {
//checkSecurity();
System.out.println("---------UserManagerImpl.add()--------");
}
public void delUser(int userId) {
//checkSecurity();
System.out.println("---------UserManagerImpl.delUser()--------");
}
public String findUserById(int userId) {
//checkSecurity();
System.out.println("---------UserManagerImpl.findUserById()--------");
return "张三";
}
public void modifyUser(int userId, String username, String password) {
//checkSecurity();
System.out.println("---------UserManagerImpl.modifyUser()--------");
}
// private void checkSecurity() {
// System.out.println("-------checkSecurity-------");
// }
}
SecurityHandler
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class SecurityHandler {
/**
* 定义Pointcut,Pointcut的名称为addAddMethod(),此方法没有返回值和参数
* 该方法就是一个标识,不进行调用
*/
@Pointcut("execution(* add*(..))")
private void addAddMethod(){};
/**
* 定义Advice,表示我们的Advice应用到哪些Pointcut订阅的Joinpoint上
*/
@Before("addAddMethod()")
//@After("addAddMethod()")
private void checkSecurity() {
System.out.println("-------checkSecurity-------");
}
}
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<!-- 启用AspectJ对Annotation的支持 -->
<aop:aspectj-autoproxy/>
<!-- 目标类 -->
<bean id="userManager" class="com.bjpowernode.spring.UserManagerImpl"/>
<!-- 切面 -->
<bean id="securityHandler" class="com.bjpowernode.spring.SecurityHandler"/>
</beans>
Client
public class Client {
public static void main(String[] args) {
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
//从Spring容器中获得
UserManager userManager = (UserManager)factory.getBean("userManager");
//执行
userManager.addUser("张三", "123");
}
}