一:介绍

情景:我们在给程序分层的时候:web层、业务层、持久层,各个层之间会有依赖。比如说:业务层和持久层,业务层的代码在调用持久层的时候,传统方式:new 持久层类。

进而进行调用,这种方式会导致耦合性较高,在修改一层代码的时候,另一层的也需要更改代码。不利于维护。这种关系叫做“依赖”。

如何解决?

解决:

Spring给咱们提供依赖注入,也就是说当一个类的对象注入的时候,伴随着他依赖的类也注入。

代码:

1)传统方式:

 package jd.com.service;

 import jd.com.dao.UserDaoImpl;
import org.junit.Test; public class UserServiceImpl implements UserService {
@Test
@Override
public void save() {
System.out.println("业务层调用持久层。");
//传统方式
UserDaoImpl userDao=new UserDaoImpl();
userDao.save();
}
}

这种方式导致各个层之间耦合性较高。

2)set方式依赖注入(类):

set方式:被依赖的类需要设置成字段,并且提供set方法。

private  UserDaoImpl userDao;

public void setUserDao(UserDaoImpl userDao) {
this.userDao = userDao;
}

被依赖的来:

 package jd.com.dao;

 public class UserDaoImpl  implements UserService{
@Override
public void save() {
System.out.println("持久层保存数据。");
}
}

调用的类:

 package jd.com.service;

 import jd.com.dao.UserDaoImpl;
import org.junit.Test; public class UserServiceImpl implements UserService {
//set方式 private UserDaoImpl userDao; public void setUserDao(UserDaoImpl userDao) {
this.userDao = userDao;
} public void save(){
System.out.println("业务层调用持久层。");
userDao.save();
}
}

测试类:

 package jd.com.service;

 import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Testdemo {
@Test
public void testdemo(){
ApplicationContext ac= new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService= (UserService) ac.getBean("userserv");
userService.save(); }
}

配置文件配置:

     <bean id="dao"  class="jd.com.dao.UserDaoImpl" />
<!--如果是类的数需要使用ref 值为被依赖的类的id名字-->
<bean id="userserv" class= "jd.com.service.UserServiceImpl" >
<property name="userDao" ref="dao" />
</bean>

3)set方法(设置字段):

字段注入也类似上面但是这种方式配置文件是不一样的。

配置文件:

     <bean  id="userserv" class= "jd.com.service.UserServiceImpl" >
<property name="userDao" ref="dao" />
<!--name是属性key value是属性value-->
<property name="oop" value="java"/>
</bean>

代码:需要设置set方法

     public    String oop;

     public void setOop(String oop) {
this.oop = oop;
}
     @Test
public void test(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
UserServiceImpl userService= (UserServiceImpl) ac.getBean("userserv");
System.out.println(userService.oop);
}

4)构造方法依赖注入:

依赖类:在构造方法中进行属性设置.

 package jd.com.service;

 import jd.com.dao.UserDaoImpl;

 public class UserServiceImpl implements  UserService {

     public String ko;
public String ok;
private UserDaoImpl userDao; public UserServiceImpl (UserDaoImpl userDao ,String ko ,String ok){
this.userDao=userDao;
this.ko=ko;
this.ok=ok;
} public void save(){
System.out.println("业务层调用持久层。");
userDao.save();
}
}

测试代码:

     @Test
public void test2(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
UserServiceImpl us= (UserServiceImpl) ac.getBean("userserv");
us.save();
System.out.println(us.ok);
System.out.println(us.ko);
}
}

配置文件配置:需要注意标签是:1、constructor-arg 2、index和name不能混合使用。3、属性是其他类的时候需要注意使用ref=“类的配置文件id”

     <bean id="userserv" class="jd.com.service.UserServiceImpl">
<constructor-arg name="userDao" ref="dao" />
<constructor-arg name="ko" value="python" />
<constructor-arg name="ok" value="java" />
</bean>
<bean id="dao" class="jd.com.dao.UserDaoImpl" />

4)其他方式注入:Array,list、set、map、properites属性文件注入(不常用SSH整合的时候会用到)

实现类:

 package jd.com.service;

 import jd.com.dao.UserDaoImpl;

 public class UserServiceImpl implements  UserService {

     public String ko;
public String ok;
private UserDaoImpl userDao; public UserServiceImpl (UserDaoImpl userDao ,String ko ,String ok){
this.userDao=userDao;
this.ko=ko;
this.ok=ok;
} public void save(){
System.out.println("业务层调用持久层。");
userDao.save();
}
}

测试类:

 package jd.com.other;

 import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.Arrays; public class TestDemo {
@Test
public void testDemo(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
InOtherImpl inOther= (InOtherImpl) ac.getBean("in");
System.out.println(Arrays.toString(inOther.testar));
}
@Test
public void testDemo2(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
InOtherImpl inOther= (InOtherImpl) ac.getBean("in");
System.out.println(inOther.list);
}
@Test
public void testDemo3(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
InOtherImpl inOther= (InOtherImpl) ac.getBean("in");
System.out.println(inOther.map);
}
@Test
public void testDemo4(){
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
InOtherImpl inOther= (InOtherImpl) ac.getBean("in");
System.out.println(inOther.pro);
}
}

配置文件:

     <bean id="in" class="jd.com.other.InOtherImpl">
