1.基于注解管理Bean
(1) 标识组件常用注解
注解一般分为以下四个注解:
- @Component:将类标识为普通组件
- @Controller:将类标识为控制层组件
- @Service:将类标识为业务层组件
- @Repository:将类标识为持久层组件
以上四个的功能都是相当于在XML标识一个Bean
@Controller、@Service、@Repository这三个注解只是在@Component注解的基础上起了三个新的名字
对于Spring使用IOC容器管理这些组件来说没有区别。所以@Controller、@Service、@Repository这三个注解只是给开发人员看的,让我们能够便于分辨组件的作用。
如果一个类不是这三个层次,可以标识注解@Component
(2) 扫描组件
- 最基本的扫描方式
<!--扫描组件,告诉spring哪里有注解-->
<context:component-scan base-package="com.hnnd.spring"/>
- 指定要排除的组件
<context:component-scan>
标签拥有子标签context:exclude-filter
,其中它有两个属性可以指定排除组件的方法。
- type:设置排除或包含的依据
- type="annotation",根据注解排除,expression中设置要排除的注解的全类名
<context:component-scan base-package="com.hnnd.spring">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
- type="assignable",根据类型排除,expression中设置要排除的类型的全类名
<context:component-scan base-package="com.hnnd.spring">
<context:exclude-filter type="assignable" expression="com.hnnd.spring.controller.UserController"/>
</context:component-scan>
显然是用注解的方式比较多。
- 指定要包含的组件
<context:component-scan>
标签拥有子标签<context:include-filter>
,其中它有两个属性可以指定包含组件的方法。
但是<context:component-scan>
有属性use-default-filters
属性默认为true,也就是扫描指定包下所有的类(这时只有exclude-filter才能生效),而且<context:include-filter>
是指定在原有扫描规则的基础上追加的规则。因此我们需要将true改成false,才能让追加规则生效
<context:component-scan base-package="com.hnnd.spring" use-default-filters="false">
<!-- type:设置排除或包含的依据-->
<!-- type="annotation",根据注解排除,expression中设置要排除的注解的全类名-->
<!-- type="assignable",根据类型排除,expression中设置要排除的类型的全类名-->
<!-- <context:exclude-filter type="assignable" expression="com.hnnd.spring.controller.UserController"/>-->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
(3) 基于注解的bean的id
默认情况下,注解+扫描基础上类名首字母小写就是bean的id。例如:\(UserController\)类对应的bean的id就是\(userController\)。
但是允许自定义id,也就是注解的\(value\)就是\(id\)的值
@Controller("userController")
public class UserController {
}