Spring 之初识IOC和DI
下载Spring jar包
Sping核心jar包

IOC简介
IOC:控制反转,指以前程序自己创建对象,现在将创建对象的控制权交给了第三方(Spring)了
IoC底层实现:工厂(设计模式)+反射(机制) + 配置文件(xml)
IOC是一种思想,是控制反转的思想、是一种解耦合的思想,Spring是该思想的一种实现。因此Spring容器也通常称之为IoC容器
IOC控制反转的实现
第一步:在src下建立applicationContext.xml (或者放在资源目录下)
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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--bean:告诉Spring容器,哪些对象(bean)需要交给Spring容器进行管理
id/name:该bean的“唯一”标识符
class:该bean的完整类名(spring容器底层可以使用反射创建对象)
-->
<bean id="userDao" class="com.igeekhome.dao.impl.UserDaoImpl"></bean>
</beans>
第二步:通过Spring的工厂获取Bean完成相关操作
public class UserServiceImpl implements IUserService {
@Override
public User get(Integer id) {
/**
从Spring容器中获取userDao对象(保证容器中已经配置了该对象,applicationContext.xml)即可
获取Spring容器(基于spring配置文件创建)
*/
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//容器中获取“指定”对象(根据id获取)
IUserDao userDao = (UserDaoImpl)ac.getBean("userDao");
System.out.println("UserService...userDao--->"+userDao);
System.out.println("UserService...get...执行了...");
return userDao.select(id);
}
}
DI简介
Dependency Injection: 依赖注入,在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件(简单的说,可以将另外一个bean对象动态的注入到另外一个bean中)
耦合代码变成依赖注入代码的方法:
<?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.igeek.spring.UserDaoImpl"/>
<!--
service :必须双方都是bean:在创建service的时候,主动将dao的依赖对象注入交给serivce
-->
<bean name="userService" class="com.igeek.spring.UserServiceImpl">
<!-- property:
setter属性注入
* name:setter属性的名字,和类一致。如果setXxx,则这里为xxx,如果setUserDAO,则这里为userDAO
spring会自动调用setUserDao(IUserDao userDao)方法
* ref:spring容器中定义的bean(对象)的名字
-->
<property name="userDao" ref="userDao"/>
</bean>
</beans>
//业务层实现
public class UserServiceImpl implements IUserService{
//定义属性
private IUserDao userDao;
//提供set方法,使用setXxx方法完成属性的注入
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
//使用依赖注入的方式获取dao
public void login() {
System.out.println("UserServiceImpl-service层被调用了。。。");
userDao.findByUsernameAndPassword();
}
}
//测试
public class SpringTest {
@Test
//模拟表现层
public void test(){
//spring的配置方式,IOC控制反转
//构建一个spring的工厂,使用applicationContext.xml(spring的核心配置文件)获取对象
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//从spring工厂中使用对象的标识获取对象
IUserService userService = (IUserService) ac.getBean("userService");
userService.login();
}
}
简单分析:

