为什么非容器类不能直接通过spring注解的方式调用容器类?
注入类和被注入类都被spring所管理(带有@Coponent、@Controller、@Service 、@repository等注解),可以完成调用。
但是当非容器类(没加以上注解时)使用@Autowired/@Resource调用容器中的类时,注入对象为空,报空指针异常?
回答:
spring会调用BeanPostProcessor遍历容器中的每个bean,通过反射获取成员变量判断是否有@Autowired/@Resource注解修饰,有的话从容器里面找,没有直接报错。所以你需要将你的类注入到容器中才有机会被spring处理,完成依赖注入。
为什么spring只为容器中的bean做这个注入功能?
1.因为注入的前提是先实例化,实例化后放在哪呢?无处可放!
2.扫描的范围多大呢?项目所有类?一个项目算上jar包可能有几万甚至几十万的类,如果挨个扫描,项目启动都需要十几分钟甚至更久。
3.为什么spring启动扫描@Coponent、@Controller、@Service 、@repository很快?因为这些注解都被一个@Indexed注解修饰,在编译阶段就已经将这个注解修饰的类创建了一个索引文件,项目启动时是从这个索引文件拿出所有的类进行实例化放入倒容器中,而不是每次启动去扫描所有类,这样可以大大提高启动速度。
回答:
都是非容器类了,spring不管理,它肯定不知道要注入是那个具体的实例,你要自己new出来。
回答:
依赖注入是Spring处理的。
Spring启动时,会将ComponentScan
定义范围内,带有@Coponent、@Controller、@Service 、@Repository等注解
的类作为Bean管理起来。
当使用@Autowired/@Resource
时。这个依赖注入也是由Spring处理。脱离了Spring环境,当然找不到相应的Bean对象。
回答:
非容器类这个说法本身就不是很准确。
在类上加上@Service等注解,则Spring会将其实例化注册到容器中,spring会负责注入由@Autowired修饰的变量。如果没有@Service等注解修饰则该类其实是没有生成对象的,更何谈注入由@Autowired修饰的变量了。
当然你也可以自定义BeanFactoryPostProcessor类注册BeanDefinition,这样可以不需要@Service注解修饰。
回答:
spring 是通过xml配置文件或者扫描的方式通过注解来注入bean,然后将bean的相关信息存到类似map结构中,map的key通过为指定的bean id,默认是bean的名称。不将类注入到map结构中让spring去管理,就没办法通过注解去注入实例对象,相当于无稽之谈
回答:
spring 容器里面的类都是被代理后的类,在创建代理类的时候,会去扫描当前类的依赖,并注入到当前代理类中。
如果没加注解,自己 new 出来的类,你在属性上面加了 Autowired 也没用,因为没有注入的过程
以上是 为什么非容器类不能直接通过spring注解的方式调用容器类? 的全部内容, 来源链接: utcz.com/p/944885.html