记录一下最近复习的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. Java开发学习(四十八)----MyBatisPlus删除语句之逻辑删除

    1.逻辑删除 接下来要讲解是删除中比较重要的一个操作,逻辑删除,先来分析下问题: 这是一个员工和其所签的合同表,关系是一个员工可以签多个合同,是一个一(员工)对多(合同)的表 员工ID为1的张业绩,总 ...

  2. SQLMap入门——获取数据库的所有用户

    列出数据库中的所有用户 在当前用户有权读取包含所有用户的表的权限时,使用该命令列出所有管理用户 python sqlmap.py -u http://localhost/sqli-labs-maste ...

  3. vue 点击按钮添加一行dom节点

    如图,最近项目需求,点击添加一行dom节点,包含下拉框和input输入框 ,下面展示一下代码 <ul class="sales-menuItem-ul"> <li ...

  4. nuxt.js实现页面刷新功能

    key 属性Key:String 或者Function key属性赋值到<router-view>,这对于在动态页面和不同路径中进行转换很有用.不同的key会使页面组件重新渲染. 设置ke ...

  5. jenkins+git+.net core实现自动发布

    一.前言 继上篇介绍jenkins过去2年多了,最近整理了一下,希望这篇能介绍到一些更实用的方法和知识. 本次使用的jenkins版本是2.375.1.jdk 17.WinRAR.git:发布时,可以 ...

  6. 重学c#系列—— 反射深入一点点[三十三]

    前言 在上一章中介绍了什么是反射: https://www.cnblogs.com/aoximin/p/16440966.html 正文 上一节讲述反射的基本原理和为什么要用反射,还用反射的优缺点这些 ...

  7. JDBC基础学习笔记

    JDBC的理解: JDBC是允许便捷式访问底层数据库的应用程序接口,JDO.Hibernate.MyBatis等只是更好的封装了JDBC. JDBC的连接步骤: 1.注册驱动: //反射机制 Clas ...

  8. [C++]vector内存的增长机制

    例子 #include <iostream> #include<vector> #include<algorithm> #include "CPPDemo ...

  9. 一、tcp三次握手

    (1)首先客户端向服务器端发送一段tcp报文,其中标志位为SYN,表示"请求创建新连接"序列号为sqe=x,随后进入SYN_SEND状态 (2)服务器端接受到客户端发送的tcp报文 ...

  10. 基于 VScode 搭建 Qt 运行环境

    插件 C/C++ Qt tools Qt Configure CMake CMake Tools 下载 qt https://download.qt.io/official_releases/onli ...