Spring的工厂
ApplicationContext直译为应用上下文,是用来加载Spring框架配置文件,来构建Spring的工厂对象,它也称之为Spring容器的上下文对象,也称之为Spring的容器
ApplicationContext 只是BeanFactory(Bean工厂,Bean就是一个java对象) 一个子接口
为什么不直接使用顶层接口对象来操作呢?
BeanFactory 采取延迟加载,第一次getBean时才会初始化Bean
Beanfactory的用法:
BeanFactory ac = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
BeanFactory ac = new XmlBeanFactory(new FileSystemResource("D:\\applicationContext.xml"));
- ApplicationContext是对BeanFactory扩展,提供了更多功能
1.国际化处理
2.事件传递
3.Bean自动装配
4.各种不同应用层的Context实现
Spring工厂的直接获取(两种方式)
方法一:从classpath路径加载,在类路径下寻找配置文件来实例化容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//可以加载多个Spring配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
可以在整个类路径中寻找xml文件
- 通过这种方式加载。需要将spring的配置文件放到当前项目的classpath路径下
* classpath路径指的是当前项目的src目录,该目录是java源文件的存放位置
方法二:从磁盘路径加载,在文件系统路径下寻找配置文件来实例化容器
ApplicationContext ctx = new FileSystemXmlApplicationContext("d:\\applicationContext.xml");
ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[]{"d:\\applicationContext.xml"});
- Spring的配置文件可以指定多个,可以通过String数组传入。
- 通过getBean方法获得Spring容器管理Bean对象
Spring 之初识IOC和DI的更多相关文章
- Spring核心思想——IOC和DI
基本概念 IOC是什么? IOC(Inversion of Control)控制反转,IOC是一种新的Java编程模式,目前很多轻量级容器都在广泛使用的模式. IOC解决了什么问题? ...
- 用IDEA详解Spring中的IoC和DI(挺透彻的,点进来看看吧)
用IDEA详解Spring中的IoC和DI 一.Spring IoC的基本概念 控制反转(IoC)是一个比较抽象的概念,它主要用来消减计算机程序的耦合问题,是Spring框架的核心.依赖注入(DI)是 ...
- 初识Spring框架实现IOC和DI(依赖注入)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是 ...
- spring.net中间IoC、DI和MVC
轮廓 spring.net它是开源的业务层框架,功能很强大,它归结到什么都有3能:面向切面编程:IoC和DI:提供综合型的框架支持,本片博客主要说一下IoC和DI.和其提供的对MVC框架的支持. Io ...
- Spring自学教程-IOC、DI、AOP(二)
一.spring的IOC-就是怎样使用spring来创建对象 二.springDI(依赖注入)-就是怎样给属性赋值 通过set方式赋值 以下我们只需要记住两点的赋值,基本类型和引用类型的赋值 基本类型 ...
- Spring 简单使用IoC与DI——XML配置
目录 Spring简介 导入jar包 Spring配置文件 Spring的IoC IoC简介 快速使用IoC Spring创建对象的三种方式 使用构造方法 使用实例工厂 使用静态静态工厂 Spring ...
- Spring系列(1)--IOC 和 DI
IOC 和 DI IOC 原理 xml 配置文件配置 bean dom4j 读取配置文件 工厂设计模式 反射机制创建对象 applicationContext.xml 配置文件,该配置文件名可自定义: ...
- 理解Spring中的IoC和DI
什么是IoC和DI IoC(Inversion of Control 控制反转):是一种面向对象编程中的一种设计原则,用来减低计算机代码之间的耦合度.其基本思想是:借助于"第三方" ...
- 学习Spring5必知必会(3)~Spring的核心 IoC 和 DI
一.Spring的核心 IoC(基于XML) 1.IoC容器 (1)BeanFactory容器创建对象: //使用BeanFactory @Test void testBeanFactory() th ...
随机推荐
- 这次,我是如何监控服务器CPU和内存的
背景 在新项目A中,要结合业务做性能测试.对于做过N次性能测试的我,这次有些巧妇有难无米之炊的感觉.以往的项目,服务器都是部署在AWS或者阿里云,像这样的云服务器厂商是可以通过轻松配置各种Dashbo ...
- CSPS模拟 57
rank4大众rank T1 天空龙 让他自由翱翔吧 T2 巨神兵 对于n=10的测试点本可以打出非常优秀的分层状压 但是没有打出来,因为对拓扑图理解不够深刻,纠结于指回的边,实际上只关注伸出的边就可 ...
- tarjan学习(复习)笔记(持续更新)(各类找环模板)
题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只 ...
- windows使用docker运行mysql等工具(一)windows安装docker
由于我本地的mysql版本比较低,最近想着要升级一下mysql版本,鉴于docker容器的火热,就想着在本地装个docker环境,然后下载最新版的mysql镜像,完成mysql8.0的安装.电脑是wi ...
- 更新linux时候提示“由于没有公钥,无法验证下列签名".
本文链接:https://blog.csdn.net/loovejava/article/details/21837935 新安装的Ubuntu在使用sudo apt-get update更新源码的时 ...
- EFK教程 - ElasticSearch高性能高可用架构
通过将elasticsearch的data.ingest.master角色进行分离,搭建起高性能+高可用的ES架构 作者:"发颠的小狼",欢迎转载与投稿 目录 ▪ 用途 ▪ 架构 ...
- jquery倒计时代码
jquery倒计时代码<pre> <span id="day_show">0天</span> <strong id="hour_ ...
- pxe批量部署
功能: 批量全自动安装操作系统方法: dhcp 自动分配IP tftp 微系统 用来安装系统 httpd 网络源 操作流程: #检查环境 getenforce #检查selinux systemctl ...
- java多线程回顾3:线程安全
1.线程安全问题 关于线程安全问题,有一个经典案例:银行取钱问题. 假设有一个账户,有两个线程从账户里取钱,如果余额大于取钱金额,则取钱成功,反之则失败. 下面来看下线程不安全的程序会出什么问题. 账 ...
- PHP代码安全有必要了解下
攻击者通过构造恶意SQL命令发送到数据库,如果程序未对用户输入的 SQL命令执行判断过滤,那么生成的SQL语句可能会绕过安全性检查,插入其他用于修改后端数据库的语句,并可能执行系统命令,从而对系统造成 ...