Google Guice之AOP(面向切面编程)

前面介绍了Guice的绑定和注入的方法,下面我们就来看看Guice的AOP,面向前面编程。

(1)创建Hello,HelloImpl类

package guice.aop;

import com.google.inject.ImplementedBy;

/**
 * 定义一个Hello接口,在定义一个sayHi方法
 * @author Java_Le
 * @Date 2014-5-3下午12:54:43
 * @ClassName Hello.java
 */
@ImplementedBy(HelloImpl.class) 
public interface Hello {
	void sayHi() ;
	
	void doSomething() ;
}

package guice.aop;

import com.google.inject.Singleton;
import com.google.inject.name.Named;
/**
 * 
 * @author Java_Le
 * @Date 2014-5-3下午12:55:41
 * @ClassName HelloImpl.java
 * 
 * Hello接口的实现类
 */
@Singleton
public class HelloImpl implements Hello{
	
	/**
	 * Guice中给某个方法添加拦截器是通过@Named注解来完成的,一个拦截器会绑定一个带xxx的@Named注解,
	 * 当你这个对象时通过guice容器创建的,当你访问带xxx的@Named注解的时候,就会被拦截器拦截到
	 */
	@Override
	@Named("interceptor")
	public void sayHi() {
		System.out.println("HelloImpl exec sayHi method");
	} 
	
	@Override
	@Named("log")
	public void doSomething() {
		System.out.println("HelloImpl exec doSomething method");
	}
}

(2)创建一个拦截器

package guice.aop;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class MyInterceptor implements MethodInterceptor {

	@Override
	public Object invoke(MethodInvocation invocation) throws Throwable {
		doBefore() ;
		//真正要去执行的方法
		//可以再这个地方做一些验证,比如是否能够去执行这个方法等
		Object ret = invocation.proceed() ;
		doAfter() ;
		return ret;
	}
	//在执行真正的逻辑之前执行
	public void doBefore(){
		System.out.println("我是在方法之前要做的事情");
	}
	//支执行真正的逻辑之后执行
	public void doAfter(){
		System.out.println("我是在方法执行之后做的事情");
	}
}

(3)创建一个测试程序

package guice.aop;


import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Module;
import com.google.inject.matcher.Matchers;
import com.google.inject.name.Names;


public class Client {
	//注入hello属性
	@Inject
	private Hello hello ;
	public static void main(String[] args) {
		Injector in = Guice.createInjector(new Module(){
			@Override
			public void configure(Binder binder) {
				//将MyInterceptor绑定到所有方法上带interceptor和log @Named注解的方法上,我们可以看到Guice的拦截器是可以匹配任意多个@Named注解的。
				//Matchers 控制拦截器要拦截的范围,可以确定到某个package中,可以指定为某个class,可以指定为某个类的子类等等
				//下面我们用的是任何类Matchers.any()
				binder.bindInterceptor(Matchers.any(), Matchers.annotatedWith(Names.named("interceptor")), new MyInterceptor()) ;
				binder.bindInterceptor(Matchers.any(), Matchers.annotatedWith(Names.named("log")), new MyInterceptor()) ;
			}
		}) ;
		//通过Guice来得到一个Hello实例,其实是指向的HelloImpl实例
		Hello hello = in.getInstance(Hello.class) ;
		
		hello.sayHi() ;
		hello.doSomething() ;
	}
}
输出结果:

我是在方法之前要做的事情
HelloImpl exec sayHi method
我是在方法执行之后做的事情
我是在方法之前要做的事情
HelloImpl exec doSomething method
我是在方法执行之后做的事情

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值