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 ...
随机推荐
- pandas常用操作详解(复制别人的)——数据透视表操作:pivot_table()
原文链接:https://www.cnblogs.com/Yanjy-OnlyOne/p/11195621.html 一文看懂pandas的透视表pivot_table 一.概述 1.1 什么是透视表 ...
- boxcox1p归一化+pipeline+StackingCVRegressor
找到最好的那个参数lmbda. from mlxtend.regressor import StackingCVRegressor from sklearn.datasets import load_ ...
- 写给开发人员的实用密码学(七)—— 非对称密钥加密算法 RSA/ECC
本文部分内容翻译自 Practical-Cryptography-for-Developers-Book,笔者补充了密码学历史以及 openssl 命令示例,并重写了 RSA/ECC 算法原理.代码示 ...
- Linux环境下安装RocketMQ
最近在学习消息队列,针对RocketMQ进行了初步研究,这里记录下安装配置的过程,与大家共同分享 一.选择合适的版本 注:安装.运行过程中需要依赖JDK,因此安装之前需要保证当前linux环境下具备上 ...
- Java案例——反转字符串
/*案例:将用户输入的字符串反转并输出 分析:1.使用Scanner 类获取用户输入的字符串 2.定义一个方法将字符串反着遍历并拼接 3.定义变量接受并输出* */public class Strin ...
- Linux移植实际操作一
@ 目录 *前言 目前看了很多关于"Linux移植"的的各种教程.书籍,看完发现不过是对已有板子.已有驱动进行启用.禁用.参数修改.只能叫做"Linux配置". ...
- python 发送POST请求
#博客地址:https://blog.csdn.net/qq_36374896 import urllib.request import urllib.parse url = "http:/ ...
- SpringMVC实现文件上传功能
文件上传 文件上传要求form表单的请求方式必须为post,并且添加属性enctype="multipart/form-data" SpringMVC中将上传的文件封装到Multi ...
- 常见的反爬措施:UA反爬和Cookie反爬
摘要:为了屏蔽这些垃圾流量,或者为了降低自己服务器压力,避免被爬虫程序影响到正常人类的使用,开发者会研究各种各样的手段,去反爬虫. 本文分享自华为云社区<Python爬虫反爬,你应该从这篇博客开 ...
- 《前端运维》五、k8s--1安装与基本配置
一.k8s基础概念与安装 k8s,即kubernetes是用于自动部署,扩展和管理容器化应用程序的开源系统.详细的描述就不多说了,官网有更详细的内容.简单来说,k8s,是一个可以操作多台机器调度部署镜 ...