1、什么是注解
(
1
)注解是代码特殊标记,格式:
@
注解名称
(
属性名称
=
属性值
,
属性名称
=
属性值
..)
(
2
)使用注解,注解作用在类上面,方法上面,属性上面
(
3
)使用注解目的:简化
xml
配置
2、Spring 针对 Bean 管理中创建对象提供注解
(
1
)
@Component
(
2
)
@Service
(
3
)
@Controller
(
4
)
@Repository
*
上面四个注解功能是一样的,都可以用来创建
bean
实例
3、基于注解方式实现对象创建
- 第一步:需要引入依赖:
- 第二步:引入名称空间:圈起来的两行是新加入进去的名称空间
-
- 第三步:开启组件扫描
-
<context:component-scan></context:component-scan>是组件扫描标签,base-package="package5"表示对package5内的类进行扫描
- 组件扫描(component scanning): Spring 能够从 classpath 下自动扫描, 侦测和实例化具有特定注解的组件.即spring就知道你要用注解的方式
- 第四步:创建被注解的类
- 注意:@Component @Service @Controller @Repository这四个注解功能一样,用哪个都行
-
@Component(value = "userService") 中的value相当于<bean id="userService" class="package5.UserService"></bean>中的id="userService",别名。也可只写@Component,默认value=首字母小写后的类名
第五步:测试
- 注意:红色圈起来的就对应着@Component(value = "userService") 中的value值
4、有关组件扫描的详细内容
-
<context:component-scan base-package="package5"></context:component-scan> :代表对package5内的所有类进行组件扫描
- 如果想同时对多个包进行组件扫描,可以用逗号隔开,例如:<context:component-scan base-package="package5,package4"></context:component-scan>
- 这种方式表示不适用默认的filters进行扫描,而只对@Controller的类进行扫描
- 这种方式表示只对除了@Controller之外的类进行扫描
5、基于注解的属性注入
——这种方式比基于xml更加简洁
(1)@Autowired:根据属性类型进行自动装配注入属性
第一步 把 UserS ervice 和 UserD aoImp 类创建,UserDaoImp实现UserD ao接口。需求:使UserService中调用UserD aoImp 对象的方法第二步 在 UserService和UserDaoImp类添加创建对象的注解,在UserService注入UserDaoImp对象,在UserService类添加UserDaoImp类型属性,在属性上面使用注解@Autowired第三步 测试类
- 接口上不用添加注解
![]()
![]()
- @Autowired即按类型扫描能够注入到此属性中的对象
- 因为UserDaoImp实现了接口UserDao,所以为userDao属性自动注入UserDaoImp的对象
![]()
- 测试类
![]()
![]()
(2)@Qualifier:根据名称进行注入
这个 @Qualifier 注解的使用,和上面 @Autowired 一起使用
- 首先思考一个问题,对于上面的@Autowired对属性UserDao userDao自动注入时,如果组件扫描时,扫描到多个UserDao接口的实现类,到底会选择哪个实现类来注入?所以引出了@Qualifier注解
在(1)的基础上做以下修改:
- 给UserDaoImp起别名 : value = "UserDaoImp1"
给属性private UserDao userDao;添加注解:@Qualifier(value = "UserDaoImp1") ,这样就知道自动注入的是UserDaoImp的对象了
(3)@Resource:可以根据类型注入,可以根据名称注入
- 注意:这个不是Spring提供的方式,是javax包下提供的,所以Spring更建议用@Autowired和@Qualifier
6、完全注解开发
-
上面基于注解的方式只在xml中写了<context:component-scan base-package="package2"></context:component-scan>组件扫描这一行配置,完全注解开发就是完全不需要xml文件,只用注解完成
(1)创建配置类,替代 xml 配置文件
- @ComponentScan(basePackages = {"package2"}) 就替代了<context:component-scan base-package="package2"></context:component-scan>
(2)编写测试类
- 测试类和之前不太一样了
- AnnotationConfigApplicationContext是ApplicationContext接口的另一个实现类