【问题标题】:Converting code to Spring annotations将代码转换为 Spring 注解
【发布时间】:2013-02-26 13:34:48
【问题描述】:

我正在将非 Spring 代码转换为 Spring (v3.2) 代码。我已经阅读了 Spring 文档,但我无法理解下面显示的以下情况。

类 Foo 和 Buz 由 Spring 管理并且是单例。类 Bar 和 MyHyperlinkListener 需要由 Spring 管理并且应该是原型(尽管我不确定如何正确注释这些)。

  • Bar 内部的 Buz 实例当前为空,因为 Bar 不是由 Spring 管理的。如何正确注释这些类以允许这样做?是否需要为 Bar 创建一个 Factory 类,这会是什么样子?

  • Bar 的构造函数从 Foo 类内部传递了一个“this”(又名 JFrame)。我不确定如何修改代码以在 Spring 中处理“this”。我猜这是另一个接受 JFrame 的工厂,但我不确定如何编写代码。


    @Named
    public class Foo extends JFrame{
        private Bar bar;

        private void doSomeWork(int x){
             bar = new Bar( new MyHyperlinkListener(this), x);
        }
    }

    public class Bar extends JPanel{
        @Inject
        private Buz buz;

        public Bar(MyHyperlinkListener mhl, int x){
        }
    }

    public class MyHyperlinkListener implements HyperlinkListener{
      private JFrame frame;
      public MyHyperlinkListener(JFrame frame){
        this.frame=frame;
      }
      //...code omitted
    }

    @Named
    public class Buz{
    }

    @Configuration
    public class MyConfiguration{

    }

    public class RunMe{
        public static void main(String[] args){
            AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
            context.scan("myPackage");
            context.refresh();
            context.registerShutdownHook();
            Foo foo = context.getBean(Foo.class);
            foo.setVisible(true);
        }
    }



【问题讨论】:

    标签: java spring annotations


    【解决方案1】:

    您可以将Bar 类设为@Configurable,这将允许在创建实例时由 Spring 管理它。

    @Configurable
    public class Bar extends JPanel{
        @Inject
        private Buz buz;
    
        public Bar(MyHyperlinkListener mhl, int x){
        }
    }
    

    或者,您可以使用 bean 工厂来创建 Bar 的实例。这将产生相同的效果:

    @Configuration
    public class BarFactory
    {
      @Bean
      public Bar createBar(MyHyperlinkListener mhl, int x) {
        return new Bar(mhl, x);
      }
    }
    

    这两种方法都有效,主要区别在于它们公开管理的方式。它们还将允许您希望使用的构造函数。

    【讨论】:

    • 谢谢!当我试一试时,我得到了关于没有匹配类型 [MyHyperlinkListener] 的新错误。我用 Configurable 注释了 MyHyperlinkListener 类,用 Inject 注释了构造函数,但是我仍然收到相同的消息。然后我在 MyConfiguration 类中创建了一个 createHyperlinkListener Bean 并调用它,而不是直接从 Foo 内部调用 new MyHyperlinkListener。
    • 这给了我一个关于没有定义类型 [javax.swing.JFrame] 的唯一 bean 的新消息。 MyHyperLinkListener 在整个代码中从不同的 JFrame 中调用,所以我不能只将它绑定到一个。有什么建议么?自从你提出建议以来,我所做的事情是否正确?
    • 注意 - 可配置对我不起作用,因为我还需要 AspectJ,所以我改用配置方式。我仍然收到“没有 JFrame 类型的唯一 bean”消息
    • 对不起,我应该更明确地了解@Configurable 的设置,我链接到的教程应该解释如何设置AspectJ,如果您更喜欢使用它。
    • 我已经命名了类,但我仍然收到该消息。我不确定如何使用 Spring 的自动装配模式来解决这个问题......是否有必要(通过使用命名/注入等尽可能保持不可知论......)现在我刚刚创建了一个特定的 createMyHyperLinkListener(Foo foo) 以避免错误。
    猜你喜欢
    • 2015-02-02
    • 2017-10-16
    • 2021-06-23
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 2017-09-23
    相关资源
    最近更新 更多