springnew对象注入(SpringBoot自行new出的对象中的成员变量不能使用@Autowired注入的解决办法)

本文目录
- SpringBoot自行new出的对象中的成员变量不能使用@Autowired注入的解决办法
- Spring 两个对象互相注入会导致什么问题
- “spring中注入是什么意思” 这里怎么理解“注入”的意思
- service dao手动实例化(new)导致类中的spring对象无法注入的问题解决
- 使用spring后,哪些类该用实例注入(DI),哪些类该用new来创建实例
- 手动向Spring容器中注入对象
- spring的bean注入属性有哪几种方式
- spring为什么要使用注入的方式,new不是很好用吗
- Spring哪些类需要注入,哪些不用
SpringBoot自行new出的对象中的成员变量不能使用@Autowired注入的解决办法
运行此Service所提供的方法后报异常提示:plantService 为 null
自己创建的类未使用(@Component)即为加入Spring容器中,则其中的被@Autowired的成员变量也不会被注入。
不使用@Autowired,而使用一个自定义工具类帮助注入
第一步:创建工具类并使用@Component注解注入
此处可能报applicationContext为null的错误
解决办法:将此工具类放在Application启动类同一个包下
第二步:
在需要注入的成员变量位置使用工具类赋值
Spring 两个对象互相注入会导致什么问题
试试
@Service("A")
public class A {
@Autowired
private B b;
public A(){
System.out.println("****** A is load");
}
public void print(){
System.out.println("A success!!!");
}
}
@Service("B")
public class B {
@Autowired
private A a;
public B(){
System.out.println("****** B is load");
}
}
两个类,用Spring管理,相互注入,不会报错
spring容器初始化bean
开始时,如果A和B都是容器管理,那么在初始化bean的时候,会先相当于new出来A对象和B对象,然后在分别初始化内部的属性。
当然这样的注入不会报错。但如果你是自己new出来的,那就会出现死循环。
“spring中注入是什么意思” 这里怎么理解“注入”的意思
spring通过“控制反转”实现了“依赖注入”。所谓的注入,我的理解是程序实现就像盖房子,spring允许你在类(class)里搭个框架,在配置文件中注明在什么地方用什么材料,在运行时spring按照你的配置真正向这个架子里“注入”了水泥、钢筋等等。
这在实际运用中很方便,比如你需要向日志服务器提交记录,但是日志服务器的ip地址可能会变更,你可以把ip地址写在配置文件里,这样当ip改变时,只需更改配置文件,而不需要修改类再重新编译。
service dao手动实例化(new)导致类中的spring对象无法注入的问题解决
手动注入会报空指针异常
new对象 =null,使用new创建对象时,Spring注入的bean为null
使用标签@Component
不需要手动,最好是自动注入
使用spring后,哪些类该用实例注入(DI),哪些类该用new来创建实例
首先说spring管理的类,就是spring在启动的时候,在spring容器中,由spring给你创建的,也就new的,spring会帮你维护。一般都是单例的,也就是一个对象。
需要自己new的实例,一般是数据实例,比如你要插入一条数据,就需要自己new。因为这些实例,包含数据信息,每个实例都是不同的,当然不能是单例模式的,也就不能使用注入。
然后说:Spring AOP的目标是与Spring的依赖注入功能良好地集成...”
是指spring管理的实例,例如啊,你声明了一个id为user的bean,在aop中,就可以直接使用该id来关联这个实例。
最后:要想给将来留下足够实现AOP的机会,岂不是要尽可能用实例注入来替代几乎所有的new?
spring管理的一般都是逻辑类,是单例,是线程安全的。
当然,逻辑类中可以有数据类,这时候你可以在程序中new
你使用aop,你不是去对一个数据进行aop吧?肯定是针对某个逻辑进行的。
手动向Spring容器中注入对象
手动向Spring容器中注入对象的方法有很多,本文将简单阐述其中的四种
我们可以实现一个BeanFactory的后置处理器,在其中就可以获得BeanFactory,这样就可以调用registerSingleton方法。
注:此处bean的名字可以自定义,如这里就定义为sherlock。
如果在容器中获取该类
控制台输出:
对象就已成功注入到Spring容器中了。
注:其实在context中也有registerBean方法,可以实现一样的效果。(ApplicationContext其实继承了BeanFactory,所以它也拥有Bean工厂的功能,除此之外ApplicationContext还继承了很多其他的类,拥有一些辅助功能。总的来说,ApplicationContext其实包括了BeanFactory)
在配置类中,使用@Bean注解,返回一个想要注入的对象。@Bean括号中是bean的名字,默认为类名的小写形式。
控制台输出:
***隐藏网址***
我们可以创建一个类去实现FactoryBean接口
控制台输出:
@Import只能用在类上 ,@Import通过快速导入的方式实现把实例加入spring的IOC容器中
@Import的三种用法主要包括:
注意:这样注入的类名为类的全限定名。
@Import三种方式的总结
第一种用法:@Import({ 要导入的容器中的组件 } ):容器会自动注册这个组件,id默认是全类名
第二种用法:ImportSelector:返回需要导入的组件的全类名数组,springboot底层用的特别多。
第三种用法:ImportBeanDefinitionRegistrar:手动注册bean到容器
好了,以上就是四种手动向Spring容器中注入对象的方法。总结一下吧,分别是:
spring的bean注入属性有哪几种方式
但是,对于系统中非Spring框架管理的类,如果需要获取Spring管理的类,或者,程序中需要动态的根据Bean的id来获取Bean实例,不可能事先为该类提供所有需要的Bean属性的setter方法,在类似这样的情况下,获取Spring框架管理的类实例的方法有多种,现在简单总结如下:方法一:在初始化时保存ApplicationContext对象代码:ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml"); ac.getBean("beanId");说明:
这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。
方法二:通过Spring提供的工具类获取ApplicationContext对象代码:import org.springframework.web.context.support.WebApplicationContextUtils; ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc) ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc) ac1.getBean("beanId"); ac2.getBean("beanId");说明:
这种方式适合于采用Spring框架的B/S系统,通过ServletContext对象获取ApplicationContext对象,然后
在通过它获取需要的类实例。
上面两个工具方式的区别是,前者在获取失败时抛出异常,后者返回null。
方法三:继承自抽象类ApplicationObjectSupport说明:
抽象类ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获取到ApplicationCont
ext。Spring初始化时,会通过该抽象类的setApplicationContext(ApplicationContext
context)方法将ApplicationContext 对象注入。
方法四:继承自抽象类WebApplicationObjectSupport说明:类似上面方法,调用getWebApplicationContext()获取WebApplicationContext
方法五:实现接口ApplicationContextAware说明:实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对
象。Spring初始化时,会通过该方法将ApplicationContext 对象注入。
以上方法适合不同的情况,请根据具体情况选用相应的方法。
这里值得提一点的是,系统中用到上述方法的类实际上就于Spring框架紧密耦合在一起了,因为这些类是知
道它们是运行在Spring框架上的,因此,系统中,应该尽量的减少这类应用,使系统尽可能的独立于当前运
行环境,尽量通过DI的方式获取需要的服务提供者。
本人认为,方法五比较可行,可以设计一个工具类,专门来获取Spring中的类。减少对业务代码的侵入性。
spring为什么要使用注入的方式,new不是很好用吗
我是这么理解,某个bean,第一次是被new出来的,然后被分配一块内存,存放这个bean的所有信息,之后在使用到该bean的地方使用注解自动注入,这时使用的就是刚才被new出来的那个,不会再new,除非你设置@Scope(’prototype’),依次类推,所有注入该bean的地方,最多因为对象名不同,被分配一小块内存,但这小块内存只存放指向被new出来的bean的信息,都是引用。如果每次都是new出来,每次都要分配内存,虽然说Java有自动回收机制,但如果一个项目中bean很多,在启动服务器的时候,全部加载在Spring容器,不是项目启动失败就是跑起来很慢很慢,所以说能剩则剩,以上个人见解,勿拍砖。
Spring哪些类需要注入,哪些不用
基本上是这样的,不过注入的话也分单例和多例,需要根据实际情况去设置,spring默认情况下都是单例的,但有些情况不适用单例,例如有全局变量的时候,可能会有一些并发问题,可能就需要设置成多例

