Java 如何在创建Springbean时使用;新";

Java 如何在创建Springbean时使用;新";,java,spring,object,dependency-injection,primitive,Java,Spring,Object,Dependency Injection,Primitive,我有一个在运行时创建的业务类实例(使用“new”)。我想将基本属性值注入这个实体。 我不能使用@autowired,因为我不想注入bean,而是要注入基本属性。 我知道,由于该类不是由Bean工厂本身初始化的,所以我需要某种技巧来注入值。 所以我使用AspectJ: 但很明显,这似乎不适用于我的问题,因为它表明: […]然后Spring将在配置后验证所有属性(不是原语或集合)是否已设置。[……] 我希望避免直接从spring上下文请求对象。这似乎违反了DI的思想。我的意思是,重点不是主动调用某

我有一个在运行时创建的业务类实例(使用“new”)。我想将基本属性值注入这个实体。 我不能使用@autowired,因为我不想注入bean,而是要注入基本属性。 我知道,由于该类不是由Bean工厂本身初始化的,所以我需要某种技巧来注入值。 所以我使用AspectJ:

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

我希望避免直接从spring上下文请求对象。这似乎违反了DI的思想。我的意思是,重点不是主动调用某些东西,而是被动地注入所有依赖项,对吗

那么我能做些什么来注入原语呢


编辑:还是因为将服务bean之外的依赖项注入到业务类中并不常见?

您可以使用applicationContext.getBeanFactory().resolveEmbeddedValue(“${my.property}”)我不太明白,因为一旦你说你不想让业务对象自动连接或使用getBean,它们就不再由spring容器管理了


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

也许你应该看看@Configurable注释:

然后要注入值,请使用@value,例如:@value(${some.property:defaultvalue})


原语排除似乎不会影响@Value注释。“最好在字段或方法级别使用@Autowired或@Inject为@configurableBeans指定显式的、注释驱动的依赖项注入”,并且@Autowired和@Value由同一个beanpostprocessor()处理。

使用带参数的构造函数。是的,我可以,但是我会主动调用一个Spring元素来获取我的值。如果可能的话,这就是我想要避免的,因为我想要依赖DI。是和否。我确实想要它们自动连接。但是我不能使用anotation“@autowired”,因为“@autowired”只用于注入其他bean,而不是定义为properties.Hmmm的原始值。我想每次实例化对象时,这些原语都是不同的?我想知道您是否可以在组件上使用配置类、SCOPE_原型以及setter?可能通过类似于XML版本构造函数args的属性对象来蛇行这些值?如果这是一个多线程应用程序与否,也非常重要。我忍不住认为你的问题不仅仅是原始的;这个问题可以用整数,Long,等等来解决,我觉得我现在只是在猜测。我不认为我完全理解这个用例。是的,这是一个有用的提示。我想矛盾的是,一方面我想要DI,另一方面我不想让bean工厂安装和维护这个类。最终我决定使用一个属性文件来存储原语的值。我可以通过程序访问该文件。我想得越久,我就越觉得primitive injection只适用于spring维护的服务类,而不适用于业务类。我试过了,但没有成功,因为这种技术显然不适用于基本体(在页面中搜索“基本体”或查看原始帖子中的引用)。基本体排除似乎不会影响@Value注释。你说得对!一旦你正确地设置了项目,它就会完美地工作——我的错。;)我的问题是,我错过了一些与aspectj相关的导入,尤其是忽略了使用正确的运行时参数启动应用程序。在这里,我找到了一个很好的演练:顺便说一句,小心使用Java-8和aspectj——我需要aspectj-1.8.2才能让它工作(早期版本没有)。