基于spring注⼊为null的原因及解决⽅案
⽬录
spring注⼊为null
场景
经检查出原因
解决⽅法
@PostConstruct:
Spring注⼊的属性为null可能的情况
保证Bean能够交付给Spring容器
检查实例化的⽅式
检查注⼊的位置
spring注⼊为null
解决⽅法⽤到@PostConstruct注解,平常没接触过,写博客记录⼀下。
场景
在使⽤Aviator时需要⾃定义函数,但是在使⽤⾃定函数的时候发现@Resource注⼊的类是null,使⽤的框架是springboot所以没什么好配置的,在⽹上了下原因,到其中⼀个“在spring中如果使⽤new创建⼀个对象时,这个对象将不在受spring管理器管理”的博客,所以检查了下⾃⼰是否使⽤new⽅式管理bean。
经检查出原因
在项⽬启动时我⽤了静态块⽤new⽅式管理了bean。
但是使⽤静态块必须使⽤静态变量,⽽spring⽆法注⼊静态变量(有⽅法可以实现,但是⽐较⿇烦)。
解决⽅法
实例化bean的三种方式将静态块改造成⽅法,并且使⽤注⼊⽅式传⼊对象,然后使⽤@PostConstruct注解,在将在依赖注⼊完成后,⾃动执⾏被注解的⽅法,这样就达到了启动项⽬注册函数的效果。
@PostConstruct:
被@PostConstruct修饰的⽅法会在服务器加载Servlet的时候运⾏,并且只会被服务器执⾏⼀次。PostConstruct在构造函数之后执⾏,init()⽅法之前执⾏。
Spring注⼊的属性为null可能的情况
Spring注⼊的属性为null可能的情况,使⽤注解⽅式。
保证Bean能够交付给Spring容器
1、你的组件上⾯是否加⼊了合适的注解。例如:@Service, @Component等。
2、检查⼀下你context-scan扫描器配置的路径是否正确。(SpringBoot检查⼀下你的包是否和主⼊⼝程序在⼀个⽬录下,并且检@ComponentScan配置的路径是否正确)
检查实例化的⽅式
1、很低级问题,但是⼀不注意就犯了。检查是不是new了⼀个对象,这样的话就绕过了容器的依赖注⼊过程,也可能出现获取不到应有的属性这种情况。
说明:Spring是⼀个bean的容器,由容器负责对象的初始化和依赖注⼊。当我们想要从中获取⼀个Bean的实例时,就从Spring容器中获取。
检查注⼊的位置
1、把@Autowired注解加在了⼀个静态属性上,注⼊为空。
说明:Spring帮我们做属性的⾃动注⼊,是在帮助我们实例化Bean之后完成的。⽽static修饰该属性是归属于类⽽不是实例的。当Spring我们想给static属性注⼊值的时候,对象还没创建,这种情况⼀定会出现注⼊为空的情况。
2、在应⽤的Filter或Listener中使⽤了@Autowired ,注⼊为空web容器启动是按照⼀定顺序的,即:Listener --> Filter --
>Servlet。
因为Filter和Listener加载顺序优先于spring容器初始化实例,所以会出现null。Spring的⼊⼝就在Servlet⾥。可以⽤ApplicationContext根据bean名称(注意名称为实现类⽽不是接⼝)去获取bean
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论