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容器管理,使用者只需 ...
随机推荐
- Codeforces834A
A. The Useless Toy time limit per test:1 second memory limit per test:256 megabytes input:standard i ...
- (一)认识Sass和Compass
第一章 Sass和Compass让样式表重焕青春 // 内容概要// 开始学习Sass和动态样式表// 用Sass更高效地写样式表// Compass简介// 用Compass迎接工程实践中的样式挑战 ...
- js多线程(worker)
浏览器端js是单线程执行,所以当js执行高负载运算时,UI渲染就会阻塞,页面就会出现卡顿,用户体验就不是很好 js为此也提供了异步操作,例如: 定时器(setTimeout 和 setInterval ...
- java中System.currentTimeMillis()
System.curentTimeMillis();会产生一个当前的毫秒. 1.计算某个方法的耗时 long curTime = System.currentTimeMillis(); resourc ...
- onkeyup小练习
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ubuntu 搭建samba共享方案
1.samba服务安装搭建 sudo apt-get install samba sudo vim /etc/samba/smb.conf workgroup = szsoft 设置用户密码登陆方式s ...
- TagCloudView云标签的灵活运用
这两天做了一个项目,发现标签不能更改任意一个标签的字体的颜色,需求如同置前标签,然后就对tagcloudeview稍做修改做了这么一个demo.不为别的,只为以后自己用的时候方便拷贝. 先看效果图: ...
- RecyclerView源码解析 - 分割线
猜想: 既然考虑了分割线,那么子View在测量时候肯定要去考虑分割线留出的位置 直接measureChild()方法 猜想: 分割线会调用绘制的方法 onDraw()
- idea 关联 jdk
1.打开IntelliJ IDEA 2.选择 "File" 菜单 3.找到 "other settings" 4.选择 “Structure for new P ...
- Python+Selenium笔记(三):使用unittest
#网络很慢可能会运行报错 (一) 前言 Selenium WebDriver是一个浏览器自动化测试的API集合.它提供了很多与浏览器自动化交互的特性,并且这些API主要是用于测试Web程序.如果仅 ...