AOP已经在上一篇文章中做了宏观介绍,那AOP在Spring中如何实现,大家是不是很好奇。接下来我们将介绍其中的一种实现方式--》注解方式。
代码如下:
//Manager接口:
packagecom.huxj.spring;
publicinterface UserManager {
publicvoid addUser();
}
//ManagerImpl实现:
publicclass UserManagerImpl implements UserManager {
//1.操作时都要进行安全检查
@Override
publicvoid addUser() {
// checkSecurity();
System.out.println("---UserManagerImpl.addUser()----");
}
}
<span style="font-family: Calibri; font-size: 10.5pt; background-color: rgb(255, 255, 255);"> </span>
//配置文件:
<!-- 启用Aspect对Annotation的支持 -->
<aop:aspectj-autoproxy />
<beanid="userManager"class="com.huxj.spring.UserManagerImpl"/>
<beanid="securityHandler"class="com.huxj.spring.SecurityHandler"/>
通过"<aop:aspectj-autoproxy/>"启用注解,通过配置目标类和模块化类Ioc容器会自动创建对象和管理他们之间的关系,最终的效果就是当程序运行时,我们仍然是动态代理的方式来实现我们的操作。
//横切性关注点模块化
//将安全性独立服务(横切性关注点)模块化,
@Aspect
publicclass SecurityHandler {
//安全性检查的范围,也就是ponitCut;
//execution(*add*(..)标示检查范围,第一个“*”返回值任意,第二个“*”以add开头的方法,“..”参数任意
//addMethod()是一个标示,的目的是为了找到@Pointcut注解,即方法作用范围
@Pointcut("execution(*add*(..))")
privatevoid addMethod(){};
//安全性检查方法,即横向性切入点(crossCuttingConcern).定义advice,然后服务与我们的joinpoint上。
@Before("addMethod()")
privatevoid checkSecurity() {
System.out.println("-------checkSecurity-------");
}
}
在模块类里面,定义横向切入点;然后通过advice注解的确定其在joinPont的位置;通过一个标识方法(没有实际的意义)
通过execution来确定横向切入点的范围
//客户端:
packagecom.huxj.spring;
importorg.springframework.beans.factory.BeanFactory;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
publicclass Client {
/**
* @param args
*/
publicstatic void main(String[] args) {
BeanFactorybeanFactory=newClassPathXmlApplicationContext("applicationContext-*.xml");
UserManageruserManager=(UserManager) beanFactory.getBean("userManager");
userManager.addUser();
}
}
运行结果::
-------checkSecurity-------
---UserManagerImpl.addUser()----
总结:
我们的程序采用AOP采用注解的方式,把独立服务在程序运行的时候切入到程序中。实现的核心思想是动态代理。