假设我们有一个类:
public class MyClass { @Autowired private AnotherBean anotherBean; }
然后我们创建了这个类的一个对象(或者其他框架已经创建了这个类的示例)。
MyClass obj = new MyClass();
是否仍然可以注入依赖项?类似于:
applicationContext.injectDependencies(obj);
(我想谷歌Guice有这样的东西)
c2e8gylq1#
你可以使用AutowireCapableBeanFactory的autowireBean()方法来实现,你传递给它一个任意的对象,Spring会把它当作它自己创建的东西来对待,并且会应用各种各样的自动装配细节。要获得AutowireCapableBeanFactory,只需自动连线:
AutowireCapableBeanFactory
autowireBean()
private @Autowired AutowireCapableBeanFactory beanFactory; public void doStuff() { MyBean obj = new MyBean(); beanFactory.autowireBean(obj); // obj will now have its dependencies autowired. }
tcbh2hod2#
您还可以使用@Configurable注解标记MyClass:
@Configurable public class MyClass { @Autowired private AnotherClass instance }
然后在创建时它会自动注入它的依赖项。你也应该在你的应用上下文xml中有<context:spring-configured/>。
<context:spring-configured/>
mpgws1up3#
只是得到了同样的需求,在我的情况下,它已经是非Spring可管理的java类内部的逻辑,可以访问ApplicationContext。灵感来自scaffman。
ApplicationContext
AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory(); factory.autowireBean(manuallyCreatedInstance);
j9per5c44#
我使用了一种不同的方法,我用Spring加载了bean,我想从第三方库的扩展类中调用这些bean,该库创建了自己的线程。我使用的方法是https://confluence.jaytaala.com/display/TKB/Super+simple+approach+to+accessing+Spring+beans+from+non-Spring+managed+classes+and+POJOs在非托管类中:
{ [...] SomeBean bc = (SomeBean) SpringContext.getBean(SomeBean.class); [...] bc.someMethod(...) }
然后作为主应用程序中的帮助器类:
import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; @Component public class SpringContext implements ApplicationContextAware { private static ApplicationContext context; public static <T extends Object> T getBean(Class<T> beanClass) { return context.getBean(beanClass); } @Override public void setApplicationContext(ApplicationContext context) throws BeansException { SpringContext.context = context; } }
zqry0prt5#
我想分享我的解决方案,它遵循@glaz666 answer中提到的briefly方法,因为
briefly
1.带有Spring Neo4j & Aop starts的Spring Boot 2.0.3(无论如何都是无关紧要的)1.当Spring Boot准备就绪时,使用@Configurable方法示例化bean(使用ApplicationRunner)
Spring Neo4j & Aop starts
Spring Boot
@Configurable
ApplicationRunner
@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = false)
Bean
@Autowired
@EnableSpringConfigured
@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
XXXApplicaiton.java
@SpringBootApplication
compile('org.springframework.boot:spring-boot-starter-aop')
compile('org.springframework:spring-aspects:5.0.7.RELEASE')
org.springframework.boot:spring-boot-starter-aop
spring-aop
org.springframework.context.annotation.aspect.*
fnx2tebb6#
这对我很有效:
@Configuration public class AppConfig { @Bean public TransferService transferService() { return new TransferServiceImpl(); } }
查看更多信息:https://docs.spring.io/spring-javaconfig/docs/1.0.0.m3/reference/html/creating-bean-definitions.html
w8rqjzmb7#
发现以下方法对我的用例很有用。在这里分享以供参考,功劳完全归blogger所有。这创建了一个静态字段并从Spring填充该字段,然后提供了一个公共静态方法,该方法返回上面填充的字段。https://sultanov.dev/blog/access-spring-beans-from-unmanaged-objects/
7条答案
按热度按时间c2e8gylq1#
你可以使用
AutowireCapableBeanFactory
的autowireBean()
方法来实现,你传递给它一个任意的对象,Spring会把它当作它自己创建的东西来对待,并且会应用各种各样的自动装配细节。要获得
AutowireCapableBeanFactory
,只需自动连线:tcbh2hod2#
您还可以使用@Configurable注解标记MyClass:
然后在创建时它会自动注入它的依赖项。你也应该在你的应用上下文xml中有
<context:spring-configured/>
。mpgws1up3#
只是得到了同样的需求,在我的情况下,它已经是非Spring可管理的java类内部的逻辑,可以访问
ApplicationContext
。灵感来自scaffman。j9per5c44#
我使用了一种不同的方法,我用Spring加载了bean,我想从第三方库的扩展类中调用这些bean,该库创建了自己的线程。
我使用的方法是https://confluence.jaytaala.com/display/TKB/Super+simple+approach+to+accessing+Spring+beans+from+non-Spring+managed+classes+and+POJOs
在非托管类中:
然后作为主应用程序中的帮助器类:
zqry0prt5#
我想分享我的解决方案,它遵循@glaz666 answer中提到的
briefly
方法,因为我的设置
1.带有
Spring Neo4j & Aop starts
的Spring Boot 2.0.3(无论如何都是无关紧要的)1.当
Spring Boot
准备就绪时,使用@Configurable
方法示例化bean(使用ApplicationRunner
)步骤
我需要按照以下步骤操作才能使其正常工作
@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = false)
将被放置在要手动示例化的Bean
之上。在我的例子中,要手动示例化的Bean
具有@Autowired
服务,因此,支持上述注解。1.使用
@EnableSpringConfigured
和@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
注解Spring Boot的主XXXApplicaiton.java
(或使用@SpringBootApplication
注解的文件1.在您的构建文件中添加依赖项(即build. gradle或pom.xml,具体取决于您使用的文件)
compile('org.springframework.boot:spring-boot-starter-aop')
和compile('org.springframework:spring-aspects:5.0.7.RELEASE')
1.新的+你的
Bean
,它是用@Configurable
注解的,它的依赖关系应该是自动连接的。org.springframework.boot:spring-boot-starter-aop
会传递性地拉取spring-aop
(如这里所示mavencentral)但是,在我的例子中,Eclipse未能解析@EnableSpringConfigured
注解,因此,除了启动器之外,我还显式添加了spring-aop
依赖项。只需声明依赖关系或冒险找出org.springframework.context.annotation.aspect.*
不可用fnx2tebb6#
这对我很有效:
查看更多信息:https://docs.spring.io/spring-javaconfig/docs/1.0.0.m3/reference/html/creating-bean-definitions.html
w8rqjzmb7#
发现以下方法对我的用例很有用。在这里分享以供参考,功劳完全归blogger所有。这创建了一个静态字段并从Spring填充该字段,然后提供了一个公共静态方法,该方法返回上面填充的字段。
https://sultanov.dev/blog/access-spring-beans-from-unmanaged-objects/