详谈spring中bean注入无效和new创建对象的区别

网友投稿 372 2022-08-25


详谈spring中bean注入无效和new创建对象的区别

目录bean注入无效和new创建对象区别项目中用到如下代码检查代码发现bean交个spring和new比较区别主要是解耦

bean注入无效和new创建对象区别

注意!如果直接new的话,类里面的autowire将不生效

项目中用到如下代码

然后 在运行的时候发现 通过 @Autowired注入的对象 capitalDetailDOMapper和 excelRecordDOMapper的值为null

public class ExcelListener extends AnalysisEventListener {

@Autowired

private CapitalDetailDOMapper capitalDetailDOMapper;

@Autowired

private ExcelRecordDOMapper excelRecordDOMapper;

}

刚开始以为是ExcelListener没有加bean扫描注解导致的

于是加上后

@Component

public class ExcelListener extends AnalysisEventListener {

@Autowired

private CapitalDetailDOMapper capitalDetailDOMapper;

@Autowired

private ExcelRecordDOMapper excelRecordDOMapper;

}

结果在运行的时候,两个mapper,仍然为null。

检查代码发现

在ExcelListener这个类的使用场景中,是 ExcelListener excelListener= new ExcelListener(); 创建的对象

这里就明白了, 手动通过new创建和通过spring容器创建管理对象是不一样的,手动new的对象,内部用@autowire注解是无效的。

若让该autowire生效,则需要通过容器来管理对象

改造如下,先给ExcelListener加上注解@Component

@Scope(“prototype”)

@Component(“excelListener”)

public class ExcelListener extends AnalysisEventListener {

@Autowired

private CapitalDetailDOMapper capitalDetailDOMapper;

@Autowired

privateeLnhiJT ExcelRecordDOMapper excelRecordDOMapper;

}

这样 这个bean就会被加载到spring容器中,这里Scope表示bean的作用范围,spring默认创建的对象是单例的

prototype是非单例,这里我主要是想在不同的线程里面创建不同的ExcelListener实例。

可以通过容器获取bean,也可以直接@autowire

ExcelListener excelListener= SpringBeanUtils.getBean(“excelListener”);

其中SpringBeanUtils为实现了BeanFactoryPostProcessor接口的实现类

能够从spring容器里面获取到bean的实例,如果bean是非单例的 每次则获取到是一个新的bean

@Component

@Getter

public class SpringBeanUtils implements BeanFactoryPostProcessor {

private static ConfigurableListableBeanFactory beanFactory;

public static T getBean(String beanName) {

return (T) beanFactory.getBean(beanName);

}

public static T getBean(Class beanClz) {

return beanFactory.getBean(beanClz);

}

@Override

public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

SpringBeanUtils.beanFactory = beanFactory;

}

}

注意!!如果A类是单例的,那么A类中的成员B类声明为非单例的,也是无效的。

因为只有A类的一个实例,里面包含的B类的实例也只有一个。 除非能再次创建A类的实例,才能创建出另一个B类的实例对象。

bean交个spring和new比较区别

在spring的配置文件中我们要使用DataSource这个对吧

这个bean将会被多个bean引用   通过ref="dateSource"这个引用  当我们要修改这个只要修改引用就好了  不需要修改很多了

主要是解耦

比如你有一个A类 在好几个类里边要调用到A的方法 new的话就要在每个类里都new A()

spring的话 只要配置一个beahttp://n进行注入就够了。

哪天你不用A类了 改成B了~ 直接把bean里边的class改成B就搞定了

如果用new的话 要改http://好几个地方~


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python 创建虚拟环境并安装内网依赖(python基础教程)
下一篇:python SM2明文密码加解密(python编程)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~