JAVA框架 Spring 依赖注入
一:介绍
情景:我们在给程序分层的时候: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 依赖注入的更多相关文章
- 【Java】 Spring依赖注入小试牛刀:编写第一个Spring ApplicationContext Demo
0 Spring的依赖注入大致是这样工作的: 将对象如何构造(ID是什么?是什么类型?给属性设置什么值?给构造函数传入什么值?)写入外部XML文件里.在调用者需要调用某个类时,不自行构造该类的对象, ...
- JAVA框架 Spring 注解注入
一.首先需要引入jar包:spring-aop-4.2.4.RELEASE.jar.(在spring解压包libs内). 二.如果注解方式注入依赖的对象,需要引用新的约束. 内的:xsd-config ...
- Java Web系列:Spring依赖注入基础
一.Spring简介 1.Spring简化Java开发 Spring Framework是一个应用框架,框架一般是半成品,我们在框架的基础上可以不用每个项目自己实现架构.基础设施和常用功能性组件,而是 ...
- java后端开发三年!你还不了解Spring 依赖注入,凭什么给你涨薪
前言 前两天和一个同学吃饭的时候同学跟我说了一件事,说他公司有个做了两年的人向他提出要涨薪资,他就顺口问了一个问题关于spring依赖注入的,那个要求涨薪的同学居然被问懵了...事后回家想了想这一块确 ...
- java线程中如何使用spring依赖注入
实现一个线程继承了Thread或实现Runnable接口,想在run方法中使用spring依赖注入(操作数据库),此时报错为空指针,就是说没有注入进来. 实验了几种方式,分别说一下优缺点. 1:写了工 ...
- 为什么多线程、junit 中无法使用spring 依赖注入?
为什么多线程.junit 中无法使用spring 依赖注入? 这个问题,其实体现了,我们对spring已依赖太深,以至于不想自己写实例了. 那么到底是为什么在多线程和junit单元测试中不能使用依赖注 ...
- Spring依赖注入原理分析
在分析原理之前我们先回顾下依赖注入的概念: 我们常提起的依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念.具体含义是:当某个角色( ...
- Spring依赖注入servlet会话监听器
Spring提供了一个 “ContextLoaderListener” 监听器,以使 Spring 依赖注入到会话监听器. 在本教程中,通过添加一个 Spring 依赖注入一个bean 到会话监听器修 ...
- Spring依赖注入(IOC)那些事
小菜使用Spring有几个月了,但是对于它的内部原理,却是一头雾水,这次借着工作中遇到的一个小问题,来总结一下Spring. Spring依赖注入的思想,就是把对象交由Spring容器管理,使用者只需 ...
随机推荐
- Java 取得文件名的后缀
作者QQ:1095737364 QQ群:123300273 欢迎加入! 文件上传的时候可能需要修改文件名,因此需要取得文件的后缀: String filename="123.t ...
- JAVA generic array 泛型数组
在JAVA中是不支持泛型数组的,不能通过 Z[] array=new Z[10] 这样的方式来创建数组,而是使用反射Aarry.newInstance来创建: 具体代码如下: public Z[][] ...
- JS 显示隐藏DIV
JS关闭DIV HTML <div id="bar1"> <p onclick="removeElement('bar1')">关闭&l ...
- vue 结合 animate.css
这里说的是vue2.0和animate.css的结合使用.其实用过就知道用法是比较简单的.但是就是刚开始使用的时候,难免有的会遇到各种问题.简单的说说我所用过并且遇过的坑. 首先是transition ...
- hibernate动态表名映射
引自:http://blog.csdn.net/xvshu/article/details/39187779 最近的一个项目有一个需求,有N个考核单位,要对每个考核单位生成一张考核情况表,这样做的目的 ...
- 高德地图 JS API - 根据地名实现标记定位
德地图 JS API 使用前的准备工作请参考官方网站说明: https://lbs.amap.com/api/javascript-api/guide/abc/prepare 根据地名实现地图标记定位 ...
- Android HandlerThread和IntentService
HandlerThreadHandlerThread继承了Thread,它是一种可以使用Handler的Thread,它实现也很简单,就是在run中通过Looper.prepare()来创建消息队列, ...
- 如何使用 Swift 开发简单的条形码检测器?
[编者按]本文作者为 Matthew Maher,主要手把手地介绍如何用 Swift 构建简单的条形码检测器.文章系 OneAPM 工程师编译整理. 超市收银员对货物进行扫码,机场内录入行李或检查乘客 ...
- C#多线程的用法9-Semaphore
Semaphore:可理解为允许线程执行信号的池子,池子中放入多少个信号就允许多少线程同时执行. private static void MultiThreadSynergicWithSemaphor ...
- 使用代码段遍历,枚举类型Enum
最近项目中定义了一些枚举类型,需要将枚举的键值传给前端,用于制作下拉菜单. 1.首先定义了枚举类型 public enum 请假类型 : int { 病假 = 1, 事假 = 2, 婚假 = 3, 产 ...