Spring【AOP】

    AOPOOP的延续,是软件开发中的一个热点


    AOP技术,OOP补充。OOP引入封装,继承和多态建立一种对象层次结构模拟公共行为集合,而对从左到右的关系则显得无能为力。对于AOP则恰恰适应这种横切技术。


    简单说,就与业务无关,却为了业务模块所共同调用的逻辑封装起来,便于减少系统重复代码,降低模块间耦合度,利用维护和可操作性


    横切技术将软分为两部分:核心关注点和横切关注点:业务处理流程为核心关注,与之关系不大的是横切关注。如:系统中各处都相似的日志,事务,权限成为横切关注点。AOP作用是将核心点与横切点分开。


   实现的一些技术点有:

Aspect:横切关注点的模块,表示在哪里做和做什么(一个类,是advicepoint的结合)

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注解定义pointcutadvice

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减少了我们相同代码量,节省了时间,同时使得我们只需要关注核心业务,建立了松耦合,可复用性。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值