文档章节

SpringAOP类型代理

maskleo
 maskleo
发布于 2017/01/06 23:11
字数 387
阅读 39
收藏 0

spring本身提供的是通过匹配bean的名称来拦截的方法,
通过类型能够准确的拦截,避免了用户命名造成的多余拦截甚至造成系统异常.

参考了druid的方法

com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator
org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator

核心方法如下

import java.util.Arrays;
import java.util.List;

import org.springframework.aop.TargetSource;
import org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.util.PatternMatchUtils;

public class BeanTypeAutoProxyCreator extends AbstractAutoProxyCreator
		implements InitializingBean, ApplicationContextAware {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private ApplicationContext applicationContext;

	private Class<?> beanType;

	private Class<?> adviceType;

	private List<String> beanNames;

	@Override
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		this.applicationContext = applicationContext;
	}

	@Override
	public void afterPropertiesSet() throws Exception {
		beanNames = Arrays.asList(this.applicationContext
				.getBeanNamesForType(beanType));
		super.setInterceptorNames(this.applicationContext
				.getBeanNamesForType(adviceType));
	}

	protected boolean isMatch(String beanName, String mappedName) {
		return PatternMatchUtils.simpleMatch(mappedName, beanName);
	}

	@Override
	protected Object[] getAdvicesAndAdvisorsForBean(Class<?> beanClass,
			String beanName, TargetSource customTargetSource)
			throws BeansException {
		if (this.beanNames != null) {
			for (String mappedName : this.beanNames) {
				if (FactoryBean.class.isAssignableFrom(beanClass)) {
					if (!mappedName.startsWith(BeanFactory.FACTORY_BEAN_PREFIX)) {
						continue;
					}
					mappedName = mappedName
							.substring(BeanFactory.FACTORY_BEAN_PREFIX.length());
				}
				if (isMatch(beanName, mappedName)) {
					return PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS;
				}
				BeanFactory beanFactory = getBeanFactory();
				if (beanFactory != null) {
					String[] aliases = beanFactory.getAliases(beanName);
					for (String alias : aliases) {
						if (isMatch(alias, mappedName)) {
							return PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS;
						}
					}
				}
			}
		}
		return DO_NOT_PROXY;
	}

	public void setBeanType(Class<?> beanType) {
		this.beanType = beanType;
	}

	public void setAdviceType(Class<?> adviceType) {
		this.adviceType = adviceType;
	}
<bean class="rml.proxy.BeanTypeAutoProxyCreator">
		<property name="beanType" value="rml.proxy.AbstractByProxy">
		</property>
		<property name="adviceType" value="rml.proxy.MyAdvice">
		</property>
	</bean>
public abstract class AbstractByProxy {

	abstract void doSomething(String ars);
}
public interface MyAdvice {
	
}

这样我们就可以只实现了AbstractByProxy的类代理实现MyAdvice接口

从而达到限制类型的目的

@Log4j
@Component
public class AByProxy extends AbstractByProxy {

	@Override
	public void doSomething(String ars) {
		log.error("AByProxy.............");
	}

}

@Log4j
@Component
public class TestAdvice implements MethodBeforeAdvice,MyAdvice{

	@Override
	public void before(Method method, Object[] args, Object target)
			throws Throwable {
		if(method.getName().equals("doSomething")){
			log.error(Arrays.asList(args));
		}
	}

}

 

© 著作权归作者所有

maskleo
粉丝 17
博文 128
码字总数 17344
作品 0
深圳
程序员
私信 提问
Spring系列之AOP基本主要类概述

在这篇文章中我将对自己了解的AOP中的基本主要类做一个概述,可能不包括一些AOP高级用法的类以及是自己还不了解的类。会不定期的进行补充和修改。 SpringAOP基础解析类 类名 作用概述 AopNam...

Mr_zebra
2018/07/20
32
0
AOP的基本概念

AOP框架能处理程序执行中特定切入点(Pointcut),而不与具体某个类耦合。 下面是面向切面编程的一些术语: 概念 描述 切面(Aspect) 业务流程运行的某个特定步骤,即关注点,关注点可能横切多个...

shamgod_code
2016/10/30
77
0
spring之AOP(面向切面编程)

一、简介 何为AOP,通俗的将就是给某些方法执行之前、执行之后等动作发生的时候执行某些操作,在执行这些操作的时候可以获取执行方法的相关信息,简化程序开发中总是重复的东西,比如方法入参...

图样图森破
2016/12/26
64
0
Spring AOP之同一个对象方法内部自调用导致事务失效问题

对于像我这种喜欢滥用AOP的程序员,遇到坑也是习惯了,不仅仅是事务,其实只要脱离了Spring容器管理的所有对象,对于SpringAOP的注解都会失效,因为他们不是Spring容器的代理类,SpringAOP,就切入不...

xiaomin0322
05/20
144
0
使用AspectJ实现AOP

AOP专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题,在JavaEE应用中,常常通过AOP来处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等,AOP已...

shamgod_code
2016/10/29
31
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL 11.3 locking

rudi
今天
5
0
Mybatis Plus sql注入器

一、继承AbstractMethod /** * @author beth * @data 2019-10-23 20:39 */public class DeleteAllMethod extends AbstractMethod { @Override public MappedStatement injectMap......

一个yuanbeth
今天
10
1
一次写shell脚本的经历记录——特殊字符惹的祸

本文首发于微信公众号“我的小碗汤”,扫码文末二维码即可关注,欢迎一起交流! redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要...

码农实战
今天
4
0
为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接?

之前在阅读《阿里巴巴Java开发手册》时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下: 那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符串拼接的效率...

武培轩
今天
8
0
队列-链式(c/c++实现)

队列是在线性表功能稍作修改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。作用就是通过伟大的程序员来实现算法解决现实生活...

白客C
今天
81
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部