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
guice-2.0-no_aop.jar
`guice-2.0-no_aop.jar`是Guice的一个版本,不包含Aspect Oriented Programming(AOP)支持,这可能是因为在Android环境中,AOP的使用可能会增加复杂性和性能开销。 接下来,我们来看RoboGuice。RoboGuice是Guice的...
java运行依赖jar包
- Guice支持AOP(面向切面编程),可以通过编写拦截器(Interceptors)来添加横切关注点。 - 支持自定义绑定策略,如绑定到特定类实例、单例、多例等。 7. **实战应用**: - 在Guice-3.0中,开发者可以通过创建...
Guice还支持AOP(面向切面编程)特性,通过`@Interceptor`注解和`@Aspect`注解,可以方便地添加日志、事务管理等横切关注点。此外,Guice与其它Google库如Guava的集成也非常紧密,能够更好地支持复杂的应用场景。 ...
- **作用**:利用 Guice AOP 实现 Shiro 的 AOP 注解。 - **使用方式**:通常情况下,只需要安装此模块即可。如果需要使用自定义的 AnnotationMethodInterceptor,则可以扩展此模块。 #### 集成示例 下面是一个...
6. **AOP(面向切面编程)支持**:虽然Guice不是专门的AOP框架,但可以通过注解和拦截器(Interceptors)实现类似的功能,例如日志记录、事务管理等。 7. **子Injector(Sub-Injector)**:Guice 3.0引入了子...
7. **AOP(面向切面编程)**:虽然Guice本身不直接支持AOP,但可以通过与其他库(如AspectJ)结合,实现拦截器(Interceptors)和切面。 8. **模块继承与组合**:Guice模块可以继承其他模块,也可以通过`install()`...
4. `aopalliance.jar`:AOP Alliance是一个接口集,提供了面向切面编程(Aspect-Oriented Programming,AOP)的通用API,Guice可以与之配合,实现更灵活的拦截器和切面逻辑。 5. `guice-spring-1.0.jar`:这个扩展...
- **实战应用**:学习如何使用Guice构建真实的Web应用程序,例如使用Struts 2或Wicket开发Web应用,以及如何使用Hibernate进行数据持久化操作。 #### 四、Guice的关键特性 - **依赖注入**:通过注解的方式声明依赖...
7. **AOP(面向切面编程)支持:** 虽然Guice本身不直接支持AOP,但可以与AspectJ等库结合使用,实现面向切面的编程,比如日志记录、事务管理等。 8. **绑定到具体类型:** Guice允许你将接口绑定到具体的类,也...
AOP(Aspect Oriented Programming,面向切面编程)是一种编程范式,主要目的是解决软件系统中的横切关注点,如日志、事务管理、权限控制等。这些关注点通常会散布在应用程序的多个类和方法中,使得代码复用困难且...
2. **模块(Module)**:Guice模块定义了一组绑定规则,用来告诉Guice如何创建和管理对象。开发者可以通过实现`AbstractModule`类来定义自己的模块。 3. **类型安全**:Guice在编译时就能检测到错误的依赖配置,...
同时,Guice提供的AOP(面向切面编程)特性,如预后拦截器,也能帮助我们更好地控制和监控代码执行。 在给出的压缩包文件"struts2_guice"中,可能包含了示例项目的源代码,包括Struts2配置文件、Guice模块定义、...
Guice是Google开发的一个轻量级,基于Java5(主要运用泛型与注释特性)的依赖注入框架(IOC)。Guice非常小而且快。Guice是类型安全的,它能够对构造函数,属性,方法(包含任意个参数的任意方法,而不仅仅是setter...
2. **面向切面编程(AOP)**:AOP允许开发者将横切关注点(如日志、事务、安全性等)与业务逻辑分离。在Guice中,AOP可以通过使用`@Around`, `@Before`, `@After`等注解来实现方法拦截,从而在运行时动态插入代码。 3...
Spring框架是Java生态系统中最流行的DI容器之一,主要特点是功能强大、灵活性高。Spring框架的主要特性包括: * 功能强大:Spring框架提供了非常丰富的功能,包括AOP、MVC、事务管理等。 * 灵活性高:Spring框架...
java运行依赖jar包
Guice 作为一个轻量级的 AOP 框架,提供了模块化和动态绑定的能力,能够无缝地与 Shiro 集成。与 Spring AOP 相比,Guice 更为简单,启动速度更快,这得益于它的设计哲学:避免不必要的复杂性。Guice 提供了 `...