1、什么是注解

(1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值..)
(2)使用注解,注解作用在类上面,方法上面,属性上面
(3)使用注解目的:简化 xml 配置

2、Spring 针对 Bean 管理中创建对象提供的注解

(1)@Component
(2)@Service (service层)
(3)@Controller (web层)
(4)@Repository (Dao层)
* 上面四个注解功能是一样的,都可以用来创建 bean 实例

3、基于注解方式实现对象创建

第一步 引入依赖
QQ截图20220419132713.png
第二步 开启组件扫描

  1. <!--开启组件扫描
  2. 1 如果扫描多个包,多个包使用逗号隔开
  3. 2 扫描包上层目录
  4. -->
  5. <context:component-scan base-package="com.atguigu.spring5.dao,com.atguigu.spring5.service"></context:component-scan>
  6. <!--或-->
  7. <context:component-scan base-package="com.atguigu"></context:component-scan>

第三步 创建类,在类上面添加创建对象注解

  1. package com.atguigu.spring5.service;
  2. import org.springframework.stereotype.Component;
  3. //在注解里面 value 属性值可以省略不写,
  4. //默认值是类名称,首字母小写
  5. //UserService -- userService
  6. @Component(value = "userService")//与 <bean id="userService" class=".."/> 类似的写法
  7. public class UserService {
  8. public void add(){
  9. System.out.println("service add......");
  10. }
  11. }

4、开启组件扫描细节配置

  1. <!--示例 1
  2. use-default-filters="false" 表示现在不使用默认 filter,自己配置 filter
  3. context:include-filter ,设置扫描哪些内容
  4. -->
  5. <context:component-scan base-package="com.atguigu" use-default-filters="false">
  6. <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
  7. <!--到com.atguigu包中只扫描带Controller注解的类-->
  8. </context:component-scan>
  1. <!--示例 2
  2. 下面配置扫描包所有内容
  3. context:exclude-filter: 设置哪些内容不进行扫描
  4. -->
  5. <context:component-scan base-package="com.atguigu">
  6. <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
  7. <!--到com.atguigu包中不扫描带Controller注解的类-->
  8. </context:component-scan>

有了这个扫描机制之后呢,只需要在类上加个注解,Spring容器一扫描到这个注解,就会自动实例化这个类。对于扫描到的类, Spring 有默认的命名策略:使用非限定类名,第一个字母小写,也可以在注解中通过 value 属性值标识组件的名称。

5、基于注解方式实现属性注入

从ioc容器中寻找bean对象再注入

(1)@Autowired:根据属性类型进行自动装配

第一步 把 service 和 dao 对象创建,在 service 和 dao 类添加创建对象注解
第二步 在 service 注入 dao 对象,在 service 类添加 dao 类型属性,在属性上面使用注解

  1. @Service
  2. public class UserService {
  3. //定义 dao 类型属性
  4. //不需要添加 set 方法
  5. //添加注入属性注解
  6. @Autowired
  7. private UserDao userDao;
  8. public void add() {
  9. System.out.println("service add......");
  10. userDao.add();
  11. }
  12. }

(2)@Qualifier:根据属性名称进行注入

这个@Qualifier 注解的使用,和上面@Autowired 一起使用

  1. @Service
  2. public class UserService {
  3. //定义 dao 类型属性
  4. //不需要添加 set 方法
  5. //添加注入属性注解
  6. @Autowired//根据类型进行注入
  7. @Qualifier(value = "userDaoImpl1")//根据名称进行注入
  8. private UserDao userDao;
  9. public void add() {
  10. System.out.println("service add......");
  11. userDao.add();
  12. }
  13. }
  14. //一个接口可能有多个实现类

同一个接口的多个实现类中,如果不少于2个实现类都有创建对象的注解,那么只用@Autowired会报错(可能是因为用的是多态UserDao),所以就要用@Qualifier,同时实现类要确定各自的value值。

(3)@Resource:可以根据类型注入,也可以根据名称注入

  1. // @Resource//根据类型进行注入
  2. @Resource(name = "userDaoImpl2")//根据名称进行注入
  3. private UserDao userDao;

@Resource是javax.annotation.Resource;中的
spring官方建议用@Autowired和@Qualifier(value = “”)来代替@Resource
以上三个都是针对对象类型的注入,不针对普通类型的注入
类似@Component , @Repository , @ Controller , @Service 这些注册Bean的注解存在局限性,只能局限作用于自己编写的类,


(4)@Value:注入普通类型属性

  1. @Value(value = "abc")
  2. private String name;

6、完全注解开发

(1)创建配置类,替代 xml 配置文件

  1. @Configuration//作为配置类,替代 xml 配置文件
  2. @ComponentScan(basePackages = {"com.atguigu"})
  3. public class SpringConfig {
  4. }

(2)编写测试类

  1. @Test
  2. public void testService2() {
  3. //加载配置类
  4. ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
  5. UserService userService = context.getBean("userService", UserService.class);
  6. System.out.println(userService);
  7. userService.add();
  8. }

注解int字段和集合类型的属性不方便???