AOP是OOP的延续,是软件开发中的一个热点。
AOP技术,是OOP补充。OOP引入封装,继承和多态建立一种对象层次结构模拟公共行为集合,而对从左到右的关系则显得无能为力。对于AOP则恰恰适应这种横切技术。
简单说,就与业务无关,却为了业务模块所共同调用的逻辑封装起来,便于减少系统重复代码,降低模块间耦合度,利用维护和可操作性
横切技术将软分为两部分:核心关注点和横切关注点:业务处理流程为核心关注,与之关系不大的是横切关注。如:系统中各处都相似的日志,事务,权限成为横切关注点。AOP作用是将核心点与横切点分开。
实现的一些技术点有:
Aspect:横切关注点的模块,表示在哪里做和做什么(一个类,是advice和point的结合)
Advice:表示做什么
Point:是joinpoint的集合,表示在哪里做的集合
Jointpoint:程序执行的一个精确点,例如类的一个方法,是抽象的概念,不一定要定义一个joinpoint。
没有aspect:我们如何设计系统。如模拟一个系统模块中某个方法
//BusinessLogic属于核心关注点,它会调用到Security,Logging,Persistence等横切关注点。 public classBusinessLogic { public void SomeOperation() { //验证安全性;Securtity关注点; //执行前记录日志;Logging关注点; DoSomething(); //保存逻辑运算后的数据;Persistence关注点; //执行结束记录日志;Logging关注点; } }
几乎每个业务方法都是这样,重复性太大,AOP的目的,就是将注入logging之类的横切关注点从bussinessz中分类。形成单独的Aspect
这就保证了横切关注点的复用。由于BusinessLogic类中不再包含横切关注点的逻辑代码,为达到调用横切关注点的目的,可以利用横切技术,截取BusinessLogic类中相关方法的消息,例如SomeOperation()方法,然后将这些“aspect”织入到该方法中
AOP代码实现对添加做权限验证和日志效果,此为annotation实现注解
1 定义eao接口
packagecom.bjpower.node.spring.dao; public interfaceIUserDao { publicvoid addUser(String username, String password); }
实现类
package com.bjpower.node.spring.dao; public class UserDaoOracle implements IUserDao { @Override public void addUser(String username, String password) { // TODO Auto-generated method stub System.out.println("----------userDalOral.adduser--------"); }
2 manager接口
package com.bjpower.node.spring.manager; public interface UserManager { public void addUser (String username, String password); }
manager实现类
package com.bjpower.node.spring.manager; import com.bjpower.node.spring.dao.IUserDao; import com.bjpower.node.spring.dao.UserDaoOracle; public class UserManagerImp implements UserManager { public void addUser(String username, String password) { userDao.addUser(username, password); } private IUserDao userDao; public void setUserDao(IUserDao userDao) { this.userDao = userDao; } ///set方法的默认配置 public UserManagerImp() { } }
3 建立横切对象
3.1引入依赖包 spring.jar ,log4j.jar commons-logging.jar aspectj.jar
3.2建立aspect横切类
3.3注解定义pointcut和advice
package com.bjpower.node.spring; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; @Aspect public class SecurityHandler { //advice要指定范围,pointcut为该范围指定用在哪里 @Pointcut("execution(* add*(..)) )") private void addAddMethod(){}; /*** * before指定advice的方式 * @param joinPoint 获取截获的方法和参数 */ @Before("addAddMethod()") //joinpoint为横切获取客户信息 private void checkSecurity(JoinPoint joinPoint){ for (int i = 0; i<joinPoint.getArgs().length;i++) { System.out.println(joinPoint.getArgs()[i]); } System.out.println(joinPoint.getSignature().getName()); System.out.println("----------checkSecurity----"); } }
"execution(* add*(..)) )为查询表达式
第一个*为返回值,
第二个参数为拦截的方法名称,可以有模糊匹配,也可以指定某个类或某个包,若不指定则拦截所有包
第三个参数(..)第一个点号为参数,第二个是匹配
3.4xml文件配置
<!--开启注解--> <aop:aspectj-autoproxy/> <beanid="userDalOracle"class="com.bjpower.node.spring.dao.UserDaoOracle" /> <beanid="userManager"class="com.bjpower.node.spring.manager.UserManagerImp"> <!-- 描述set方法 --> <propertyname="userDao" ref="userDalOracle"></property> </bean> <!--引入横切类--> <beanid="securityHandler"class="com.bjpower.node.spring.SecurityHandler" /> <!--========================= ASPECT CONFIGURATION ======================== -->
4 客户端的调用
package com.bjpower.node.spring.client; import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.bjpower.node.spring.dao.UserDaoMysql; import com.bjpower.node.spring.manager.UserManager; import com.bjpower.node.spring.manager.UserManagerImp; public class Client { public static void main(String[] args) { BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml"); UserManager userManager=(UserManager) factory.getBean("userManager"); userManager.addUser("hanhan", "passowrd");} }
拦截到的效果为以下打印,达到了在方法执行前对其进行检查的效果。
hanhan
passowrd
方法名称为 = addUser
----------checkSecurity----
小结:
总体上aop减少了我们相同代码量,节省了时间,同时使得我们只需要关注核心业务,建立了松耦合,可复用性。
原文:http://blog.csdn.net/han_yankun2009/article/details/44313267