Spring-Bean的依赖注入分析-01
###我们先通过一个例子弄明白为什么要使用依赖注入###
1.创建业务层UserService接口及UserServiceImpl实现类(接口代码省略)
public class UserServiceImpl implements UserService {
@Override
public void sava() {
ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao1 = (UserDao) app.getBean("userDao");
userDao1.save();
}
}
2.创建DAO层的UserDao接口及UserDaoImpl实现类(接口代码省略)
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("save running...");
}
}
3.配置spring的applicationContext.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.hao.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.hao.service.impl.UserServiceImpl"/>
</beans>
//告诉spring容器类的位置,使用bean将service类和dao类配置到spring配置文件中,
//id为唯一性标识,外部可以通过getBean("id");从spring容器中获取对象
4.Controller层进行测试
public class UserController {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
UserService service = (UserService) context.getBean("userService");
service.sava();
}
}
//加载spring配置文件,创建spring容器
//通过getBean方法获取从spring容器中对象
分析:目前UserSerivce实例和UserDao实例都存在spring容器当中,当前的做法是外部从spring容器获得UserService实例和UserDao实例,然后在程序中完成调用
思考:我们在Controller层用的是service,不管Dao是怎么获取的,我们想那么能不能在spring容器内部就完成service调用Dao的操作呢?
(因为UserService和UserDao都在spring的容器中,而最终程序直接使用的是UserService,所以可以在spring容器中,将UserDao设置到UserService内部)
===================================================
然后实现以上问题就是使用依赖注入了
依赖注入:它是spring框架核心IOC的具体实现
在编写程序时,通过控制反转,把对象的创建交给了spring,但是代码中不可能出现没有依赖的情况。IOC解耦只是降低他们的依赖关系,但不会消除,例如:业务层仍会调用持久层的方法
那这种业务层和持久层的依赖关系,在使用spring之后,就让Spring来维护了。
简单的说:就是坐等框架把持久层对象传入业务层,而不用我们自己去获取
=========================================================================================================================================================
接下来就是dao注入给service了
1.构造方法
2.set方法
演示set方法注入
(1)创建UserDao接口以及UserDaoImpl实现类
public class UserDaoImpl implements UserDao {
@Override
public void save1() {
System.out.println("save running...");
}
}
(2)创建UserService接口以及UserServiceImpl实现类
注意:这里使用了在UserServiceImplt中添加了UserDao属性,因为使用set方法进行注入,所以实现属性的set方法
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void sava() {
userDao.save1();
}
}
(3)spring配置文件的实现
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="com.hao.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.hao.service.impl.UserServiceImpl">
//这里面的name属性值是set方法名去掉set三个字和U变小写,ref属性是引入dao中bean实例的id标识符,这里是第一个bean标签中的id
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
(4)Controller前端测试
public class UserController {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
UserService service = (UserService) context.getBean("userService");
service.sava();
}
}
结果:save running . . .
这样就实现了set注入
进阶点:
接下来我们来思考一个问题,如果我把Controller前端代码改成如下
public class UserController {
public static void main(String[] args) {
// ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
// UserService service = (UserService) context.getBean("userService");
// service.sava();
UserService userService=new UserServiceImpl();
userService.sava();
}
}
我们不从容器中获取UserService对象了,自己new了一个UserService对象,然后调用方法,这样会出现什么情况呢
我们发现出现了空指针异常,然后定位到代码错误处
16行出现了userDao报了空,那么也就是第8行空,那这是什么原因呢?
原因是:我们的UserService对象不是从容器中获取的,而是自己new出来的,那么UserDao是在spring容器中注入给UserService的,你不从spring容器中获取UserService对象,那么就会出现UserDao为空的异常
下一篇博客我们讲通过p命名空间注入,简化操作
Spring-Bean的依赖注入分析-01的更多相关文章
- 给力啊!这篇Spring Bean的依赖注入方式笔记总结真的到位,没见过写的这么细的
1. Bean的依赖注入概念 依赖注入(Dependency Injection):它是 Spring 框架核心 IOC 的具体实现.在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是 ...
- spring几种依赖注入方式以及ref-local/bean,factory-bean,factory-method区别联系
平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...
- Spring学习(一)——Spring中的依赖注入简介【转】
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...
- Spring学习(一)——Spring中的依赖注入简介
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework的依赖注入和控制反转
Dependency Injection and Inversion of Control 1.概述: 1.1相关概念 bean:由IoC容器所管理的对象,也即各个类实例化所得对象都叫做bean 控制 ...
- Spring学习(三)——Spring中的依赖注入的方式
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...
- spring六种种依赖注入方式
平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...
- spring 四种依赖注入方式以及注解注入方式
平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...
- JavaEE开发之Spring中的依赖注入与AOP
上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...
随机推荐
- 20192204 2019-2020-2 《Python程序设计》实验四报告
20192204 2019-2020-2 <Python程序设计>实验四报告 课程:<Python程序设计> 班级: 1922 姓名: 李龙威 学号:20192204 实验教师 ...
- ArcGIS对进行数据拓扑修改
空间数据处理--题目1 土地利用数据每年都在发生变化,故每年都要根据去年的数据进行修改.请根据以下要求,修改A区域的数据并对B区域已做好的数据进行拓扑检查. 一. 数据说明(见"题目1&qu ...
- 关于linux命令的随笔第一篇
大多数的情况下,我们都是通过ssh客户端远程连接服务器去进行维护访问,所以我们必须要掌握linux命令 linux命令大约有上百种,但是并非所有命令都属于常用命令,所以不需要死记硬背,多用多百度就可以 ...
- WPF 可视化树的用途
1.可视化树的主要用途: 1.可以使用样式改变可视化树中的一个元素.可以使用Style.TargetType属性选择希望修改 的特定元素.甚至当控件属性发生变化时,可以使用触发器自动完成更改. 2.可 ...
- 论文解读《Cauchy Graph Embedding》
Paper Information Title:Cauchy Graph EmbeddingAuthors:Dijun Luo, C. Ding, F. Nie, Heng HuangSources: ...
- office online在线预览服务与https的tls证书兼容问题
问题现象:k8s环境配置证书后,无法调用office online 服务,附件无法预览 问题原因:ingress默认启用得是tls1.2,不兼容以下版本 k8s环境解决方法:增加ingress配置,兼 ...
- 6月28日 Django form组件 和 modelform组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- java高级用法之:调用本地方法的利器JNA
目录 简介 JNA初探 JNA加载native lib的流程 本地方法中的结构体参数 总结 简介 JAVA是可以调用本地方法的,官方提供的调用方式叫做JNI,全称叫做java native inter ...
- 高度不定,宽100%,内一div高不确定,如何实现垂直居中?
verticle-align: middle; 绝对定位50%加translateY(-50%) 绝对定位,上下左右全0,margin:auto
- 如何给Spring 容器提供配置元数据?
这里有三种重要的方法给Spring 容器提供配置元数据. XML配置文件. 基于注解的配置. 基于java的配置.