8、Spring之基于注解的自动装配

打印 上一主题 下一主题

主题 926|帖子 926|积分 2778

8.1、场景模拟

8.1.1、UserDao接口及实现类

  1. package org.rain.spring.dao;
  2. /**
  3. * @author liaojy
  4. * @date 2023/8/5 - 18:32
  5. */
  6. public interface UserDao {
  7.     void saveUser();
  8. }
复制代码
  1. package org.rain.spring.dao.impl;
  2. import org.rain.spring.dao.UserDao;
  3. import org.springframework.stereotype.Repository;
  4. /**
  5. * @author liaojy
  6. * @date 2023/8/5 - 18:33
  7. */
  8. @Repository
  9. public class UserDaoImpl implements UserDao {
  10.     public void saveUser() {
  11. <?xml version="1.0" encoding="UTF-8"?>
  12. <beans xmlns="http://www.springframework.org/schema/beans"
  13.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  14.        xmlns:context="http://www.springframework.org/schema/context"
  15.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  16.    
  17.     <context:component-scan base-package="org.rain.spring"></context:component-scan>
  18. </beans>System.out.println("保存成功");
  19.     }
  20. }
复制代码
8.1.2、UserService接口及实现类

  1. package org.rain.spring.service;
  2. /**
  3. * @author liaojy
  4. * @date 2023/8/5 - 18:35
  5. */
  6. public interface UserService {
  7.     void saveUser();
  8. }
复制代码
  1. package org.rain.spring.service.impl;
  2. import org.rain.spring.dao.UserDao;
  3. import org.rain.spring.service.UserService;
  4. import org.springframework.stereotype.Service;
  5. /**
  6. * @author liaojy
  7. * @date 2023/8/5 - 18:36
  8. */
  9. @Service
  10. public class UserServiceImpl implements UserService {
  11.     private UserDao userDao;
  12.     public void saveUser() {
  13. <?xml version="1.0" encoding="UTF-8"?>
  14. <beans xmlns="http://www.springframework.org/schema/beans"
  15.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  16.        xmlns:context="http://www.springframework.org/schema/context"
  17.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  18.    
  19.     <context:component-scan base-package="org.rain.spring"></context:component-scan>
  20. </beans>userDao.saveUser();
  21.     }
  22. }
复制代码
8.1.3、UserController

  1. package org.rain.spring.controller;
  2. import org.rain.spring.service.UserService;
  3. import org.springframework.stereotype.Controller;
  4. /**
  5. * @author liaojy
  6. * @date 2023/8/5 - 18:38
  7. */
  8. @Controller("myUserController")
  9. public class UserController {
  10.     private UserService userService;
  11.     public void saveUser(){
  12. <?xml version="1.0" encoding="UTF-8"?>
  13. <beans xmlns="http://www.springframework.org/schema/beans"
  14.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  15.        xmlns:context="http://www.springframework.org/schema/context"
  16.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  17.    
  18.     <context:component-scan base-package="org.rain.spring"></context:component-scan>
  19. </beans>userService.saveUser();
  20.     }
  21. }
复制代码
8.1.4、bean配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:context="http://www.springframework.org/schema/context"
  5.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  6.    
  7.     <context:component-scan base-package="org.rain.spring"></context:component-scan>
  8. </beans>
复制代码
8.1.5、测试


由控制台日志可知,组件注解+组件扫描,存在尚未实现依赖注入的问题
  1.     @Test    public void testAutowireByAnnotation(){<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:context="http://www.springframework.org/schema/context"
  5.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  6.    
  7.     <context:component-scan base-package="org.rain.spring"></context:component-scan>
  8. </beans>ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");<?xml version="1.0" encoding="UTF-8"?>
  9. <beans xmlns="http://www.springframework.org/schema/beans"
  10.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  11.        xmlns:context="http://www.springframework.org/schema/context"
  12.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  13.    
  14.     <context:component-scan base-package="org.rain.spring"></context:component-scan>
  15. </beans>UserController userController = ioc.getBean(UserController.class);<?xml version="1.0" encoding="UTF-8"?>
  16. <beans xmlns="http://www.springframework.org/schema/beans"
  17.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  18.        xmlns:context="http://www.springframework.org/schema/context"
  19.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  20.    
  21.     <context:component-scan base-package="org.rain.spring"></context:component-scan>
  22. </beans>userController.saveUser();    }
复制代码
8.2、@Autowired注解

@Autowired:实现自动装配功能的注解,其能够标识的位置有三处
8.2.1、方式一:标识在成员变量上(常用)

  1.     @Autowired
  2.     private UserDao userDao;
复制代码
  1.     @Autowired
  2.     private UserService userService;
复制代码

8.2.2、方式二:标识在setter方法上

  1.     private UserDao userDao;    @Autowired    public void setUserDao(UserDao userDao) {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:context="http://www.springframework.org/schema/context"
  5.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  6.    
  7.     <context:component-scan base-package="org.rain.spring"></context:component-scan>
  8. </beans>this.userDao = userDao;    }
复制代码
  1.     private UserService userService;    @Autowired    public void setUserService(UserService userService) {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:context="http://www.springframework.org/schema/context"
  5.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  6.    
  7.     <context:component-scan base-package="org.rain.spring"></context:component-scan>
  8. </beans>this.userService = userService;    }
复制代码

8.2.3、方式三:标识在有参构造方法上

  1.     private UserDao userDao;    @Autowired    public UserServiceImpl(UserDao userDao) {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:context="http://www.springframework.org/schema/context"
  5.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  6.    
  7.     <context:component-scan base-package="org.rain.spring"></context:component-scan>
  8. </beans>this.userDao = userDao;    }
复制代码
  1.     private UserService userService;    @Autowired    public UserController(UserService userService) {<?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:context="http://www.springframework.org/schema/context"
  5.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  6.    
  7.     <context:component-scan base-package="org.rain.spring"></context:component-scan>
  8. </beans>this.userService = userService;    }
复制代码

8.3、@Autowired的工作流程


  • 默认通过byType的方式,在IOC容器中匹配类型相同的bean,为属性赋值
  • 如果有多个类型匹配的bean,则自动转换为通过byName的方式,在IOC容器中匹配id和属性名相同的bean,为属性赋值
  • 如果有多个类型匹配的bean,且在IOC容器中没有找到id和属性名相同的bean;
    则可以使用@Qualifier注解指定某个bean的id,将这个bean赋值给属性

如果有多个类型匹配的bean,且在IOC容器中没有找到id和属性名相同的bean,也没有使用@Qualifier注解指定将某个bean赋值给属性;则会抛出异常NoUniqueBeanDefinitionException
  1.     @Autowired
  2.     @Qualifier("myUserService")
  3.     private UserService userService;
复制代码
8.4、@Autowired的注意事项

在@Autowired注解中有一个属性required,默认值为true,意思是必要完成自动装配
如果在IOC容器中没有匹配的bean,就会抛出异常NoSuchBeanDefinitionException
为此可以将required属性的值设置为false,这样能装配就装配,不能装配就使用默认值

一般可以通过排查组件注解、组件扫描和@Qualifier注解,定位出为什么在IOC容器中没有匹配的bean
  1.     @Autowired(required = false)
  2.     private UserService userService;
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

络腮胡菲菲

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表