`

guice2之AOP

阅读更多
Guice之前也是花了很少时间看一下,现在几乎忘了。再一看以前写的几篇关于guice的博客,写得一点都不到位,甚至有许多地方都没讲清楚,真是惭愧!现在突然又想关注一下IOC方面的东西,因此想好好看看,Guice到底能做些什么,能做到什么程度。有空也想看看其源码。看了一下源码才发现,其实源码只包含guice部分,而实际上guice实现了其它一些第三方的源码,至少包括三个组件的源码:
一、aopalliance.jar,此包就是aop联盟定义的一组关于AOP的公共接口。
二、cglib,反射使用目前公认的最好的cglib组件。
三、asm,由于cglib使用了asm组件,所以asm也很重要。

错误的估计了形式,也更加验证了guice的确是强大的,因此这些都是目前非常优秀的组件。关于AOP,了解不多,以前有想过学习aspectj的,但的确有点复杂,不太适合自己这种喜欢轻量级组件的要求,所以没有迈出那一步,关注guice时才发现,居然有AOP的功能,于是就花了点时间试一下,虽然功能并不是很完善,但使用起来也很简单,对于大多数要求并不复杂的应用来说,已经不错了。

由于guice2使用注解,所以看起来更简单,下面以验证用户为例,首先建一个注解:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD)
public @interface ValidUser {
}



然后再建立一个拦截器:

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

public class ValidUserInterceptor implements MethodInterceptor {
	@Override
	public Object invoke(MethodInvocation invocation) throws Throwable {
		Object[] args = invocation.getArguments();
		for (int i = 0; i < args.length; i++) {
			System.out.println(args[i]);
		}
		return invocation.proceed();
	}
}


注意上面的MethodInterceptor来自aopalliance包而不是cglib包。上面方法的作用是打印拦截方法的参数值。

要把拦截器与注解关联起来,而关联的动作是在Module中进行了的:

public class ValidUserModule extends AbstractModule {

	@Override
	protected void configure() {
		
		bind(UserService.class).to(UserServiceImp.class);  
		bindInterceptor(Matchers.any(), Matchers.annotatedWith(ValidUser.class), 
		        new ValidUserInterceptor());
	}
}


上面绑定拦截器使用了bindInterceptor方法,需要注意的是匹配规则,上面使用了较简单的Matchers.any(),如果有一些其它的要求,可以选择使用not,only等方法,它们使得拦截器使用起来更加的灵活。

实例还用到两个辅助的类:

public interface UserService {

	public void editUser(String username,String password);
}


public class UserServiceImp implements UserService{

	@ValidUser
	public void editUser(String username,String password){
		System.out.println("UserService editUser");
	}
}


测试类:

public class ValidUserTest {

	@Test
	public void validUser(){
		Injector injector = Guice.createInjector(new ValidUserModule());
		UserService us = injector.getInstance(UserService.class);
		us.editUser("fans","java");
	}
}


按照拦截器的要求,结果会打印相应的参数值。输出为:
引用

fans
java
UserService editUser


一个简单的拦截过程就这样实现了。不过要使用guice拦截器,有几个限制因素:

引用

    * Classes must be public or package-private.
    * Classes must be non-final
    * Methods must be public, package-private or protected
    * Methods must be non-final
    * Instances must be created by Guice by an @Inject-annotated or no-argument constructor
分享到:
评论

相关推荐

    sisu-guice-3.1.3-no_aop.jar

    sisu-guice-3.1.3-no_aop.jar

    guice-2.0-no_aop.jar

    guice-2.0-no_aop.jar

    Robojuice jar 包文件下载(内含guice-2.0-no_aop.jar 和roboguice-1.1.2.jar )

    `guice-2.0-no_aop.jar`是Guice的一个版本,不包含Aspect Oriented Programming(AOP)支持,这可能是因为在Android环境中,AOP的使用可能会增加复杂性和性能开销。 接下来,我们来看RoboGuice。RoboGuice是Guice的...

    sisu-guice-3.2.3-no_aop.jar

    java运行依赖jar包

    guice-3.0.rar

    - Guice支持AOP(面向切面编程),可以通过编写拦截器(Interceptors)来添加横切关注点。 - 支持自定义绑定策略,如绑定到特定类实例、单例、多例等。 7. **实战应用**: - 在Guice-3.0中,开发者可以通过创建...

    Google Guice需要的jar

    Guice还支持AOP(面向切面编程)特性,通过`@Interceptor`注解和`@Aspect`注解,可以方便地添加日志、事务管理等横切关注点。此外,Guice与其它Google库如Guava的集成也非常紧密,能够更好地支持复杂的应用场景。 ...

    shiro,guice集成

    - **作用**:利用 Guice AOP 实现 Shiro 的 AOP 注解。 - **使用方式**:通常情况下,只需要安装此模块即可。如果需要使用自定义的 AnnotationMethodInterceptor,则可以扩展此模块。 #### 集成示例 下面是一个...

    google guice 3.0源码

    6. **AOP(面向切面编程)支持**:虽然Guice不是专门的AOP框架,但可以通过注解和拦截器(Interceptors)实现类似的功能,例如日志记录、事务管理等。 7. **子Injector(Sub-Injector)**:Guice 3.0引入了子...

    guice超轻量级依赖注入

    7. **AOP(面向切面编程)**:虽然Guice本身不直接支持AOP,但可以通过与其他库(如AspectJ)结合,实现拦截器(Interceptors)和切面。 8. **模块继承与组合**:Guice模块可以继承其他模块,也可以通过`install()`...

    google-guice

    4. `aopalliance.jar`:AOP Alliance是一个接口集,提供了面向切面编程(Aspect-Oriented Programming,AOP)的通用API,Guice可以与之配合,实现更灵活的拦截器和切面逻辑。 5. `guice-spring-1.0.jar`:这个扩展...

    Google Guice: Agile Lightweight Dependency Injection Framework

    - **实战应用**:学习如何使用Guice构建真实的Web应用程序,例如使用Struts 2或Wicket开发Web应用,以及如何使用Hibernate进行数据持久化操作。 #### 四、Guice的关键特性 - **依赖注入**:通过注解的方式声明依赖...

    Guice用户指南翻译

    7. **AOP(面向切面编程)支持:** 虽然Guice本身不直接支持AOP,但可以与AspectJ等库结合使用,实现面向切面的编程,比如日志记录、事务管理等。 8. **绑定到具体类型:** Guice允许你将接口绑定到具体的类,也...

    aop jar包.zip

    AOP(Aspect Oriented Programming,面向切面编程)是一种编程范式,主要目的是解决软件系统中的横切关注点,如日志、事务管理、权限控制等。这些关注点通常会散布在应用程序的多个类和方法中,使得代码复用困难且...

    初试Guice(转)

    2. **模块(Module)**:Guice模块定义了一组绑定规则,用来告诉Guice如何创建和管理对象。开发者可以通过实现`AbstractModule`类来定义自己的模块。 3. **类型安全**:Guice在编译时就能检测到错误的依赖配置,...

    Struts2的第一个入门实例(三)--Struts2与Guice整合

    同时,Guice提供的AOP(面向切面编程)特性,如预后拦截器,也能帮助我们更好地控制和监控代码执行。 在给出的压缩包文件"struts2_guice"中,可能包含了示例项目的源代码,包括Struts2配置文件、Guice模块定义、...

    google guice基础例子

    Guice是Google开发的一个轻量级,基于Java5(主要运用泛型与注释特性)的依赖注入框架(IOC)。Guice非常小而且快。Guice是类型安全的,它能够对构造函数,属性,方法(包含任意个参数的任意方法,而不仅仅是setter...

    licenceCheck:Guice AOP示例项目

    2. **面向切面编程(AOP)**:AOP允许开发者将横切关注点(如日志、事务、安全性等)与业务逻辑分离。在Guice中,AOP可以通过使用`@Around`, `@Before`, `@After`等注解来实现方法拦截,从而在运行时动态插入代码。 3...

    Guice与Spring框架的区别.pdf

    Spring框架是Java生态系统中最流行的DI容器之一,主要特点是功能强大、灵活性高。Spring框架的主要特性包括: * 功能强大:Spring框架提供了非常丰富的功能,包括AOP、MVC、事务管理等。 * 灵活性高:Spring框架...

    sisu-guice-3.2.5-no_aop.jar

    java运行依赖jar包

    shiro和guice整合,使用权限注解

    Guice 作为一个轻量级的 AOP 框架,提供了模块化和动态绑定的能力,能够无缝地与 Shiro 集成。与 Spring AOP 相比,Guice 更为简单,启动速度更快,这得益于它的设计哲学:避免不必要的复杂性。Guice 提供了 `...

Global site tag (gtag.js) - Google Analytics