新建Maven工程

修改pom文件

  1. 1 <?xml version="1.0" encoding="UTF-8"?>
  2. 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. 5 <modelVersion>4.0.0</modelVersion>
  6. 6 <groupId>com.powernode</groupId>
  7. 7 <artifactId>spring6-002-dependency-injection</artifactId>
  8. 8 <version>1.0-SNAPSHOT</version>
  9. 9 <packaging>jar</packaging>
  10. 10
  11. 11 <!-- 依赖-->
  12. 12 <dependencies>
  13. 13 <dependency>
  14. 14 <groupId>org.springframework</groupId>
  15. 15 <artifactId>spring-context</artifactId>
  16. 16 <version>5.3.23</version>
  17. 17 </dependency>
  18. 18
  19. 19 <dependency>
  20. 20 <groupId>junit</groupId>
  21. 21 <artifactId>junit</artifactId>
  22. 22 <version>4.13.2</version>
  23. 23 <scope>test</scope>
  24. 24 </dependency>
  25. 25 <!--log4j2的依赖-->
  26. 26 <dependency>
  27. 27 <groupId>org.apache.logging.log4j</groupId>
  28. 28 <artifactId>log4j-core</artifactId>
  29. 29 <version>2.19.0</version>
  30. 30 </dependency>
  31. 31 <dependency>
  32. 32 <groupId>org.apache.logging.log4j</groupId>
  33. 33 <artifactId>log4j-slf4j2-impl</artifactId>
  34. 34 <version>2.19.0</version>
  35. 35 </dependency>
  36. 36
  37. 37 </dependencies>
  38. 38 <properties>
  39. 39 <maven.compiler.source>17</maven.compiler.source>
  40. 40 <maven.compiler.target>17</maven.compiler.target>
  41. 41 </properties>
  42. 42
  43. 43
  44. 44 </project>

UserDao.java

  1. package com.lps.dao;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. /**
  5. * ClassName: UserDao
  6. * Description:
  7. * Date: 2022/11/21 16:45
  8. * <author> <time> <version> <desc>
  9. * 刘品水 2022/11/21 16:45 @Version 1.0 描述
  10. */
  11. public class UserDao {
  12. public static final Logger LOGGER=LoggerFactory.getLogger(UserDao.class);
  13.  
  14. public void insert(){
  15. // System.out.println("数据库正在保存用户信息。。。。");
  16. LOGGER.info("数据库正在保存用户信息。。。。");
  17. }
  18.  
  19. }
  1. VipDao.java
  1. package com.lps.dao;
  2.  
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5.  
  6. /**
  7. * ClassName: vipDao
  8. * Description:
  9. * Date: 2022/11/21 17:16
  10. * <author> <time> <version> <desc>
  11. * 刘品水 2022/11/21 17:16 @Version 1.0 描述
  12. */
  13. public class VipDao {
  14. public static final Logger LOGGER= LoggerFactory.getLogger(UserDao.class);
  15.  
  16. public void insert(){
  17. // System.out.println("数据库正在保存用户信息。。。。");
  18. LOGGER.info("高级会员正在保存用户信息。。。。");
  19. }
  20. }
  1. CostomerSercice.java
  1. 1 package com.lps.service;
  2. 2
  3. 3 import com.lps.dao.UserDao;
  4. 4 import com.lps.dao.VipDao;
  5. 5
  6. 6 /**
  7. 7 * ClassName: CostomerSercice
  8. 8 * Description:
  9. 9 * Date: 2022/11/21 17:35
  10. 10 * <author> <time> <version> <desc>
  11. 11 * 刘品水 2022/11/21 17:35 @Version 1.0 描述
  12. 12 */
  13. 13 public class CostomerSercice {
  14. 14 private UserDao userDao;
  15. 15 private VipDao vipDao;
  16. 16
  17. 17 public CostomerSercice(UserDao userDao, VipDao vipDao) {
  18. 18 this.userDao = userDao;
  19. 19 this.vipDao = vipDao;
  20. 20 }
  21. 21
  22. 22 public void save(){
  23. 23 userDao.insert();
  24. 24 vipDao.insert();
  25. 25 }
  26. 26 }

UserService.java

  1. package com.lps.service;
  2.  
  3. import com.lps.dao.UserDao;
  4. import com.lps.dao.VipDao;
  5.  
  6. /**
  7. * ClassName: UserService
  8. * Description:
  9. * Date: 2022/11/21 16:48
  10. * <author> <time> <version> <desc>
  11. * 刘品水 2022/11/21 16:48 @Version 1.0 描述
  12. */
  13. public class UserService {
  14. private UserDao userDao;
  15. private VipDao vipDao;
  16.  
  17. public void setVIP(VipDao vipDao){
  18. this.vipDao=vipDao;
  19. }
  20.  
  21. //为了显示差别 bane属性为:set方法的方法名去掉set 然后剩下单词的首字母变小写 为了展示出来set方法名我选择为setLpsHHH
  22.  
  23. public void setLpsHHH(UserDao ud) {
  24. this.userDao = ud;
  25. }
  26. //正常用ait+insert直接生成的就很好了 符合规范了
  27. /* public void setUserDao(UserDao userDao) {
  28. this.userDao = userDao;
  29. }*/
  30.  
  31. public void saveUser(){
  32. userDao.insert();
  33. vipDao.insert();
  34. };
  35. }

