Spring-IoC中Set和构造器注入
新建Maven工程
修改pom文件
- 1 <?xml version="1.0" encoding="UTF-8"?>
- 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
- 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- 5 <modelVersion>4.0.0</modelVersion>
- 6 <groupId>com.powernode</groupId>
- 7 <artifactId>spring6-002-dependency-injection</artifactId>
- 8 <version>1.0-SNAPSHOT</version>
- 9 <packaging>jar</packaging>
- 10
- 11 <!-- 依赖-->
- 12 <dependencies>
- 13 <dependency>
- 14 <groupId>org.springframework</groupId>
- 15 <artifactId>spring-context</artifactId>
- 16 <version>5.3.23</version>
- 17 </dependency>
- 18
- 19 <dependency>
- 20 <groupId>junit</groupId>
- 21 <artifactId>junit</artifactId>
- 22 <version>4.13.2</version>
- 23 <scope>test</scope>
- 24 </dependency>
- 25 <!--log4j2的依赖-->
- 26 <dependency>
- 27 <groupId>org.apache.logging.log4j</groupId>
- 28 <artifactId>log4j-core</artifactId>
- 29 <version>2.19.0</version>
- 30 </dependency>
- 31 <dependency>
- 32 <groupId>org.apache.logging.log4j</groupId>
- 33 <artifactId>log4j-slf4j2-impl</artifactId>
- 34 <version>2.19.0</version>
- 35 </dependency>
- 36
- 37 </dependencies>
- 38 <properties>
- 39 <maven.compiler.source>17</maven.compiler.source>
- 40 <maven.compiler.target>17</maven.compiler.target>
- 41 </properties>
- 42
- 43
- 44 </project>
UserDao.java
- package com.lps.dao;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- /**
- * ClassName: UserDao
- * Description:
- * Date: 2022/11/21 16:45
- * <author> <time> <version> <desc>
- * 刘品水 2022/11/21 16:45 @Version 1.0 描述
- */
- public class UserDao {
- public static final Logger LOGGER=LoggerFactory.getLogger(UserDao.class);
- public void insert(){
- // System.out.println("数据库正在保存用户信息。。。。");
- LOGGER.info("数据库正在保存用户信息。。。。");
- }
- }
- VipDao.java
- package com.lps.dao;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- /**
- * ClassName: vipDao
- * Description:
- * Date: 2022/11/21 17:16
- * <author> <time> <version> <desc>
- * 刘品水 2022/11/21 17:16 @Version 1.0 描述
- */
- public class VipDao {
- public static final Logger LOGGER= LoggerFactory.getLogger(UserDao.class);
- public void insert(){
- // System.out.println("数据库正在保存用户信息。。。。");
- LOGGER.info("高级会员正在保存用户信息。。。。");
- }
- }
- CostomerSercice.java
- 1 package com.lps.service;
- 2
- 3 import com.lps.dao.UserDao;
- 4 import com.lps.dao.VipDao;
- 5
- 6 /**
- 7 * ClassName: CostomerSercice
- 8 * Description:
- 9 * Date: 2022/11/21 17:35
- 10 * <author> <time> <version> <desc>
- 11 * 刘品水 2022/11/21 17:35 @Version 1.0 描述
- 12 */
- 13 public class CostomerSercice {
- 14 private UserDao userDao;
- 15 private VipDao vipDao;
- 16
- 17 public CostomerSercice(UserDao userDao, VipDao vipDao) {
- 18 this.userDao = userDao;
- 19 this.vipDao = vipDao;
- 20 }
- 21
- 22 public void save(){
- 23 userDao.insert();
- 24 vipDao.insert();
- 25 }
- 26 }
UserService.java
- package com.lps.service;
- import com.lps.dao.UserDao;
- import com.lps.dao.VipDao;
- /**
- * ClassName: UserService
- * Description:
- * Date: 2022/11/21 16:48
- * <author> <time> <version> <desc>
- * 刘品水 2022/11/21 16:48 @Version 1.0 描述
- */
- public class UserService {
- private UserDao userDao;
- private VipDao vipDao;
- public void setVIP(VipDao vipDao){
- this.vipDao=vipDao;
- }
- //为了显示差别 bane属性为:set方法的方法名去掉set 然后剩下单词的首字母变小写 为了展示出来set方法名我选择为setLpsHHH
- public void setLpsHHH(UserDao ud) {
- this.userDao = ud;
- }
- //正常用ait+insert直接生成的就很好了 符合规范了
- /* public void setUserDao(UserDao userDao) {
- this.userDao = userDao;
- }*/
- public void saveUser(){
- userDao.insert();
- vipDao.insert();
- };
- }
bean.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
- <bean id="userDao" class="com.lps.dao.UserDao"></bean>
- <bean id="vipDao" class="com.lps.dao.VipDao"></bean>
- <bean id="costomerSerciceBean1" class="com.lps.service.CostomerSercice">
- <constructor-arg index="0" ref="userDao"></constructor-arg>
- <constructor-arg index="1" ref="vipDao"></constructor-arg>
- </bean>
- <bean id="costomerSerciceBean2" class="com.lps.service.CostomerSercice">
- <constructor-arg name="userDao" ref="userDao"></constructor-arg>
- <constructor-arg name="vipDao" ref="vipDao"></constructor-arg>
- </bean>
- <bean id="costomerSerciceBean3" class="com.lps.service.CostomerSercice">
- <constructor-arg ref="userDao"></constructor-arg>
- <constructor-arg ref="vipDao"></constructor-arg>
- </bean>
- </beans>
log4j2.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <configuration>
- <loggers>
- <!--
- level指定日志级别,从低到高的优先级:
- ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
- -->
- <root level="DEBUG">
- <appender-ref ref="spring6log"/>
- </root>
- </loggers>
- <appenders>
- <!--输出日志信息到控制台-->
- <console name="spring6log" target="SYSTEM_OUT">
- <!--控制日志输出的格式-->
- <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n"/>
- </console>
- </appenders>
- </configuration>
spring.xml
实现原理:
通过property标签获取到属性名:userDao
通过属性名推断出set方法名:setUserDao
通过反射机制调用setUserDao()方法给属性赋值
property标签的name是属性名。
property标签的ref是要注入的bean对象的id。(通过ref属性来完成bean的装配,这是bean最简单的一种装配方式。装配指的是:创建系统组件之间关联的动作)
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
- <bean id="userDaoBean" class="com.lps.dao.UserDao"></bean>
- <bean id="userServiceBean" class="com.lps.service.UserService">
- <!-- 当需要spring调用对应的set方法 需要配置property属性-->
- <!-- bane属性为:set方法的方法名去掉set 然后剩下单词的首字母变小写 为了展示出来set方法名我选择为setLpsHHH-->
- <!-- ref翻译为引用 reference 后面指定要注入的bean的id-->
- <property name="lpsHHH" ref="userDaoBean"></property>
- <!-- <property name="userDao" ref="userDaoBean"></property>
- 建议别为难自己 直接用生成的更好 这里只是为了巩固记忆
- -->
- <property name="VIP" ref="vipDaoBean"></property>
- </bean>
- <bean name="vipDaoBean" class="com.lps.dao.VipDao"></bean>
- </beans>
通过测试看到程序仍然可以正常执行,说明property标签的name是:setUserDao()方法名演变得到的。演变的规律是:
- setUsername() 演变为 username
- setPassword() 演变为 password
- setUserDao() 演变为 userDao
- setHaHaHa() 演变为 haHaHa
另外,对于property标签来说,ref属性也可以采用标签的方式,但使用ref属性是多数的:
总结:set注入的核心实现原理:通过反射机制调用set方法来给属性赋值,让两个对象之间产生关系。
测试类
- package com.lps;
- import com.lps.dao.VipDao;
- import com.lps.service.CostomerSercice;
- import com.lps.service.UserService;
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- /**
- * ClassName: test
- * Description:
- * Date: 2022/11/21 16:56
- * <author> <time> <version> <desc>
- * 刘品水 2022/11/21 16:56 @Version 1.0 描述
- */
- public class test {
- @Test
- public void testConstructor(){
- ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
- CostomerSercice contextBean = context.getBean("costomerSerciceBean1", CostomerSercice.class);
- contextBean.save();
- System.out.println("=========");
- CostomerSercice contextBean1 = context.getBean("costomerSerciceBean2", CostomerSercice.class);
- contextBean1.save();
- System.out.println("--------");
- CostomerSercice contextBean2 = context.getBean("costomerSerciceBean3", CostomerSercice.class);
- contextBean2.save();
- }
- @Test
- public void testIoC01(){
- ApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml");
- UserService userServiceBean = context.getBean("userServiceBean", UserService.class);
- userServiceBean.saveUser();
- // VipDao vipDaoBean = context.getBean("vipDaoBean", VipDao.class);
- // vipDaoBean.insert();
- }
- }
通过测试 上述testConstructor()得知,通过构造方法注入的时候:
- 可以通过下标
- 可以通过参数名
- 也可以不指定下标和参数名,可以类型自动推断。
Spring-IoC中Set和构造器注入的更多相关文章
- 深入浅出spring IOC中三种依赖注入方式
深入浅出spring IOC中三种依赖注入方式 spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和 ...
- 转:深入浅出spring IOC中四种依赖注入方式
转:https://blog.csdn.net/u010800201/article/details/72674420 深入浅出spring IOC中四种依赖注入方式 PS:前三种是我转载的,第四种是 ...
- 【SSH系列】深入浅出spring IOC中三种依赖注入方式
spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入什么?控 ...
- spring IOC中三种依赖注入方式
Spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则,用来消减计算机程序之间的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入 ...
- spring IOC中四种依赖注入方式
在spring ioc中有三种依赖注入,分别是:https://blog.csdn.net/u010800201/article/details/72674420 a.接口注入:b.setter方法注 ...
- Spring IOC 中三种注入方式
项目错误知识点记录 正文 最近在项目的时候,用到Spring框架,Spring框架提供了一种IOC的自动注入功能,可以很轻松的帮助我们创建一个Bean,这样就省的我们四处写new Object()这样 ...
- Spring IOC(五)依赖注入
Spring IOC(五)依赖注入 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) 一.autowire 五种注入方式测试 ...
- Spring IOC(三)依赖注入
本系列目录: Spring IOC(一)概览 Spring IOC(二)容器初始化 Spring IOC(三)依赖注入 Spring IOC(四)总结 目录 1.AbstractBeanFactory ...
- Spring.net 学习IOC------通过构造器注入
别的不多说,咱们先上代码 1> object.xml 的文件内容 <?xml version="1.0" encoding="utf-8" ?> ...
- spring IOC --- 控制反转(依赖注入)----简单的实例
IoC(Inversion of Control)控制反转,对象创建责任的反转,在spring中BeanFacotory是IoC容器的核心接口,负责实例化,定位,配置应用程序中的对象及建立这些对象间的 ...
随机推荐
- SAP 附件功能 PRD环境无法删除 VIEW_ATTA
如图:界面上面没有打勾确认按钮 解决方案:来源网址 How to disable, delete and edit buttons function in attachment list. | SAP ...
- charles的坑
https://blog.csdn.net/qq_42191801/article/details/80288804 https://zhuanlan.zhihu.com/p/108960019 1. ...
- git(后悔药)版本回退
版本回退 查看提交记录 git log remotes/origin/test --pretty=oneline (建议获取远程日志记录,防止本地没有更新到最新版本) 如果本地是最新版本可以使用:gi ...
- IDEA使用fastjson1时maven引入依赖没报错,但是用不了JSONObject工具类
删除项目下的.idea文件夹重新打开项目就行, 不知道为什么
- IIS添加MIME类型实现未知文件下载
application/octet-stream 无需重启
- dockerfile实践学习
一.dockerfile简介 镜像是分层存储的,每一层在前一层的基础上进行修改. 容器也是分层存储,已经向为基础层,在其他基础上加一层作为容器运行的存储层. 创建镜像的另种两种方法 手动修改容器内容, ...
- 基于recorder.js H5录音功能
兼容性 1.Chrome,FF,Edge,QQ,360(注:现有IE和Safari全版本不兼容) 2.其中Chrome47以上以及QQ浏览器强制要求HTTPS的支持 3.请尝试使用FF,Edge,36 ...
- FME视频教程
FME视频教程 分为三种 10分钟 2011 2012
- 配置PostMan以访问、连接D365 / Dataverse环境
有人提出个问题说国内21V环境能否使用postman连接CRM? 官方链接:https://learn.microsoft.com/en-us/power-apps/developer/data-pl ...
- vuexy full-wersion项目安装报错问题处理
npm install grpc@1.23.3 --ignore-scripts npm rebuild node-sass