2014-09-30 35 views
0

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

但显然这似乎并不适用于我的问题,就是状态: [...] Spring会在配置结束后校验所有属性(不是原语或集合)已被设置。 [...]

我想避免直接从spring-context请求我的对象。这似乎违反了DI思想。我的意思是说,重点不是主动调用某些东西,而是要被动地获取所有注入的依赖关系,对吧?

那么我能做些什么来注入基元?

编辑:或者是因为除了服务bean注入到业务类中的依赖关系是不常见的?

+0

使用带参数的构造函数。 – DwB 2014-09-30 15:06:50

回答

0

也许你应该看看到@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由同一个beanpost处理器处理(http://grepcode.com/file/repository.springsource.com/org.springframework/org.springframework.beans/3.2.3/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java

+0

您的链接看起来几乎与原文中引用的页面相同。我尝试过,但没有成功,因为显然这种技术不适用于基元(在页面中搜索“基元”或从原始帖子中查看引用)。 – m5c 2014-10-01 08:28:15

+0

原始排除似乎不会影响@Value注释。 – Mektoub 2014-10-01 11:45:33

+0

你是对的!一旦你正确地设置了项目,它就完美的工作 - 我的不好。 ;-) 我的问题是,我错过了一些与aspectj相关的导入,特别是忽略了使用正确的运行时参数启动应用程序。这是我发现一个很好的演练的地方: http://tamasgyorfi.wordpress.com/2013/11/13/spring-dependency-injection-configurable/ http://olivergierke.de/2009/05/using-springs在三个简单的步骤中配置/ 顺便说一句,Java-8和aspectj - 我需要aspectj-1.8.2才能使它工作(早期版本没有)。 – m5c 2014-10-01 13:19:20

0

可以使用applicationContext.getBeanFactory()。resolveEmbeddedValue(“$ {} my.property”)

+0

是的,我可以,但是我会主动调用Spring元素来获取我的值。如果可能的话,我想避免这种情况,因为我想依靠DI。 – m5c 2014-09-30 15:08:27

0

我不太明白,因为一旦你说你不想要的业务对象自动装配Autowired或使用getBean,它们不再被spring容器管理。

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

+0

是和不是。我确实希望他们自动装配。但是我不能使用“@autowired”的注解,因为“@autowired”只能用于注入其他bean,而不是定义为属性的原始值。 – m5c 2014-09-30 17:08:46

+0

嗯。每当对象被实例化时,我认为这些原语是不同的?我想知道你是否可以在组件上使用Configuration类,SCOPE_PROTOTYPE,当然还有setter?也许通过类似于XML版本构造函数参数的属性对象来渲染值?如果这是一个多线程应用程序,它也很重要。我不禁想到你的问题不仅仅是原始问题,这可以用Integer,Long等来解决。我觉得我只是在猜测这一点。我不认为我完全理解用例。 – Terry 2014-09-30 18:03:54

+0

是的,这是一个有帮助的提示。我认为矛盾之处在于,一方面我想要DI,另一方面我不想让班级由豆厂维护和维护。 – m5c 2014-09-30 22:23:01

相关问题