第六章IOC:使用注解装配bean
6.1-四个基本的组件注解
我们首先来看一下关于四个基本的组件注解(如下所示)。这四个基本的组件注解的含义是人为区分的,也就是说我在持久层使用@Repository注解时spring框架是不能分辨它就是一个持久层组件。因此在使用时我们需要自己区分层次的含义使用合理的注解。以下四个注解都是在类上使用。
需要注意的是,它们都有一个value属性。该属性是用来注释被注解的bean的id,也就是相当于我们在xml中手动配置的id属性。默认情况下spring将类名的首字母小写作为value属性值,即默认情况等同于@Repository(value="userDao"),所以一般value的属性是可以省略。
@Component 组件基本注解 (标识了一个受 Spring 管理的基本组件,没有赋予其特殊的含义)
@Repository 标识持久层组件 (与数据持久化有关,一般用来注解持久层组件)
@Service 标识服务层组件 (该层主要涉及有关你项目中具体业务的实现逻辑,该层会去调用相应的持久层)
@Controller 标识控制层组件 (该层用来调度服务层去响应相应的请求,然后返回给对应的视图层)
按照自己的理解对MVC三层架构与这几个注解的关系做一下介绍。@Component层次由于没有给与相应含义就与三层架构思想基本没有直接的关联。@Repository持久层,就相当于是Model模型层,一般用来注解项目中的DAO层;@Service服务层,是用来注解你的业务代码组件的层;@Controller控制层,则是分离业务后剩下的部分,用来直接响应请求,调用业务层和视图层;对于MVC中的视图层一般是不需要注解,也就是我们javaWEB中的jsp或者其他的视图表现方式。
6.2-context:component-scan自动扫描组件
四个基本的组件注解可以注解相应的类,那么spring通过什么来获取它们呢?就是这一节我们需要介绍的context:component-scan元素来实现这一功能。
首先,需要在spring的配置文件中引入context的命名空间,在beas中引入xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd"
(★注意:引入context的方式见附录一。需要注意的是xsi:schemaLocation是要同时包含所有命名空间的信息,这里我只是单独把context列出来。)
第二步,在spring的xml文件中配置context:component-scan
<context:component-scan ></context:component-scan>
第三步,配置component-scan的属性。
base-package="com.spring.servlets"
指定spring扫描指定的包名,可以使用 逗号、分号、空间/制表符(tab)/换行 来分割多个扫描包(都是指英文字符)。例如:"com.spring.servlets,com.spring.controlers,com.spring.entities"用“,”分割开扫描多个包。
支持数据类:string,默认值:无。
resource-pattern="**/*.class"
控制可用于组建检测的类文件,默认推荐使用”**/*.class”配置一般不需要设置。表示spring可以检测工程目录下所有的.class文件。
支持的数据类型string。默认值:”**/*.class”。
annotation-config="true"
该标签隐式的向Spring容器注册了:AutowiredAnnotationBeanPostProcessor 、CommondAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor、RequiredAnnotationBeanPostProcessor这四个BeanPostProcessor。这四个组件是为spring
一些特殊的注解提供支持的,例如@Autowired注解。
支持数据类型boolean,默认值:true,表示向spring容器注册。
name-generator=""
scope-resolver=""
scoped-proxy="no"
use-default-filters="true"