记录一下最近复习的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. 工程坐标转换方法C#代码实现

    目录 1. 前言 2. 计算总体框架 3. C#代码实现 3.1 整体类的构建 3.2 椭球参数赋值 3.3 转换1.3(大地经纬度坐标与地心地固坐标的转换) 3.4 投影转换 3.5 转换2的实现( ...

  2. 浏览器内存漫游解决方案(js逆向)

    //浏览器内存漫游解决方案(js逆向) //原理通过ast把所有的变量,参数中间值进行内存的存储 //搜索AST-hook,进入github //现在github的库下载下来 //anyproxy n ...

  3. node版本管理工具fnm踩坑

    我建议是直接不要用fnm,还是老老实实用nvm吧 fnm下下来电脑防火墙会报毒(用github上推荐的cargo install fnm方式下载,并非第三方安装) Trojan.Generic.HgE ...

  4. 4.1IDA基础设置--《恶意代码分析实战》

    1.加载一个可执行文件 ① 选项一:当加载一个文件(如PE文件),IDA像操作系统加载器一样将文件映射到内存中. ② 选项三:Binary File:将文件作为一个原始的二进制文件进行反汇编,例如文件 ...

  5. appium环境搭建(从入门到放弃)

    一.appium环境搭建 1.python3 python3的下载安装这里就不多做介绍了,当然你也可以选择自己喜欢的语音,比如java.... 2.jdk 1)下载地址 官网(需登录账号): http ...

  6. RequestMappingHandlerMapping请求地址映射流程!

    上篇文章里,我们讲解了RequestMappingHandlerMapping请求地址映射的初始化流程,理解了@Controller和@RequestMapping是如何被加载到缓存中的. 今天我们来 ...

  7. Jenkins&&gitlab

    DevOps 强调整个组织的合作以及交付和基础设施变更的自动化 gitlab下载: 下载地址: https://docs.gitlab.com/ee/install/requirements.html ...

  8. P1314 聪明的质监员(题解)

    题目 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 \(n\) 个矿石,从 \(1\) 到 \(n\) 逐一编号,每个矿石都有自己的重量 \(w_i\) 以及价值 \(v_i\) ...

  9. java中继承的内存分析

    本文主要讲述java中继承的内存分析. 示例1,代码如下: public class EncapsulationTest { public static void main(String[] args ...

  10. last-child可能你也会踩的坑

    旧文章从语雀迁移过来,原日期为2021-07-14 问题 当时写在写一个列表,列表每一项需要下面加下划线,最后一项不加下划线.第一时间,想到使用 :``last-child 这个伪类来实现. 当时的代 ...