【问题标题】:How to inject primitive values into a spring bean when created using "new"使用“new”创建时如何将原始值注入spring bean
【发布时间】:2014-09-30 14:57:01
【问题描述】:

我有一个在运行时创建的业务类实例(使用“new”)。我想将原始属性值注入这个实体。 我不能使用@autowired,因为我不想注入 bean,而是注入原始属性。 我知道,由于 Bean Factory 本身没有初始化该类,因此无论如何我都需要某种技巧来注入值。 所以我开始使用 AspectJ: http://docs.spring.io/spring/docs/3.0.0.RC2/reference/html/ch07s08.html

但显然这似乎不适用于我的问题,因为它是状态: [...] 然后 Spring 将在配置后验证所有属性(不是原语或集合)都已设置。 [...]

我想避免直接从 spring-context 请求我的对象。这似乎违反了 DI 思想。我的意思不是主动调用什么东西,而是被动地注入所有依赖,对吧?

那么我可以做些什么来注入基元呢?

编辑:还是因为除了 service-beans 之外,将依赖项注入业务类并不常见?

【问题讨论】:

  • 使用带参数的构造函数。

标签: java spring object dependency-injection primitive


【解决方案1】:

也许你应该看看@Configurable 注释:http://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/aop.html#aop-atconfigurable

然后注入一个值,使用@Value,例如:@Value("${some.property:defaultvalue}")

原始排除似乎不会影响@Value 注释。 “最好在字段或方法级别使用@Autowired 或@Inject 为@Configurable bean 指定显式的、注释驱动的依赖注入”并且@Autowired 和@Value 由同一个beanpostprocessor 处理(http://grepcode.com/file/repository.springsource.com/org.springframework/org.springframework.beans/3.2.3/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java

【讨论】:

  • 您的链接似乎与我在原始帖子中引用的页面几乎相同。我尝试过,但没有成功,因为显然这种技术不适用于原语(在您的页面中搜索“原语”或查看原始帖子的引用)。
  • 原语排除似乎不影响@Value注解。
  • 你是对的!一旦您正确设置项目,它就可以完美运行 - 我的错。 ;-) 我的问题是,我错过了一些与 aspectj 相关的导入,特别是忽略了使用正确的运行时参数启动应用程序。这是我找到一个很好的演练的地方:tamasgyorfi.wordpress.com/2013/11/13/…olivergierke.de/2009/05/… 顺便提一下 Java-8 和 aspectj - 我需要 aspectj-1.8.2 才能让它工作(早期版本没有)。
【解决方案2】:

您可以使用 applicationContext.getBeanFactory().resolveEmbeddedValue("${my.property}")

【讨论】:

  • 是的,我可以,但是我会主动调用 Spring 元素来获取我的值。如果可能的话,这是我想避免的,因为我想依赖 DI。
【解决方案3】:

我不太明白,因为一旦您说您不希望业务对象 Autowired 或使用 getBean,它们就不再由 spring 容器管理。

但是您使用 AspectJ 的想法是个好主意。 Spring 和 AspectJ 可以一起工作,即 AOP,但它们不是必须的。我相信你可以编写一个构造函数切入点并得到你想要的。 This link should help 我从来没有做过构造函数连接点,总是更喜欢注解,但它应该是一个起点。

【讨论】:

  • 是和不是。我确实希望它们自动接线。但是我不能使用注解“@autowired”,因为“@autowired”只适用于注入其他bean,而不是定义为属性的原始值。
  • 嗯。我想每次实例化对象时这些原语都是不同的?我想知道您是否可以在组件上使用配置类、SCOPE_PROTOTYPE 和设置器?也许通过类似于 XML 版本的构造函数参数的属性对象来蛇形这些值?这是否是一个多线程应用程序也很重要。我不禁认为您的问题不仅仅是原语;这可以用整数、长整数等来解决我觉得我现在只是在猜测。我不认为我完全理解用例。
  • 是的,这是一个有用的提示。我想矛盾的是,一方面我想要DI,另一方面我不想让bean工厂实例化和维护这个类。
  • 最终我决定使用属性文件来存储基元的值。我可以以编程方式访问该文件。我想得越久,我就越猜想原始注入仅用于 Spring 维护的服务类,而不是用于业务类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多