AOP(Aspect Oriented Programming),是一种面向切面的编程思想。可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态添加统一功能的一种技术。
我觉得AOP的编程思想还是不难理解的,主要是要理解一些术语。既然是面向切面编程,首先要明白什么是切面,切面(Aspect)也就是第二句解释中说的给程序动态添加的那些功能。例如,在一个业务流程中,插入与该流程的业务逻辑无关的系统服务逻辑(如日志、权限、事务等),这些功能独立出来封装到一个类中,这些类成为横切关注类,这些类对应的对象就是切面。它们只需要编写一次,就可以根据需要添加到整个应用程序的任何一个地方。
Spring AOP是一个AOP的实现框架,不同的AOP框架会有不同的AOP实现方式,主要差别在于如何实现切入点、通知以及他们如何被织入到程序中。另外,Spring AOP也是spring中一些子框架或子功能所依赖的核心。(编程式事务就是通过AOP实现。)
下面是一个使用Spring AOP实现的功能:
1. 创建并实现接口
public interface UserManager{
public void addUser(String name,String password);
}
public class UserManagerImpl implements UserManager{
public void addUser(String name,String password){
System.out.println("-----添加用户-----");
}
}
2. 建立横切关注类
public class Check{
public void check(){
System.out.println("-----验证方法------");
}
}
3. 配置文件
<bean id="userManager" class="com.spring.UserManagerImpl"/>
<bean id="check" class="com.spring.Check"/>
<aop:config>
<aop:aspect id="checkAspect" ref="check">
<!--通过正则表达式指定所有已add-->
<aop:pointcut id="addAddMethod" expression = "execution(* add*(..))"/>
<!--定义Advice-->
<aop:before method="Check" pointcut-ref="addAddMethod"/>
</aop:aspect>
</aop:config>
4. 客户端
public class client{
public static void main(String[] args){
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
UserManager userManager=(UserManager)factory.getBean("userManager");
userManager.addUser("Name","Password");
}
}
有了上面的例子,我们再来了解AOP的术语:
1. 切面(Aspect)在第二段中已经解释过,代码中的Check对象就是一个Aspect。
2. 通知(Advice)方面在某个具体连接点采取的行为或动作,上面的Check()方法就是一个Advice。通知有Before Advice、After Advice、 Around Advice、Throw Advice。
3. 切入点(Pointcut)上面的切入点就是通过正则表达式定义的add*
4. 连接点(Joinpoint)指定某个通知在什么地方执行,上面的切入点就是addUser()
使用AOP思想编程,前提是要找出横切关注点,书上说,它是遍布在程序各个角落的,那就意味着多个地方都需要用到这个功能,如果仅仅为满足一处需要,也就没必要抽取出来了。所以,我认为,理解和使用AOP并不难,关键在于抽象出横切关注点。