关于@Autowired和
2018-12-14  本文已影响0人  哈哈哈_d7ac

<context:component-scan base-package=" " />

要使用<context:component-scan>标签,必须要有xmlns:context

配置<context:component-scan base-package="" />扫描的包及其子包,只有当遇到了@Component @Controller@Service这些注解时spring才会注册对应的bean,配置扫描多个包,可以通过“,”逗号隔开:

<context:component-scan base-package="com.test1,com.test2,com.test3" />

另外<context:component-scan>有一个use-default-filters属性和两个子标签<context:include-filter>,<context:exclude-filter>。use-default-filters属性是使用默认过滤器,默认值为true,首先通过exclude-filter 进行黑名单过滤;然后通过include-filter 进行白名单过滤;否则默认选中扫描。(true则会对除了黑名单外进行扫描管理,false则不使用默认过滤器)。

@Autowired

在Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 省去了set ,get方法。

当spring容器中有bean之后,就能使用@autowired自动注入相对应的bean了,这是因为在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor这样的bean,当这个bean扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该注解标注的变量或方法及构造函数的参数。

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

也就是说,如果你不配置扫描也不写@Controller@Service这些注解时,你必须手动在spring配置文件中配置bean,才能使用@Autowied注入bean。

此外在使用@Autowired时,首先在容器中查询对应类型的bean

    1.如果查询结果刚好为一个,就将该bean装配给@Autowired指定的变量。

    2.如果查询的结果不止一个,那么@Autowired会根据指定变量的名称来查找。也可以使用注解@Qualifier("bean的名称")来指定查找的bean。

    3.如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false。

当使用@Autowired注解的时候,其实默认就是@Autowired(required=true),表示注入的时候,该bean必须存在,否则就会注入失败。

@Autowired(required=false):表示忽略当前要注入的bean,如果有直接注入,没有跳过,程序不会报错。

上一篇下一篇

猜你喜欢

热点阅读