package com.ilucky.guice.test12;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.name.Named;
/**
* v1.0:20161116
* bindInterceptor的使用
* aop:面向切面编程.
*/
public class MainTest {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new PersonModule());
Person student = injector.getInstance(Person.class);
student.say("say......");
System.out.println("----------------------------------------");
student.say2("say2......");
System.out.println("----------------------------------------");
student.dos("do......");
System.out.println("----------------------------------------");
Test test = injector.getInstance(Test.class);
test.dos("do......");
}
}
class Test {
@Named("dos")
public void dos(String dos) {
System.out.println("Test do=" + dos);
}
}
/**
我是在方法之前要做的事情
Student say=say......
我是在方法执行之后做的事情
----------------------------------------
我是在方法之前要做的事情
Student say2=say2......
我是在方法执行之后做的事情
----------------------------------------
我是在方法之前要做的事情
Student do=do......
我是在方法执行之后做的事情
----------------------------------------
我是在方法之前要做的事情
Test do=do......
我是在方法执行之后做的事情
*/
package com.ilucky.guice.test12;
import com.google.inject.Binder;
import com.google.inject.Module;
import com.google.inject.matcher.Matchers;
import com.google.inject.name.Names;
/**
* 这里视为某些方法绑定拦截器.
*/
public class PersonModule implements Module {
public void configure(Binder binder) {
binder.bind(Person.class).to(Student.class);
binder.bindInterceptor(Matchers.any(), Matchers.annotatedWith(Names.named("say")), new MyMethodInterceptor()) ;
binder.bindInterceptor(Matchers.any(), Matchers.annotatedWith(Names.named("dos")), new MyMethodInterceptor()) ;
}
}
package com.ilucky.guice.test12;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class MyMethodInterceptor 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("我是在方法执行之后做的事情");
}
}
package com.ilucky.guice.test12;
public interface Person {
public void say(String say);
public void say2(String say);
public void dos(String dos);
}
package com.ilucky.guice.test12;
import com.google.inject.name.Named;
public class Student implements Person {
@Override
@Named("say")
public void say(String say) {
System.out.println("Student say=" + say);
}
@Override
@Named("say")
public void say2(String say) {
System.out.println("Student say2=" + say);
}
@Override
@Named("dos")
public void dos(String dos) {
System.out.println("Student do=" + dos);
}
}