基于注解管理bean,只需要在需要管理的bean上面加上注解就好了,不需要在xml文件里面一个一个去配置。使用起来比较方便。但是当我们想要使用一个外部的bean,比如配置数据库连接池datasource就必须用xml进行配置了。
一、注解和扫描
注解+扫描 ==》 使得bean可以被IOC容器管理。
a、注解
和 XML 配置文件一样,注解本身并不能执行,注解本身仅仅只是做一个标记,具体的功能是框架检测到注解标记的位置,然后针对这个位置按照注解标记的功能来执行具体操作。
本质:所有一切的操作都是Java代码来完成的,XML和注解只是告诉框架中的Java代码如何执行。
常用的四种注解
名称 | 作用 |
---|---|
@Component | 标记为普通组件 |
@Controller | 标记为控制层 |
@Service | 标记为业务层 |
@Repository | 标记为持久层 |
以@controller为例,查看源码:
内部使用的都是@Component 。所以只是名字不同的标记而已,为了方便程序员使用,才这样写的。
b、扫描
Spring 为了知道程序员在哪些地方标记了什么注解,就需要通过扫描的方式,来进行检测。然后根据注解进行后续操作。
context:component-scan
排除扫描
<context:component-scan base-package="com.lucky.spring">
<!-- 排除controlor注解的类-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
包含扫描
注意事项use-default-filters选项设置成false,这样才可以使用
可以设置多个包含也可以多个排除,但是不能同时用;
排除用的比较多。
二、注解情况下对应beanId
默认情况类的小驼峰
- userController
也可以使用注解的时候指定
@Controller("name")
public class UserController {
}
三、基于注解的自动装配
-
@Autowire 注解
在成员变量上直接标记@Autowired注解即可完成自动装配,不需要提供setXxx()方法。 -
使用位置:
1、成员变量
2、setter方法
3、有参构造函数 -
原理
@Qualifier(“service”)注解,指定当前注入bean的id。
@Autowired
@Qualifier("service")
private IUserService userService;