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容器管理,使用者只需 ...
随机推荐
- 面向对象设计模式_生成器模式解读(Builder Pattern)
首先提出一个很容易想到应用场景: 手机的生产过程:手机有非常多的子件(部件),成千上万,不同品牌的手机的生产过程都是复杂而有所区别的,相同品牌的手机在设计上也因客户需求多样化,大到型号,小到颜色,是否 ...
- mongodb命令(持续更新)
$lt $lte $gt $gte< . <= . > . >= 1.分组求和db.collection.aggregate([{$group : {_id : null, s ...
- putty连接ubuntu:network error:connection refused
原因: ubuntu存在一个bug:在/var/run/目录下缺少一个文件夹sshd 解决方法: 在命令行输入: sudo mkdir /var/run/sshd sudo /usr/sbin/ssh ...
- HDU4280(KB11-G 最大流)
Island Transport Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- 设计模式原则(4)--Interface Segregation Principle(ISP)--接口隔离原则
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.定义: 使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口. 2.使用场景: 类A ...
- 18:Tomorrow never knows?
18:Tomorrow never knows? 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 甲壳虫的<A day in the life>和 ...
- css inline元素和inline-block元素之间缝隙产生原因和解决办法
行内元素产生水平空隙的原因及解决方案 这篇文章讲的很好,但是提供的解决方案没有这篇好实现 去除inline-block元素间间距的N种方法
- ViewPager中切换界面Fragment被销毁的问题
ViewPager中切换界面Fragment被销毁的问题分析 使用ViewPager+Fragment实现界面切换,当界面数量大于3时,出现二次滑动后数据消失的情况,下面由Fragment生命周期进行 ...
- JSTL核心标签库——错误处理标签
<c:catch>标签 Demo: 错误发生时,不转发至其他网页来显示错误信息,而在当前网页捕捉异常,并显示相关信息. <%@page contentType="text/ ...
- ConstraintLayout (约束布局)属性详情
本文部分内容来自于网络,点击浏览原文 app:layout_constraintLeft_toLeftOf //Constrains the left side of a child to the l ...