记录一下最近复习的Spirng依赖注入问题

主要介绍两个注入方式 也是用的最多的 1.构造方法注入 2.Setter注入。

参考文档:https://blog.csdn.net/weixin_55418082/article/details/124466712

1.构造方法注入

原理:使用构造方法注入指的时Spring容器调用构造方法注入被依赖的实例(对象),构造方法可以是有参的或者是无参的。当spring读取配置信息后,会通过反射的方式调用实例的构造方法。如果是有参数构造方法,可以在构造方法中注入所需的参数值,最后创建类对象。

具体代码

实体类:

public class User {
private String id;
private String name;
private String password;
//添加有参构造方法 public User(String id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
//用于判段spring是否使用此方法
System.out.println("通过有参构造方法进行注入");
}
//添加toString() @Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}

配置文件进行有参构造注入属性:

<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">
<!--创建一个User类的Bean实例-->
<bean id="user1" class="com.DI.User">
<!--进行有参构造赋值-->
<constructor-arg name="id" value="1"/>
<constructor-arg name="name" value="张三"/>
<constructor-arg name="password" value="123"/>
</bean> </beans>

其中元素是用于给User类的有参构造方法进行赋值操作。Spring通过 User类的构造方法获取元素定义的值,最后这些值会被赋值给Spring创建User对象

测试类

public class userConstrtTest {
public static void main(String[] args) {
//加载配置文件,并且创建该实例
ApplicationContext applicationContext = new
ClassPathXmlApplicationContext("bean1.xml");
//获取创建的对象实例
User user = applicationContext.getBean("user1",User.class);
//输出对象值
System.out.println(user);
} }

输出:

2.Setter方法注入

Setter方法注入是当今Spring最主流的注入方法,你可以再各种SSM项目中见到它的身影

具体代码实现:

首先是一个实体类

