###我们先通过一个例子弄明白为什么要使用依赖注入###

1.创建业务层UserService接口及UserServiceImpl实现类(接口代码省略)

public class UserServiceImpl implements UserService {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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;}@Overridepublic 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相关推荐

  1. Spring Bean配置依赖注入

    Bean配置 属性 值 注释 id 自自定义,一般为类名 Bean ID name 自自定义,一般为类名,与id作用相同 Bean别名,多个别名逗号分隔 class 指定的类路径,com.xx.xx. ...

  2. spring源码依赖注入的核心方法populateBean(beanName, mbd, instanceWrapper)分析

    spring源码依赖注入的核心方法populateBean(beanName, mbd, instanceWrapper)分析:通过源码我们发现在分析这个方法之前,此对象已经创建完成实例,内存开辟了空 ...

  3. Spring IOC循环依赖解决方案分析

    Spring IOC循环依赖解决方案分析 这里Spring主要用了三层缓存来完成对循环依赖的实现. 下面的属性来源于DefaultSingletonBeanRegistry类 /** Cache of ...

  4. JavaEE开发之Spring中的依赖注入与AOP编程

    上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...

  5. spring中的依赖注入——构造函数注入、set方法注入( 更常用的方式)、复杂类型的注入/集合类型的注入

    spring中的依赖注入 依赖注入: Dependency Injection IOC的作用:降低程序间的耦合(依赖关系) 依赖关系的管理:以后都交给spring来维护.在当前类需要用到其他类的对象, ...

  6. spring四种依赖注入方式

    平常的java开发中,程序员在某个类中需要依赖其它类的方法,通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. spring提出了依赖注入的思想,即依赖不由程序 ...

  7. 详解Spring框架的依赖注入

    本篇主要介绍Spring的依赖注入.依赖注入是Spring协调不同Bean实例之间的合作而提供的一种工作机制,在确保Bean实例之间合作的同时,并能保持每个Bean的相对独立性.通过本篇的学习,可以达 ...

  8. Spring系列之依赖注入的三种方式

    目录 一.依赖注入方式 1.使用属性的setXXX方法注入 2.构造函数注入 (1)按类型匹配入参type (2)按索引匹配入参index (3)联合使用类型和索引匹配入参[type和index一起使 ...

  9. Spring -Spring的 DI - 依赖注入的 使用学习

    一 . spring的DI 依赖注入,一句话总结 :给属性赋值 :           一个类中的属性都可以采用springDI的方式进行赋值,但是并不是所有的属性都适合赋值: 1. 利用set给属性 ...

最新文章

  1. 巴菲特评科技股:投资 IBM 是个错误,还会增持苹果,亚马逊简直是奇迹
  2. 学生科技周的讲座-2021-内容准备
  3. 学python好不好-学历低可以学python吗?好不好就业?
  4. hdu 2586(LCA的离线做法)
  5. 机器学习基础自学笔记2
  6. Linux资料分享,强势来袭!
  7. 线条边框简笔画图片大全_简笔画猪 手抄报图片边框版式大全
  8. JAVA 简单综合题目 小型公司职工对象
  9. cuda Synchronization
  10. android的fragment讲解
  11. 智能指针(三):unique_ptr使用简介
  12. 常用shell命令介绍
  13. Word编辑公式的快捷键与命令
  14. 云研发 IDE Uncode:演示版发布(欢迎加入开发)
  15. HBase集群出现NotServingRegionException问题的排查及解决方法
  16. android修改ipv4,Android 设置ipv4优先策略访问网络
  17. java大学生网上请假系统ssm框架
  18. 实战技法 - 短线操盘 (1)
  19. FPGA学习-m序列信号发生器
  20. 【数论】君と彼女の恋

热门文章

  1. 大家好,换博客了,希望大家多多关注
  2. M2 Spec: an update of M1 Spec
  3. Symfony常用指令(收藏版)
  4. 转载:【Data Management】PhotoLocations源程序
  5. TClientDataSet[3]: 手动建立数据集
  6. 如何画图命名_餐厅新出菜品,该如何有效推广?
  7. java中三种转string的方法_java中int,char,string三种类型的相互转换
  8. c语言计算时间的编程,C语言实现时间戳转日期的算法(推荐)
  9. linux7网卡配置vlan,centos7配置vlan,实现一个网卡两个地址的功能
  10. linux删文件进程叫什么,Linux find 查找 并删除文件 杀掉进程