博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring三种实现自动代理
阅读量:2441 次
发布时间:2019-05-10

本文共 2618 字,大约阅读时间需要 8 分钟。

Spring三种实现自动代理

1.基于bean配置名规则的自动代理创建器:允许为一组特定配置名的bean自动创建代理实例的代理创建器,实现类为:BeanNameAutoProxyCreator

2.基于Advisor匹配机制的自动代理创建器,实现类为:DefaultAdvisorAutoProxyCreator

3.基于bean中的AspectJ注解标签的自动代理创建器

第一种:

Waiter类:

package aop.beannameauto;public class Waiter {		public void greet(String name) {			System.out.println("Waiter.greet()"+name);		}}

前置方法增强:

package aop.beannameauto;import java.lang.reflect.Method;import org.springframework.aop.MethodBeforeAdvice;public class GreetB implements MethodBeforeAdvice{	@Override	public void before(Method arg0, Object[] arg1, Object arg2)			throws Throwable {		// TODO Auto-generated method stub		String name= (String) arg1[0];		System.out.println("GreetB.before()"+name);			}	}

XML配置文件:

BeanNameAutoProxyCreator有一个beanname属性,允许用户指定一组需要自动代理的bean名称

测试类:

package aop.beannameauto;import static org.junit.Assert.*;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class BeanTest {		@Test	public void test() {			ApplicationContext context = new ClassPathXmlApplicationContext("aop/beannameauto/beans.xml");			Waiter waiter = (Waiter) context.getBean("waiter");			waiter.greet("11");				}}

第二种:

Waiter类和增强类同上

配置文件:

测试类:

package aop.defaultauto;import static org.junit.Assert.*;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class BeanTest {	@Test	public void test() {		ApplicationContext context = new ClassPathXmlApplicationContext("aop/defaultauto/beans.xml");		Waiter waiter = (Waiter) context.getBean("waiter");		waiter.greet("11");	}}

第三种:

Waiter类同上

增强类:

package aop.aspect;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;@Aspectpublic class GreetB {	@Before("execution(* greet(..))")	public void before() {		System.out.println("GreetB.before()");	}}

在类处标注了@AspectJ注解,第三方处理程序就可以通过类是否拥有@AspectJ注解判断是否为一个切面

其次,在方法定义出标注了@Before注解,并为该注解提供了成员值"execution(* greet(..))",提供了两个信息:@Before表示前置增强,成员值是一个@AspectJ切点表达式,意思在目标类的greet方法上织入增强

测试类:

package aop.aspect;import static org.junit.Assert.*;import org.junit.Test;import org.springframework.aop.aspectj.annotation.AspectJProxyFactory;public class AspectTest {	@Test	public void test() {		Waiter waiter = new Waiter();		AspectJProxyFactory factory = new AspectJProxyFactory();		factory.setTarget(waiter);		factory.addAspect(GreetB.class);		Waiter waiter2 = factory.getProxy();		waiter2.greet("11");			}}

转载地址:http://avcqb.baihongyu.com/

你可能感兴趣的文章
字符串endsWith()方法
查看>>
number.isnan_Number isNaN()方法
查看>>
虚拟dom_虚拟DOM
查看>>
安卓录制视频不录制外界声音_我如何录制我的视频
查看>>
如何在纯JavaScript中等待DOM ready事件
查看>>
react测试组件_测试React组件
查看>>
vue组件引入scss变量_如何将SCSS与Vue.js单个文件组件一起使用
查看>>
node.js删除文件_如何使用Node.js删除文件
查看>>
怎么过去web项目路径_我过去所做的所有软件项目
查看>>
开发人员,学习营销
查看>>
node 导出csv文件_如何使用Node.js编写CSV文件
查看>>
JavaScript数组简介
查看>>
创建react应用程序_如何调试React应用程序
查看>>
javascript国际化_JavaScript国际化
查看>>
JavaScript公共类字段
查看>>
object create_Object create()方法
查看>>
js trimstart_String trimStart()方法
查看>>
next.js部署_立即部署Next.js应用程序
查看>>
JavaScript对象属性
查看>>
String substring()方法
查看>>