public class User2 {
private String id;
private String name;
private String password; public void setId(String id) {
this.id = id;
//依旧进行打印跟踪
System.out.println("set方法注入id属性");
} public void setName(String name) {
this.name = name;
System.out.println("set方法注入name属性");
} public void setPassword(String password) {
this.password = password;
System.out.println("set方法注入password属性");
} @Override
public String toString() {
return "User2{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}

配置文件创建对应的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">
<!--创建一个user bean实例-->
<bean id="user2" class="com.DI.User2">
<!--进行setter方法赋值操作-->
<property name="id" value="2"></property>
<property name="name" value="李明"></property>
<property name="password" value="456"></property>
</bean>
</beans>

从代码中我们可以知道,当我们在使用setter方法进行诸如操作的时候,我们使用的是标签,里面的name是用于指定字段名称,后面的value是用来设定具体值的。

测试类:

public class TestUser2 {
public static void main(String[] args) {
//加载配置文件
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("bean2.xml");
//获取bean创建的对象
User2 user2 = applicationContext.getBean("user2", User2.class);
System.out.println(user2);
}
}

输出:

成功创建对象实例!.并且通过我设定的路径跟踪信息可以知道这是通过setter方法进行注入操作的

Setter方法注入对象的实际应用操作

//创建一个业务逻辑接口
public interface UserDao {
//定义一个方法用于模拟登录功能的实现
public boolean login(String name,String password);
}

创建该接口的实现类:

import com.DI.dao.UserDao;

//创建一个业务逻辑接口
public class UserDaoImpl implements UserDao { public boolean login(String name, String password) {
//如果名字是比尔和密码是123456就返回true
if(name.equals("比尔")&&password.equals("12345")){
return true;
}
return false;
}
}

接下来编写服务层接口,userService

//服务层
public interface UserService {
//创建服务层的登录方法
public boolean login(String name,String password);
}

userService的实现类:

import com.DI.Service.UserService;
import com.DI.dao.UserDao;
//创建userservice的实现类
public class UserServiceImpl implements UserService {
//创建一个UserDao类型的类变量
UserDao userDao;
//添加setter方法
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
//重写userService接口中的方法
public boolean login(String name, String password) {
return userDao.login(name,password);
}
}

创建spring配置文件创建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">
<!--创建一个userDao的实例, <!--因为接口不能够实例化建对象,所以只能找他的子类建对象-->-->
<bean id="userDaoImpl" class="com.DI.dao.Impl.UserDaoImpl"></bean>
<!--创建一个UserService实例并将userdao注入到userservice当中-->
<bean id="userService" class="com.DI.Service.Impl.UserServiceImpl">
<property name="userDao" ref="userDaoImpl"></property>
</bean>
</beans>

由上述代码可知,我们先创建userDao接口实现类的bean,然后通过标签中的ref 对userdao进行注入操作。

对于标签进行解释:

name属性值:类里面属性名称

ref属性:创建userDao对象bean标签id值

最后建立一个测试类进行测试操作

import com.DI.Service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class userTYest {
public static void main(String[] args) {
ApplicationContext applicationContext=
new ClassPathXmlApplicationContext("beanUser.xml");
UserService userService =(UserService)applicationContext.getBean( "userService");
boolean flag = userService.login("比尔","12345");
if(flag){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
} }

在这里我们的userService接口用器实现类创建的对象调用login方法进而调用userDao登录逻辑代码进行登录功能的实现,在这可以发现其中的妙处,不仅实现了简化代码还能够最大限度的解耦操作!

Spring依赖注入问题的更多相关文章

  1. Spring依赖注入(IOC)那些事

    小菜使用Spring有几个月了,但是对于它的内部原理,却是一头雾水,这次借着工作中遇到的一个小问题,来总结一下Spring. Spring依赖注入的思想,就是把对象交由Spring容器管理,使用者只需 ...

  2. Spring依赖注入三种方式详解

    在讲解Spring依赖注入之前的准备工作: 下载包含Spring的工具jar包的压缩包 解压缩下载下来的Spring压缩包文件 解压缩之后我们会看到libs文件夹下有许多jar包,而我们只需要其中的c ...

  3. Spring依赖注入:注解注入总结

    更多11   spring   依赖注入   注解   java 注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.S ...

  4. Spring 依赖注入,在Main方法中取得Spring控制的实例

    Spring依赖注入机制,在Main方法中通过读取配置文件,获取Spring注入的bean实例.这种应用在实训的时候,老师曾经说过这种方法,而且学Spring入门的时候都会先学会使用如何在普通的jav ...

  5. Spring依赖注入 --- 简单使用说明

    Spring依赖注入 --- 简单使用说明 本文将对spring依赖注入的使用做简单的说明,enjoy your time! 1.使用Spring提供的依赖注入 对spring依赖注入的实现方法感兴趣 ...

  6. Spring依赖注入 --- 模拟实现

    Spring依赖注入 --- 模拟实现 面向接口编程,又称面向抽象编程, 数据库如果发生更改,对应的数据访问层也应该改变多写几个实现,需要用谁的时候在service里new谁就可以了面向抽象编程的好处 ...

  7. Java Web系列:Spring依赖注入基础

    一.Spring简介 1.Spring简化Java开发 Spring Framework是一个应用框架,框架一般是半成品,我们在框架的基础上可以不用每个项目自己实现架构.基础设施和常用功能性组件,而是 ...

  8. Spring依赖注入的三种方式

    看过几篇关于Spring依赖注入的文章,自己简单总结了一下,大概有三种方式: 1.自动装配 通过配置applicationContext.xml中的标签的default-autowire属性,或者标签 ...

  9. spring依赖注入源码分析和mongodb自带连接本地mongodb服务逻辑分析

    spring依赖注入本质是一个Map结构,key是beanId,value是bean对应的Object. autowired是怎么将定义的接口与对应的bean类建立联系? <bean name= ...

  10. Spring、Spring依赖注入与编码剖析Spring依赖注入的原理

    Spring依赖注入 新建PersonIDao 和PersonDao底实现Save方法: public interface PersonIDao { public void save(); } pub ...

随机推荐

  1. Sqoop的介绍和安装

    sqoop下载地址:https://share.weiyun.com/woVbfnfS 或者 https://archive.apache.org/dist/sqoop/1.99.7/ Sqoop简介 ...

  2. 【大数据课程】高途课程实践-Day02:利用Hive SQL编写离线数仓实现可视化展示

    〇.概述 1.实现内容 使用Hive SQL编程,构造分层离线数仓 并可以通过Quick Bi进行展示 2.过程 (1)数据接⼊到ODS层 (2)进⾏ODS到DWD层数据开发 (3)进⾏ODS到DIM ...

  3. 【JVM调优】Day03:GC参数、OOM出现方式、调优实战

    一.常用GC参数(20个左右即可) 1.各种垃圾回收器的参数 PS + PO 常用的只有几十个 CMS的比较多,不建议使用 G1的常用参数简单 ZGC只有三个参数 二.OOM出现的方式 1.写一个让内 ...

  4. Linux和shell面试内容

    一.Linux 1.列出5个常用高级命令 ps -ef ps -aux df -h top io top xargs tail uptime netstat 2.查看磁盘使用情况.查看进程.查看端口号 ...

  5. 快速入门JavaScript编程语言

    目录 JS简介 JS基础 1.注释语法 2.引入js的多种方式 3.结束符号 变量与常量 let和var的区别 申明常量 const 严格模式 use strict 基本数据类型 1.数值类型(Num ...

  6. pycharm恢复删除文档与查询修改前数据

    1.pycharm恢复删除文档 第一步: 第二步: 2.pycharm查询修改前文档数据 第一步: 第二步:

  7. 第三模块的下载、requests模块、openpyxl模块

    目录 第三方模块的下载安装 下载第三模块的方式 针对下载第三模块时可能会出现的问题 网络爬虫模块之requests模块 自动化办公领域之openpyxl模块 第三方模块的下载安装 第三方模块:别人写的 ...

  8. vue项目 h5上拉加载(分页功能)

    <template> <div class="receivable"> <div class="application-header fle ...

  9. 重学c#系列——元组 [三十一]

    前言 元组并不是c# 7.0的东西,早之前就有,叫做tuple.7.0加了valuetuple. 来看下元组吧,主要一些注意的地方. 正文 为什么在7.0 之前,元组用的不多呢? 因为tuple 在代 ...

  10. JUC基础学习笔记

    JUC的理解: JUC即java.util .concurrent工具包的简称.从JDK 1.5 开始出现,主要用于处理多线程.高并发问题. 多线程的三大特征解析 原子性.可见性.有序性 1.原子性: ...