new出来的对象的自动装配

背景

在平时的工作中存在一些我们new出来的对象,这些对象需要依赖Spring容器中的bean。

但是如何优雅地设置Spring容器中的bean到我们new出来的对象中呢。

1.使用FactoryBean

``` package dcs.thread; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component;

@Component public class DataCompareRunnableFactoryBean implements FactoryBean { ​    @Autowired    DataCompareService dataCompareService; ​    @Override    public Object getObject() throws Exception {        return new DataCompareRunnable(dataCompareService);   } ​    @Override    public Class> getObjectType() {        return DataCompareRunnable.class;   } ​    @Override    public boolean isSingleton() {        return false;   } } ```

2.使用SpringContextUtil

package utils; ​ import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; ​ import java.util.Map; import java.util.Optional; ​ /** * @Description: Spring 上下文工具, 可用于获取spring 容器中的Bean */ @Component public class SpringContextUtil implements ApplicationContextAware { ​    private static ApplicationContext applicationContext; ​    @Override    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {        SpringContextUtil.applicationContext = applicationContext;   } ​    /**     * @Description: 获取spring容器中的bean,通过bean名称获取     * @param beanName bean名称     * @return: Object 返回Object,需要做强制类型转换     */    public static Object getBean(String beanName){        return applicationContext.getBean(beanName);   } ​    /**     * @Description: 获取spring容器中的bean, 通过bean类型获取     * @param beanClass bean 类型     * @return: T 返回指定类型的bean实例     */    public static <T> T getBean(Class<T> beanClass) { ​        return applicationContext.getBean(beanClass);   } ​    public static <T> Optional<T> getBeanOptional(Class<T> beanClass) {        try {            T bean = applicationContext.getBean(beanClass);            return Optional.of(bean);       } catch (Exception e) {            return Optional.empty();       }   } ​    /**     * @Description: 获取spring容器中的bean, 通过bean名称和bean类型精确获取     * @param beanName bean 名称     * @param beanClass bean 类型     * @return: T 返回指定类型的bean实例 ​     */    public static <T> T getBean(String beanName, Class<T> beanClass){        return applicationContext.getBean(beanName,beanClass);   } ​    public static <T> Map<String, T> getBeansOfType(Class<T> beanClass) {        return applicationContext.getBeansOfType(beanClass);   } ​ }

举例说明:

public class MyClass {    private OtherClass otherClass = SpringContextUtil.getBeansOfType(OtherClass.class) }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值