bean.xml

  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. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5.  
  6. <bean id="userDao" class="com.lps.dao.UserDao"></bean>
  7. <bean id="vipDao" class="com.lps.dao.VipDao"></bean>
  8.  
  9. <bean id="costomerSerciceBean1" class="com.lps.service.CostomerSercice">
  10. <constructor-arg index="0" ref="userDao"></constructor-arg>
  11. <constructor-arg index="1" ref="vipDao"></constructor-arg>
  12. </bean>
  13.  
  14. <bean id="costomerSerciceBean2" class="com.lps.service.CostomerSercice">
  15. <constructor-arg name="userDao" ref="userDao"></constructor-arg>
  16. <constructor-arg name="vipDao" ref="vipDao"></constructor-arg>
  17. </bean>
  18.  
  19. <bean id="costomerSerciceBean3" class="com.lps.service.CostomerSercice">
  20. <constructor-arg ref="userDao"></constructor-arg>
  21. <constructor-arg ref="vipDao"></constructor-arg>
  22. </bean>
  23. </beans>

log4j2.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <configuration>
  4.  
  5. <loggers>
  6. <!--
  7. level指定日志级别,从低到高的优先级:
  8. ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
  9. -->
  10. <root level="DEBUG">
  11. <appender-ref ref="spring6log"/>
  12. </root>
  13. </loggers>
  14.  
  15. <appenders>
  16. <!--输出日志信息到控制台-->
  17. <console name="spring6log" target="SYSTEM_OUT">
  18. <!--控制日志输出的格式-->
  19. <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n"/>
  20. </console>
  21. </appenders>
  22.  
  23. </configuration>

spring.xml

实现原理:

通过property标签获取到属性名:userDao

通过属性名推断出set方法名:setUserDao

通过反射机制调用setUserDao()方法给属性赋值

property标签的name是属性名。

