AOP实例

AOP(Aspect Oriented Programming)面向切面编程
在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
总结:在AOP中切面就是与业务逻辑独立,但又垂直存在于业务逻辑的代码结构中的通用功能组合;切面与业务逻辑相交的点就是切点;连接点就是把业务逻辑离散化后的关键节点;切点属于连接点,是连接点的子集;Advice(增强)就是切面在切点上要执行的功能增加的具体操作;在切点上可以把要完成增强操作的目标对象(Target)连接到切面里,这个连接的方式就叫织入。

基本名词:

Aspect(切面): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
Pointcut(切点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
Advice(增强):Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
Target(目标对象):织入 Advice 的目标对象.。
Weaving(织入):将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程

设计模式

责任链模式:
一个请求的处理需要多个对象当中的一个或几个协作处理
角色:
抽象处理者(Handler):定义出一个处理请求的接口。如果需要,接口可以定义出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。
具体处理者(ConcreteHandler):具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
优点: 实现了请求者与处理者代码分离

适配器模式:

一个对象适配器可以把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。

角色:
Target:目标抽象类
Adapter:适配器类
Adaptee:适配者类
Client:客户类

桥接模式:
角色:
Abstraction:抽象类
RefinedAbstraction:扩充抽象类
Implementor:实现类接口
ConcreteImplementor:具体实现类

使用实例补充:

需求:将所有接口中包含身份证的入参都转为大写

1、引入pom依赖

<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
</dependency>

2、写一个切面

@Aspect
@Component
public class RequestMappingAspect {
	private static final Logger logger = LoggerFactory.getLogger(RequestMappingAspect.class);

	/**
	 * 切点条件: 含有 @RequestMapping 注解 且 包含HttpServletResponse类型参数的public方法。
	 * 且类在com.gzhc365..子包中
	 */
	@Pointcut("execution(public * com.gzhc365.front.service..*.*(..))")
	private void adviceRequestMapping() {
		// Service层切点
	}

	@Around("adviceRequestMapping()")
	public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {

		logger.info("==========================进入切面==========================" );

		Object[] object = joinPoint.getArgs();
		for (Object obj : object){
			if(obj instanceof Map){
				Map<String ,Object> map = (Map<String, Object>) obj;
				logger.info("原始map==>"+ map );
				if(map.containsKey("idNo")){
					logger.info("=进入idNo判断=====" );
					String idNo = String.valueOf(map.get("idNo"));
					map.put("idNo",idNo.toUpperCase());
				}
				if(map.containsKey("patIdNo")){
					logger.info("=进入patIdNo判断=====" );
					String patIdNo = String.valueOf(map.get("patIdNo"));
					map.put("patIdNo",patIdNo.toUpperCase());
				}
			}
		}
		return joinPoint.proceed(object);

	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值