使用guice注入对象

Dav*_*sow 2 java guice

我不确定我是否完全理解依赖注入背后的想法,特别是使用Guice.

我有很大的摇摆应用程序,我想引入guice,来解耦这个应用程序.假设我在主要班级有注射器

Guice.createInjector(new BindingModule());
Application app = injector.getInstance(Application.class);
app.run();
Run Code Online (Sandbox Code Playgroud)

它有效.如果我有一些字段,让我们说在应用程序类中的JPanel,用@Inject注释然后注入它.但是如果我在Application构造函数中手动创建一些东西,那么将不会注入示例中的JTree(假设一切都配置正确).

class Application {

          @Inject JPanel mainPanel //this will be injected

          JPanel otherPanel;


          public Application() {
              otherPanel = new MyNewPanel();

              mainPanel.add(otherPanel);
          }

}  

class MyNewPanel extends JPanel { 


          @Inject JTree tree;  //this will not be injected

          public MyNewPanel() {

               add(tree);
          }

}
Run Code Online (Sandbox Code Playgroud)

我的问题是,我是否需要控制注射的所有注射物体.我不能像我一样打破控制otherPanel.

Alo*_*uez 5

在依赖注入范例中,所有注入的对象必须控制注入容器,这是容器实际将对象实例注入注入点(@Inject注释)的唯一方法.

使用new运算符实例化对象实例时,该对象实例不受注入容器的控制(它是由您创建的,而不是容器创建的).因此,即使你在新的对象实例中有注入点,容器也不知道它们,因此它不能将任何注入候选者注入该对象实例的注入点(因为,正如我已经说过的那样,它是不受控制).

所以,回答几句话:是的,如果你想让它们自动注入,你需要让所有对象都在容器(Guice)的控制之下.任何你可能会按照你在问题中的意思进行注射工作的黑客行为都会破坏控制反转的规则.