property标签的ref是要注入的bean对象的id。(通过ref属性来完成bean的装配,这是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. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5.  
  6. <bean id="userDaoBean" class="com.lps.dao.UserDao"></bean>
  7.  
  8. <bean id="userServiceBean" class="com.lps.service.UserService">
  9. <!-- 当需要spring调用对应的set方法 需要配置property属性-->
  10. <!-- bane属性为:set方法的方法名去掉set 然后剩下单词的首字母变小写 为了展示出来set方法名我选择为setLpsHHH-->
  11. <!-- ref翻译为引用 reference 后面指定要注入的bean的id-->
  12. <property name="lpsHHH" ref="userDaoBean"></property>
  13. <!-- <property name="userDao" ref="userDaoBean"></property>
  14. 建议别为难自己 直接用生成的更好 这里只是为了巩固记忆
  15. -->
  16. <property name="VIP" ref="vipDaoBean"></property>
  17. </bean>
  18.  
  19. <bean name="vipDaoBean" class="com.lps.dao.VipDao"></bean>
  20.  
  21. </beans>

通过测试看到程序仍然可以正常执行,说明property标签的name是:setUserDao()方法名演变得到的。演变的规律是:

  • setUsername() 演变为 username
  • setPassword() 演变为 password
  • setUserDao() 演变为 userDao
  • setHaHaHa() 演变为 haHaHa

另外,对于property标签来说,ref属性也可以采用标签的方式,但使用ref属性是多数的:

总结:set注入的核心实现原理:通过反射机制调用set方法来给属性赋值,让两个对象之间产生关系。

测试类

  1. package com.lps;
  2.  
  3. import com.lps.dao.VipDao;
  4. import com.lps.service.CostomerSercice;
  5. import com.lps.service.UserService;
  6. import org.junit.Test;
  7. import org.springframework.context.ApplicationContext;
  8. import org.springframework.context.support.ClassPathXmlApplicationContext;
  9.  
  10. /**
  11. * ClassName: test
  12. * Description:
  13. * Date: 2022/11/21 16:56
  14. * <author> <time> <version> <desc>
  15. * 刘品水 2022/11/21 16:56 @Version 1.0 描述
  16. */
  17. public class test {
  18. @Test
  19. public void testConstructor(){
  20. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
  21. CostomerSercice contextBean = context.getBean("costomerSerciceBean1", CostomerSercice.class);
  22. contextBean.save();
  23. System.out.println("=========");
  24. CostomerSercice contextBean1 = context.getBean("costomerSerciceBean2", CostomerSercice.class);
  25. contextBean1.save();
  26. System.out.println("--------");
  27. CostomerSercice contextBean2 = context.getBean("costomerSerciceBean3", CostomerSercice.class);
  28. contextBean2.save();

  29. }
  30. @Test
  31. public void testIoC01(){
  32. ApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml");
  33. UserService userServiceBean = context.getBean("userServiceBean", UserService.class);
  34. userServiceBean.saveUser();
  35. // VipDao vipDaoBean = context.getBean("vipDaoBean", VipDao.class);
  36. // vipDaoBean.insert();
  37. }
  38. }

通过测试 上述testConstructor()得知,通过构造方法注入的时候:

  • 可以通过下标
  • 可以通过参数名
  • 也可以不指定下标和参数名,可以类型自动推断。

Spring-IoC中Set和构造器注入的更多相关文章

  1. 深入浅出spring IOC中三种依赖注入方式

    深入浅出spring IOC中三种依赖注入方式 spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和 ...

  2. 转:深入浅出spring IOC中四种依赖注入方式

    转:https://blog.csdn.net/u010800201/article/details/72674420 深入浅出spring IOC中四种依赖注入方式 PS:前三种是我转载的,第四种是 ...

  3. 【SSH系列】深入浅出spring IOC中三种依赖注入方式

    spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入什么?控 ...

  4. spring IOC中三种依赖注入方式

    Spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则,用来消减计算机程序之间的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入 ...

  5. spring IOC中四种依赖注入方式

    在spring ioc中有三种依赖注入,分别是:https://blog.csdn.net/u010800201/article/details/72674420 a.接口注入:b.setter方法注 ...

  6. Spring IOC 中三种注入方式

    项目错误知识点记录 正文 最近在项目的时候,用到Spring框架,Spring框架提供了一种IOC的自动注入功能,可以很轻松的帮助我们创建一个Bean,这样就省的我们四处写new Object()这样 ...

  7. Spring IOC(五)依赖注入

    Spring IOC(五)依赖注入 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) 一.autowire 五种注入方式测试 ...

  8. Spring IOC(三)依赖注入

    本系列目录: Spring IOC(一)概览 Spring IOC(二)容器初始化 Spring IOC(三)依赖注入 Spring IOC(四)总结 目录 1.AbstractBeanFactory ...

  9. Spring.net 学习IOC------通过构造器注入

    别的不多说,咱们先上代码 1> object.xml 的文件内容 <?xml version="1.0" encoding="utf-8" ?> ...

  10. spring IOC --- 控制反转(依赖注入)----简单的实例

    IoC(Inversion of Control)控制反转,对象创建责任的反转,在spring中BeanFacotory是IoC容器的核心接口,负责实例化,定位,配置应用程序中的对象及建立这些对象间的 ...

随机推荐

  1. SAP 附件功能 PRD环境无法删除 VIEW_ATTA

    如图:界面上面没有打勾确认按钮 解决方案:来源网址 How to disable, delete and edit buttons function in attachment list. | SAP ...

  2. charles的坑

    https://blog.csdn.net/qq_42191801/article/details/80288804 https://zhuanlan.zhihu.com/p/108960019 1. ...

  3. git(后悔药)版本回退

    版本回退 查看提交记录 git log remotes/origin/test --pretty=oneline (建议获取远程日志记录,防止本地没有更新到最新版本) 如果本地是最新版本可以使用:gi ...

  4. IDEA使用fastjson1时maven引入依赖没报错,但是用不了JSONObject工具类

    删除项目下的.idea文件夹重新打开项目就行, 不知道为什么

  5. IIS添加MIME类型实现未知文件下载

    application/octet-stream 无需重启

  6. dockerfile实践学习

    一.dockerfile简介 镜像是分层存储的,每一层在前一层的基础上进行修改. 容器也是分层存储,已经向为基础层,在其他基础上加一层作为容器运行的存储层. 创建镜像的另种两种方法 手动修改容器内容, ...

  7. 基于recorder.js H5录音功能

    兼容性 1.Chrome,FF,Edge,QQ,360(注:现有IE和Safari全版本不兼容) 2.其中Chrome47以上以及QQ浏览器强制要求HTTPS的支持 3.请尝试使用FF,Edge,36 ...

  8. FME视频教程

    FME视频教程 分为三种 10分钟 2011 2012

  9. 配置PostMan以访问、连接D365 / Dataverse环境

    有人提出个问题说国内21V环境能否使用postman连接CRM? 官方链接:https://learn.microsoft.com/en-us/power-apps/developer/data-pl ...

  10. vuexy full-wersion项目安装报错问题处理

    npm install grpc@1.23.3 --ignore-scripts npm rebuild node-sass