一:介绍

情景:我们在给程序分层的时候: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. 【13】享元模式(FlyWeight Pattern)

    一.引言 在软件开发过程,如果我们需要重复使用某个对象的时候,若重复地使用new创建这个对象的话,就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非常严重.享元模式可以 ...

  2. Python 调度算法 死锁 静动态链接 分页分段

    1 select poll epoll的区别基本上select有3个缺点: 连接数受限查找配对速度慢数据由内核拷贝到用户态poll改善了第一个缺点 epoll改了三个缺点. (1)select,pol ...

  3. iTerm通过堡垒机自动登录服务器

    为了保障网络和数据安全,越来越多公司使用堡垒机.iTerm作为一个好用的终端利器,要实现自动通过堡垒机登录服务器的方式有多种.下面我就来介绍一种通过expect脚本的方式完成配置. 第一步,进入/us ...

  4. VideoView获取本地视频播放

    主布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...

  5. Spring Boot系列学习文章(一) -- Intellij IDEA 搭建Spring Boot项目

    前言: 最近做的一个项目是用Spring Boot来做的,所以把工作中遇到的一些知识点.问题点整理一下,做成一系列学习文章,供后续学习Spring Boot的同仁们参考,我也是第一次接触Spring ...

  6. Expo大作战(八)--expo中的publish以及expo中的link,对link这块东西没有详细看,大家可以来和我交流

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,将全部来与官网 我猜去全部机翻+个人 ...

  7. c# 子窗体打开或者切换就最大化

    “用MDI方式打开一个子窗口体后,总是不能最大化显示,明明子窗口体的WindowState设置为Maximized?”,相信有很多人会遇到这的样问题,请按下面的方法设置即可使MDI子窗体最大化:1.把 ...

  8. python3+unittest+HTMLTestRunner

    参考博客1 参考博客2 python3版HTMLTestRunner.py见博客园‘链接’(已经上传到博客园) import unittest class operatinon_unittest(un ...

  9. 测试笔试单选题(持续更新ing)

    1.在GB/T17544中,软件包质量要求包括三部分,即产品描述要求._____.程 序和数据要求.( A ) A.用户文档要求 B.系统功能要求 C.设计要求说明 D.软件配置要求 2.软件的六大质 ...

  10. 谨慎使用MyBatis自动生成Where语句

    最近监控到类似这样一个慢查询: select XX_time from XXOrderInfo WHERE ( OrderId is not null and OrderId = N'xxxx') x ...