Spring项目bean 无法注入问题 ---懒加载并且无引用

版权声明:summer https://blog.csdn.net/yk614294861/article/details/84286352

Spring 项目bean 无法注入或者初始化,可能是扫描问题,下面分两种情况研究

1.配置得bean 没有被扫描

先说一下<context:component-scan base-package="com.summer">   在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫描到有@Component @Controller@Service @Reposity等这些注解的类,则把这些类注册为bean ,此外这个标签还有一个use-default-filters属性,该属性默认为true,这就意味着会扫描指定包下的全部的标有@Component的类,并注册成bean.而@Repository@Service和 @Controller则是@Component的细化,用来表示更具体的用例(例如,分别对应了持久化层、服务层和表现层),所以也包含 @Controller,@Service,@Reposity等。

所以如果仅仅是在配置文件中这么写<context:component-scan base-package="com.summer">   Use-default-filter此时为true那么会对base-package包或者子包下的所有的进行java类进行扫描,并把匹配的java类注册成bean。

<context:component-scan> 标签有两个子标签:  <context:include-filter>  和 <context:exclude-filter>

<context:include-filter>  仅仅扫描指定得范围-----下面配置表明仅仅扫描com.summer包下@Controller注解得bean,使用include标签需要注意必须添加use-default-filters="false" ,否则<context:include-filter>   此过滤器无效,因为该属性默认为true,

<context:component-scan base-package="com.summer" use-default-filters="false">
		<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>	
</context:component-scan>

<context:exclude-filter> 仅仅扫描除了exclude外的范围---下面配置表明扫描com.summer包下除了@Controller注解以外的bean。

<context:component-scan base-package="com.summer">
		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>		
</context:component-scan>

通常项目中使用的是类似上面的配置,这样可以防止重复扫描,避免覆盖,引起事务失效问题,因为springMVC 和spring 这两个容器是父子容器关系,mvc 是子容器,spring 是父容器,子容器可以看见父容器中的注册的Bean,反之就不行。

 经测试有如下结论:

use-dafault-filters=”true”的情况下:<context:exclude-filter>生效,<context:include-filter>无效

use-dafault-filters=”false”的情况下:<context:exclude-filter>生效,<context:include-filter>生效

因此如果bean没有被注入时候检查扫描是否正确,确保都被扫描了

2.配置得bean确定被扫描但是还是无法注入

如果确定所有的bean都在扫描范围内还是无法注入,可能是因为设置了懒加载(default-lazy-init="true")而又没有在其他地方引入。常见于某一个单独的service(例如单独的开启一个service 专门处理一些事情,比如监听),此service 如果没有在其他地方调用,但由于是懒加载,因此不会实例化。最明显的特征是,直接在Controller 层 @Autowired引用的时候就会被加载,不引用就不被加载。

对于懒加载 ---啰嗦一句

懒加载:对象使用的时候才去创建,节省资源,但是不利于提前发现错误。

非懒加载:容器启动的时候立刻创建对象。消耗资源。利于提前发现错误。

当scope=“prototype” (多例)时,默认以懒加载的方式产生对象。

当scope=“singleton” (单例)时,默认以非懒加载的方式产生对象。

猜你喜欢

转载自blog.csdn.net/yk614294861/article/details/84286352