天天看点

Spring Ioc 使用注解的形式进行自动装配

1.使用注解标识组件

①普通组件:@Component

标识一个受Spring IOC容器管理的组件

②持久化层组件:@Respository

标识一个受Spring IOC容器管理的持久化层组件

③业务逻辑层组件:@Service

标识一个受Spring IOC容器管理的业务逻辑层组件

④表述层控制器组件:@Controller

标识一个受Spring IOC容器管理的表述层控制器组件

⑤组件命名规则

[1]默认情况:使用组件的简单类名首字母小写后得到的字符串作为bean的id

[2]使用组件注解的value属性指定bean的id

事实上Spring并没有能力识别一个组件到底是不是它所标记的类型,即使将@Respository注解用在一个表述层控制器组件上面也不会产生任何错误,所以@Respository、@Service、@Controller这几个注解仅仅是为了让开发人员自己明确当前的组件扮演的角色。

2.组件扫描

指定要扫描的包

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

[1]base-package属性指定一个需要扫描的基类包,Spring容器将会扫描这个基类包及其子包中的所有类。

[2]当需要扫描多个包时可以使用逗号分隔。

[3]如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类,示例:

<context:component-scan  base-package="com.xxx.component"  resource-pattern="autowire/*.class"/>
           

[4]包含与排除

●context:include-filter子节点表示要包含的目标类

注意:通常需要与use-default-filters属性配合使用才能够达到“仅包含某些组件”这样的效果。即:通过将use-default-filters属性设置为false,禁用默认过滤器, 然后扫描的就只是include-filter中的规则指定的组件了。

●context:exclude-filter子节点表示要排除在外的目标类

●component-scan下可以拥有若干个include-filter和exclude-filter子节点

@Autowired注解,默认情况下,所有使用@Autowired注解的属性都需要被设置。当Spring找不到匹配的bean装配属性时,会抛出异常。若某一属性允许不被设置,可以设置@Autowired注解的required属性为 false。如果bean的id值不相同,通过类型的自动装配将无法工作,此时可以在@Qualifier注解里提供bean的名称。

Spring还支持@Resource注解和@Inject注解,三个注解的使用功能类似。

继续阅读