提问者:小点点

Google guice注入Spring创建的实例和方法拦截


我使用Gucie 3.0来拦截任何具有我定义的注释@Log必需的方法。但是对于我的应用程序,一些bean由Spring使用注入的字段值初始化。在调用giuce injector. inject会员(this)后,bean被guice代理,但所有原始字段值都消失了。看起来Guice重新构建了bean并丢弃了所有旧值。这是预期的行为还是我如何解决这个问题?

创建一个类扩展AbstractModule

public class InterceptorModule extends AbstractModule{ public void configure() 

{LogInterceptor跟踪=new LogInterceptor();请求注入(跟踪); bindInterceptor(Matcher.any(),Matcher.annotatedBy(Log必需.class),跟踪);}}

定义拦截器业务逻辑

public class LogInterceptor implements MethodInterceptor { //business logic here }

创建日志服务类

Public class LogService { Injector injector = Guice.createInjector(new InterceptorModule()); }

我有一个下面的bean示例,getName方法想要被拦截:

public class UserImplTwo implements IUser {

private String name;


    @LogRequired
public String getName() {
    return this.name;
}

public void setName(String name) {
    this.name = name;
}
}

由Spring上下文初始化:

最后我有一个消费者来消费bean:

public class Consumer
{
        @Inject
        private UserImplTwo instance;

        public void setInstance(UserImplTwo instance)
        {
            this.instance = instance;
        }

      public void init()
        {
           // the value of name is printed out as 'hello world'
             System.out.println(  this.instance.getName());

             LogService.injector.injectMembers(this);


            // the value of name is printed out as null, should be 'hello world'
             System.out.println(  this.instance.getName());

        }
}

然后使用Spring初始化bean:

 <bean id="consumer" class="com.demo.Consumer" init-method="init">
    <property name="instance" ref="userTwo"></property>
</bean>

请让我知道这是正确的方法还是我做错了什么,因为我必须使用Spring来初始化一些bean。


共1个答案

匿名用户

一个正确的方法可能是保持事情简单,如果你使用Spring框架,使用Spring的DI,而不是尝试与Guice混合和匹配:-)

话虽如此,似乎没有技术上的原因,为什么它们不能在某种程度上混合搭配在一起。

我认为你会在另一种方法上取得更大的成功。我以前使用过的一种方法是利用SpringMVC基于Java的配置。这是基本方法。

创建一个扩展WebMvcConfigurationSupport的类:

@Configuration
@Import(BeansConfig.class)
public class Config extends WebMvcConfigurationSupport {
}

分离出您的bean配置(可能它可以与上面的代码合并,但我想它是相当沉闷的代码,您通常不想看到它)。并在将它们提供给Spring之前使用它来使用Guice注入器创建您的bean。

@Configuration
public class BeansConfig {
    @Bean
    public Consumer getConsumer() {
        return SomeGuiceInjectorFactory.newInstance(Consumer.class);
    }
}

将其包含在您的Spring. xml中(如果您的servlet容器比我的容器更新,则以其他方式引导)

<context:annotation-config/>
<bean id="extendedWebMvcConfig" class="Config"/>

构造函数注入和大多数/所有?其他Guice优点也应该适用于这种场景。

此外,您不需要在xml中配置您的bean。