【问题标题】:Spring bean fields injectionSpring bean 字段注入
【发布时间】:2011-04-20 17:53:11
【问题描述】:

使用 Spring IoC 允许设置通过 setter 公开的 bean 属性:

public class Bean {
    private String value;
    public void setValue(String value) {
        this.value = value;
    }
}

而bean定义是:

<bean class="Bean">
    <property name="value" value="Hello!">
</bean>

是否有任何现有的 Spring Framework 插件/类允许直接将 bean 字段公开为属性而无需定义 setter?像这样具有相同 bean 定义的东西:

public class Bean {
    @Property
    private String value;
}

【问题讨论】:

  • 我不明白您要做什么?你想在字段中注入字符串吗?
  • 不完全是。我想在不编写 setter 方法的情况下将字段公开为属性。
  • 这是个好问题,我想。 Spring MVC 可以对 MVC 命令对象进行直接字段注入,因此考虑对 bean 属性进行直接字段注入是明智的。但是,我不相信在 Spring 中有任何方法可以做到这一点。
  • 我认为setter是必要的,你为什么需要这样做?
  • 我只想在有用的地方用简单的注释替换一堆公共设置器(它们确实是垃圾方法)。

标签: java spring inversion-of-control dependency-properties javabeans


【解决方案1】:

你可以:

  • 使用@Value注解并注入一个属性(使用表达式语言)
  • 看看Project Lombok,它可以让你跳过所有的setter和getter(以及更多)

【讨论】:

  • @Value 注解将 IoC 替换为 Resource Locator。它需要在java代码中定义属性值。而且我不能有 2 个具有不同属性的不同实例。这就是为什么我只想将曝光作为财产。
  • 关于 lombok —— 在我的案例中使用这个项目似乎就像车轮上的枪。
  • 龙目岛是要走的路。只需使用 @Setter 注释您的私有字段即可。没有运行时依赖,您只需要在编译时使用 lombok 并且生成的 .class 文件将具有 setter 方法。唯一的问题是当你想用 @Required 之类的东西来注释方法时。
【解决方案2】:

Spring 支持基于注解的字段注入 out of the box 用于 JSR-250 @Resource 注解。 Spring自己的@AutowiredJSR 330@Injectalso work

你只需要add this line to your context.xml:

<context:annotation-config/>

参考:

【讨论】:

  • 这些不适用于字符串值,它们仅适用于注入 Bean。
【解决方案3】:

你所要求的是不可能的。 Spring 订阅约定优于配置。所以它期望有setter和getter。虽然使用 Spring 可以直接进行现场注入;而 Spring 使用 Reflection 来实现这一点,Spring 不提供反转这个过程以使用 Reflection 来访问没有 setter 或 getter 的字段。甚至 Spring AOP 实现也希望找到构造它的代理的方法。

【讨论】:

    猜你喜欢
    • 2021-04-24
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 2012-02-19
    • 2017-02-27
    相关资源
    最近更新 更多