<property name="testar">
<list>
<value>io</value>
<value>oop</value>
<value>ok</value>
</list>
</property>
<property name="list" >
<list>
<value>java</value>
<value>python</value>
</list> </property>
<property name="map">
<map>
<entry key="oop" value="java" />
</map>
</property>
<property name="pro">
<props>
<prop key="url" >http://172.17.33.21:3358</prop>
<prop key="user" >root</prop>
<prop key="password" ></prop>
</props>
</property>
</bean>

需要注意的是:

如果写引用话 一般在value-ref的字段。

JAVA框架 Spring 依赖注入的更多相关文章

  1. 【Java】 Spring依赖注入小试牛刀:编写第一个Spring ApplicationContext Demo

    0  Spring的依赖注入大致是这样工作的: 将对象如何构造(ID是什么?是什么类型?给属性设置什么值?给构造函数传入什么值?)写入外部XML文件里.在调用者需要调用某个类时,不自行构造该类的对象, ...

  2. JAVA框架 Spring 注解注入

    一.首先需要引入jar包:spring-aop-4.2.4.RELEASE.jar.(在spring解压包libs内). 二.如果注解方式注入依赖的对象,需要引用新的约束. 内的:xsd-config ...

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

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

  4. java后端开发三年!你还不了解Spring 依赖注入,凭什么给你涨薪

    前言 前两天和一个同学吃饭的时候同学跟我说了一件事,说他公司有个做了两年的人向他提出要涨薪资,他就顺口问了一个问题关于spring依赖注入的,那个要求涨薪的同学居然被问懵了...事后回家想了想这一块确 ...

  5. java线程中如何使用spring依赖注入

    实现一个线程继承了Thread或实现Runnable接口,想在run方法中使用spring依赖注入(操作数据库),此时报错为空指针,就是说没有注入进来. 实验了几种方式,分别说一下优缺点. 1:写了工 ...

  6. 为什么多线程、junit 中无法使用spring 依赖注入?

    为什么多线程.junit 中无法使用spring 依赖注入? 这个问题,其实体现了,我们对spring已依赖太深,以至于不想自己写实例了. 那么到底是为什么在多线程和junit单元测试中不能使用依赖注 ...

  7. Spring依赖注入原理分析

    在分析原理之前我们先回顾下依赖注入的概念: 我们常提起的依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念.具体含义是:当某个角色( ...

  8. Spring依赖注入servlet会话监听器

    Spring提供了一个 “ContextLoaderListener” 监听器,以使 Spring 依赖注入到会话监听器. 在本教程中,通过添加一个 Spring 依赖注入一个bean 到会话监听器修 ...

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

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

随机推荐

  1. 初识DOM(文档对象模型)

    什么是DOM 什么叫做DOM呢? • DOM的全称是Document Object Model 文档对象模型,DOM定义了表示和修改文档所需的对象.这些对象的行为和属性以及这些对象之间的关系. • D ...

  2. 一张图看懂Mysql的join连接

    INNER JOIN:当两个表中都匹配时返回行. LEFT JOIN:返回左表中的所有行,即使右表中没有匹配项也是如此. RIGHT JOIN:返回右表中的所有行,即使左表中没有匹配项也是如此. FU ...

  3. Django. No changes detected when "makemigrations"

    在修改了models.py后,有些用户会喜欢用python manage.py makemigrations生成对应的py代码. 但有时执行python manage.py makemigration ...

  4. [JAVA] 重写以及@Override标签

    以前JAVA看的少,最近做项目,对@Override的调用顺序有点疑惑,故查了一些资料.既然查资料了,那就把能看到的知识点整理一下,以供日后学习. 原文地址请保留http://www.cnblogs. ...

  5. mongodb3.X权限配置

    环境: CentOS6.8  mongodb3.4.1 1.连接mongodb数据库(如果mongo命令没有做环境变量配置,需要定位到有mongo命令的目录) [root@VM_118_34_cent ...

  6. CSS 小结笔记之解决flex布局边框对不齐

    在使用flex 进行伸缩布局的时候,经常会给子盒子设置边框,这时经常会出现上下边框对不齐的情况.本篇文章来探讨并解决这个问题. 具体出现的问题如下图所示 具体代码如下 <!DOCTYPE htm ...

  7. markdown简单常用语法

    一.标题(符号要和文字之间加上一个字符的空格)# 一级标题## 二级标题### 三级标题#### 四级标题##### 五级标题###### 六级标题二.列表(符号要和文字之间加上一个字符的空格)有序列 ...

  8. 团队项目个人进展——Day09

    一.昨天工作总结 冲刺第九天,把地图和界面整合了一下 二.遇到的问题 地图的样式和一些公共样式有冲突 三.今日工作规划 团队共同整合程序,做出第一阶段的成品.

  9. 从专用磁盘创建 Windows VM

    通过使用 Powershell 将专用托管磁盘附加为 OS 磁盘来创建新 VM. 专用磁盘是保留原始 VM 中的用户帐户.应用程序和其他状态数据的现有 VM 中虚拟硬盘 (VHD) 的副本. 使用专用 ...

  10. 准备好要上传到 Azure 的 Windows VHD 或 VHDX

    在将 Windows 虚拟机 (VM) 从本地上传到 Azure 之前,必须准备好虚拟硬盘(VHD 或 VHDX). Azure 仅支持采用 VHD 文件格式且具有固定大小磁盘的第 1 代 VM. V ...