3

我有一堂课需要

  1. 它使用的各种bean的依赖注入
  2. 初始化的运行时参数

该课程看起来与此类似

public class Validator {

    @Autowired
    private ServiceA serviceA;

    @Autowired
    private ServiceB serviceB;

    private String s;

    private ClassA a;
    private ClassB b;

    public void initialize(String s, ClassA a, ClassB b) {
        this.s = s;
        this.a = a;
        this.b = b;
    }

    public void performTaskA() {
        //use serviceA, serviceB, s, a and b
    }

    public void performTaskB() {
        //use serviceA, serviceB, s, a and b
    }

    public void performTaskC() {
        //use serviceA, serviceB, s, a and b
    }

}

我可以通过哪些各种选项将上述类定义为spring bean(以利用依赖注入)并确保调用者在调用任何performTask *()方法之前调用initialize()?

注意 - 我知道Object getBean(String name, Object... args) throws BeansException;但它看起来不太好,因为我们会失去类型安全性。还有其他建议吗?

更新 -这里提到的带有查找方法注入的解决方案是一个不错的选择。在春季实施之前,您对以下使用内部类的替代方案有何看法

public class MyService {
    private ServiceA serviceA;
    private ServiceB serviceB;

    public class DataClass {
        private Integer counter;

        public DataClass(Integer counter) {
            this.counter = counter;
        }

        public Integer performActionAndGetCount() {
            serviceB.performAction();
            return this.counter++;
        }
    } 
}

//client module
MyService service = beanFactory.getBean("myService");
MyService.DataClass dataClass = service.new DataClass(1);

这种方法有什么缺点吗?

4

3 回答 3

0

使用组件、服务或存储库注释来注释您的类。这将使您的类被视为一个 spring bean,然后您可以使用依赖注入和运行时初始化。

确保在您的 {dispatcher-servlet}.xml(将 {} 中的名称替换为您在 web.xml 中为您的调度程序 servlet 指定的名称)文件中您已经编写了这一行

于 2012-06-07T12:24:21.900 回答
0

这可以使用scope="prototype"和的组合来完成<lookup-method>

首先,将要参数化的类定义为 bean scope="prototype"。这将导致上下文在每次请求 bean 时生成一个新实例。

<bean class="com.example.Validator" scope="prototype"/>

然后,定义一个“工厂类”,它将包装新对象的生成和初始化。

<bean class="com.example.ValidatorFactory">
  <lookup-method name="newValidator"/>
</bean>

这个类看起来像这样:

public class ValidatorFactory {
    public Validator createValidator(String str, Class<?> classA, Class<?> classB) {
        Validator v = newValidator();
        v.initialize(str, classA, classB);
        return v;
    }

    protected void newValidator() {
        // Spring will implement this via AOP
    }
}

这迫使客户端通过一个例程,该例程将initialize()在仍然通过 Spring 上下文加载 bean 的同时调用。

于 2018-04-11T21:05:09.593 回答
-1

我不太清楚你的要求。但我认为 @PostConstruct 带注释的方法可以帮助您。您可以在此处找到有关 @PostConstruct 注释的更多详细信息

希望这对您有所帮助。干杯。

于 2012-06-07T12:16:39.930 回答