Spring——AOP

          AOP(AspectOrient Programming),也就是面向切面编程。AOP将应用系统分为两部分,核心业务逻辑(Core business concerns)及横向的通用逻辑,也就是所谓的方面Crosscuttingenterprise concerns,例如,所有大中型应用都要涉及到的持久化管理(Persistent)、事务管理(Transaction Management)、安全管理(Security)、日志管理(Logging)和调试管理(Debugging)等。

AOP概念:

 让我们从定义一些重要的AOP概念开始。

方面(Aspect):

               一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。

 

连接点(Joinpoint):

             程序执行过程中明确的点,如方法的调用或特定的异常被抛出。

 

通知(Advice):

            “切面”对于某个“连接点”所产生的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。

 

切入点(Pointcut):

             指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点,例如,使用正则表达式。

 

引入(Introduction):

            添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现IsModified接口,来简化缓存。

 

目标对象(Target Object):

            包含连接点的对象,也被称作被通知或被代理对象。

 

AOP代理(AOP Proxy):

           AOP框架创建的对象,包含通知。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。强制使用CGLIB代理需要将 <aop:config> 的 proxy-target-class 属性设为true

 

编织(Weaving):

           组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。

 

 

实现原理:

            AOP 实际上是由目标类的代理类实现的。AOP 代理其实是由 AOP 框架动态生成的一个对象,该对象可作为目标对象使用。AOP 代理包含了目标对象的全部方法,但 AOP 代理中的方法与目标对象的方法存在差异,AOP 方法在特定切入点添加了增强处理,并回调了目标对象的方法。

 

简单使用:

 

数据对象——UserManager

packagecom.tgb.spring;
 
public interfaceUserManager {
 
public voidaddUser(String username,String password);
 
public voiddelUser(int userId);
 
public String findUserById(intuserId);
 
public voidmodifyUser(int userId,String username,String password);
}


 

UserManagerImpl

packagecom.tgb.spring;
 
public classUserManagerImpl implements UserManager {
 
publicUserManagerImpl(){
 
}
 
public void addUser(Stringusername, String password) {
//checkSecurity();
System.out.println("--------UserManagerImpl.addUser---------");
 
}
 
 
public voiddelUser(int userId) {
//checkSecurity();
System.out.println("--------UserManagerImpl.delUser---------");
 
}
 
 
public StringfindUserById(int userId) {
//checkSecurity();
System.out.println("--------UserManagerImpl.findUserById---------");
return "王五";
}
 
public voidmodifyUser(int userId, String username, String password) {
//checkSecurity();
System.out.println("--------UserManagerImpl.modifyUser---------");
 
}
 
 
}


 

SecurityHandler

packagecom.tgb.spring;
importorg.aspectj.lang.JoinPoint;
public classSecurityHandler {
 
publicSecurityHandler(){
 
}
private voidcheckSecurity(JoinPoint join){
//如果传入参数,则可以拿到参数
for(inti=0;i<join.getArgs().length;i++){
System.out.println(join.getArgs()[i]);
}
//拿到方法名称
System.out.println(join.getSignature().getName());
System.out.println("-----我噢噢噢噢噢噢哦真的用了checkSecurity哦噢噢噢噢哦---------");
}        
}


 

配置文件:applicationContext.xml

 

客户端测试:

public void test(){
BeanFactoryfactory=new ClassPathXmlApplicationContext("applicationContext.xml");
UserManageruserManager = (UserManager)factory.getBean("userManager");
userManager.addUser("张三", "123");
}


 

 

运行结果:


      本例子是通过配置xml文件来实现的,当然还可以使用注解的方式。

 

总结:

          通过运行结果和实现原理我们得出结论:AOP是由代理类实现的。在运行期将切面织入到Spring管理的Bean中,代理类封装了目标类,拦截被通知的方法的调用,再将调用转发给真正的目标Bean。当拦截到方法调用时,在调用目标类之前代理会执行切面逻辑。一句话:IOC是工厂;AOP是代理。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。