更多文章:
css表白代码(谁能告诉我,在百度空间上仿QQ空间的CSS所有代码)
2026年4月19日 12:30
化学反应工程与工艺期刊(国际上影响因子较高的关于催化剂方面的杂志有哪些)
2026年5月24日 10:00
js实现队列(javascript函数节流和函数防抖之间的区别)
2026年8月30日 20:15
clip converter(用ClipConverter下载的youku视频在电脑哪个文件夹)
2026年8月24日 21:15
matlabplot点的形状(MATLAB作图时,如何把标志数据点的形状做成实心的)
2026年1月13日 09:15
配置管理属于什么职位类型(公司让我从需求工程师转做配置管理工程师,大神们怎么看,哪个发展前景好一些ps:我是应届毕业生,还)
2025年9月1日 04:15
easyui获取数据表格的值(Easyui中获取datagrid某多个列的值)
2025年5月30日 22:45
oracle datediff(oracle 时间相减函数)
2025年9月13日 22:15
java培训好还是自学好(Java软件开发,是自学的好还是参加java培训机构)
2026年5月26日 11:45
js修改style属性(js如何改变一个图片的style的top属性)
2026年2月4日 02:15
dw软件官方免费下载中文版(Dreamweaver哪里有免费版)
2026年1月9日 06:45
word2019开发工具控件属性是灰色的(为什么word打开以后,工具栏里边的命令都是灰色的)
2026年5月10日 18:45











