和 XML 配置文件一样,注解本身并不能执行,注解本身仅仅只是做一个标记,
具体的功能是框架检测到注解标记的位置,然后针对这个位置按照注解标记的
功能来执行具体操作。
本质上:所有一切的操作都是Java代码来完成的,
XML和注解只是告诉框架中的Java代码如何执行。
举例:
元旦联欢会要布置教室,蓝色的地方贴上元旦快乐四个字,红色的地方贴上拉花,
黄色的地方贴上气球。
班长做了所有标记,同学们来完成具体工作。墙上的标记相当于我们在代码中使用的注解,后面同学们做的工作,相当于框架的具体操作。
Spring 为了知道程序员在哪些地方标记了什么注解,就需要通过扫描的方式,
来进行检测。然后根据注解进行后续操作。
标识组件的常用注解
@Component:将类标识为普通组件
@Controller:将类标识为控制层组件
@Service:将类标识为业务层组件
@Repository:将类标识为持久层组件
@Controller、@Service、@Repository
这三个注解只是在@Component注解的基础上起了三个新的名字。
对于Spring使用IOC容器管理这些组件来说没有区别。
所以@Controller、@Service、@Repository这三个注解只是给开发人员看的,
让我们能够便于分辨组件的作用。
Controller控制层
@Controller
public class UserController {
}
service层
@Service
public class UserServiceImpl implements UserService {
}
dao层
@Repository
public class UserDaoImpl implements UserDao {
}
ApplicationContext.xml文件 注解标记后需要扫描
<!--
扫描组件:
将扫描的包下面加上注解的这些类作为组件进行管理,在ioc容器中有了当前加上注解的类所对应的bean对象。
-->
<context:component-scan base-package="com.atguigu.spring"></context:component-scan>
扫描组件
最基本的扫描方式
<context:component-scan base-package="com.atguigu.spring" use-default-filters="false">
指定要排除的组件
context:exclude-filter:排除扫描
type:设置排除扫描的方式
①annotation: 根据注解的类型进行排除,
②assignable:根据类的类型进行排除
expression设置排除注解的全类名 里面的地址:右击Copy/Paste Special Copey Reference
<context:component-scan base-package="com.atguigu.spring">
<!--根据注解-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<!--根据类的类型-->
<context:exclude-filter type="assignable" expression="com.atguigu.spring.controller.UserController"/>
</context:component-scan>
仅扫描指定组件
context:include-filter:包含扫描 注意:需要在context:component-scan标签中设置use-default-filters="false" use-default-filters="true"(默认),就是所设置的包下的所有的类都需要扫描, 此时可以使用排除扫描。 use-default-filters="false":所设置的包下的所有的类都需不需要扫描,此时可以使用包含扫描
<context:component-scan base-package="com.atguigu.spring" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
bean的id
通过注解+扫描所配置的bean的id,默认值为类的小驼峰,即类名首字母为小写的结果。
设置自定义id:通过标识组件的注解value属性值设置bean的自定义id。
例如:
@Controller("controller")
public class UserController {
}