Spring基础之IOC

一、ioc能解决什么问题
1、Spring是什么
spring是以ioc和aop为核心,能整合第三方框架和类库的企业级应用开源框架。
2、程序的耦合问题
例子:Driver类必须存在,编译才通过,JdbcDemo依赖Driver,这种类之间或方法之间的依赖关系就称为耦合。注册驱动改为根据类名反射创建对象,Driver类不存在,编译时也能通过,降低程序间的依赖称为解耦。实际开发中,要编译期不依赖,运行时才依赖。
public class JdbcDemo {
public static void main(String[] args) throws Exception{
//1.注册驱动
// DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接//3.获取操作数据库的预处理对象//4.执行SQL,得到结果集//5.遍历结果集//6.释放资源
}
}
3、工厂模式解耦
使用配置文件来配置controller,service,dao三层对象的全限定类名,创建一个类读取配置文件,创建和获取三层对象,这个类就是工厂。使用Map来存放创建的对象,这个Map称为容器。使用工厂模式,获取对象的方式由主动new对象变为被动的由工厂提供,工厂去容器查找或创建。这种被动的获取对象的方式就是控制反转。其作用就是降低程序耦合度。
public class BeanFactory {
// 1、定义Properties对象
private static Properties pros;
// 2、定义保存对象的容器
private static Map<String, Object> beans;
// 3、使用静态代码块为Properties赋值
static {
try {
// 4、读取配置文件
pros = new Properties();
InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
pros.load(in);
// 5、实例化容器
beans = new HashMap<String, Object>();
// 6、取出配置文件所有key(三层对象的类名)
Enumeration keys = pros.keys();
// 7、遍历枚举
while (keys.hasMoreElements()) {
String key = keys.nextElement().toString();
// 8、根据key取出全限定类名
String beansPath = pros.getProperty(key);
// 9、反射创建对象
Object value = Class.forName(beansPath).newInstance();
// 10、保存key(id)和value(对象)到容器
beans.put(key, value);
}
} catch (Exception e) {
throw new ExceptionInInitializerError("初始化properties失败!");
}
}
/**
* 根据bean的名称获取对象
*/
public static Object getBean(String beanName){
return beans.get(beanName);
}
}
二、ioc是什么
1、ioc的定义
ioc(inversion of control),意思是控制反转,将创建对象的权限交给框架,获取对象的方式由主动变为被动。spring就是通过ioc容器管理对象,ioc容器实质上就是一个对象工厂,使用BeanFactory工厂接口或子接口来实例化ioc容器。
2、spring的对象工厂结构

三、ioc怎么用
1、XML文件配置ioc
一般把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="demo" class="com.test.Demo" scope="singleton" init-method="init" destroy-method="destroy"></bean>
</beans>

(1)实例化bean的方式

空参构造函数的xml配置如下,Demo类中必须存在空参构造函数Demo()
<bean id="demo" class="com.test.Demo"></bean>
静态工厂的xml配置如下,getDemo为工厂类创建Demo对象的的静态方法
<bean id="beanFactory"class="com.test.BeanFactory" factory-method="getDemo"></bean>
实例工厂的xml配置如下,createDemo为工厂类创建Demo对象的的普通方法
<bean id="beanFactory" class="com.test.BeanFactory"></bean>
<bean id="demo" factory-bean="beanFactory" factory-method="createDemo"></bean>
(2)DI 依赖注入
DI(Dependency Injection)依赖注入,是ioc的具体实现,ioc降低了类之间的耦合度,但类之间的依赖关系依然存在,这时就需要spring的DI来维护依赖关系。


xm配置文件如下
<bean id="demo" class="com.test.Demo">
<constructor-arg name="name" value="张三"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg name="birthday" ref="now"></constructor-arg>
</bean>
<!-- 配置一个日期对象 -->
<bean id="now" class="java.util.Date"></bean>

xm配置文件如下
<bean id="demo" class="com.test.Demo">
<property name="name" value="张三" ></property>
<property name="age" value="18"></property>
<property name="birthday" ref="now"></property>
</bean>
<!-- 配置一个日期对象 -->
<bean id="now" class="java.util.Date"></bean>

xm配置文件如下
<bean id="demo" class="com.test.Demo" p:name="张三" p:age="18" />
2、注解配置ioc

配置文件applicationContext.xml必须添加如下配置,扫描包及子包下所有类,spring才能侦测到注解标识的组件。<context:component-scan> 元素会自动注册一个bean的后置处理器:AutowiredAnnotationBeanPostProcessor的实例。该后置处理器可以自动装配标记了注解的属性。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.test"></context:component-scan>
</beans>
如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类。
<context:component-scan base-package="com.test" resource-pattern="autowire/*.class"/>




3、全注解配置 ioc
可以完全不写xml配置文件,全部使用注解完成配置。



Spring基础之IOC的更多相关文章
- Spring基础——在 IOC 容器中 Bean 之间的关系
一.在 Spring IOC 容器中 Bean 之间存在继承和依赖关系. 需要注意的是,这个继承和依赖指的是 bean 的配置之间的关系,而不是指实际意义上类与类之间的继承与依赖,它们不是一个概念. ...
- Java之Spring基础与IoC
Spring About Spring 开源免费框架,轻量级,非入侵式框架.Spring就是一个轻量级的控制反转(IOC)和面向切片编程(AOP)的框架 Maven repo:Spring Web M ...
- 01—Spring基础配置IOC
- Spring笔记:IOC基础
Spring笔记:IOC基础 引入IOC 在Java基础中,我们往往使用常见关键字来完成服务对象的创建.举个例子我们有很多U盘,有金士顿的(KingstonUSBDisk)的.闪迪的(SanUSBDi ...
- Spring基础知识
Spring基础知识 利用spring完成松耦合 接口 public interface IOutputGenerator { public void generateOutput(); } 实现类 ...
- spring之初识Ioc&Aop
Spring框架的作用 spring是一个轻量级的企业级框架,提供了ioc容器.Aop实现.dao/orm支持.web集成等功能,目标是使现有的java EE技术更易用,并促进良好的编程习惯. Spr ...
- Spring 基础知识
Spring架构简单描述 原文:https://www.shiyanlou.com/courses/document/212 Spring 概述 1. Spring 是什么 Spring是一个开源的轻 ...
- Spring学习之Ioc控制反转(1)
开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------- ...
- Spring框架(3)---IOC装配Bean(注解方式)
IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...
随机推荐
- Muduo网络库实战(二):实现服务器与客户端的连接
1. 方案的确定 1)基本需求 用户1000+, IO压力不大: 多个客户端打开网站,输入查询字符串strclient,发送给服务器=>服务器接收客户端发过来的数据并处理,将结果返回给客户端: ...
- Pthon学习相关
1. Cython入门教程:https://www.jianshu.com/p/cfcc2c04a6f5
- windows下flume 采集如何支持TAILDIR和tail
一.问题:Windows 下 flume采集配置TAILDIR的时候,会报如下错误: agent.sources.seqGenSrc.type = TAILDIR agent.sources.seqG ...
- 从零开始通过webhooks实现前端自动化
1. 前置条件 有一台自己的服务器.比如阿里云,腾讯云之类 有远程仓库能够push代码,pull代码.比如github,或者码云 远程仓库有webhooks功能 2. 自动化部署流程 3. 构建流程 ...
- 前后端bug定位
否一致一个商品状态为status,待上架status=0,上架中status=1,下架status=2 前端bug:如:一个商品上架成功后,数据库显示的状态status=1,这时候可能是前端对应值的定 ...
- Unity2019.3缺少Cinemachine插件/AssetStore搜索不到
Unity2019.1版本都还自带Cinemachine,到2019.3就没有了(原因暂时未知),PackageManager里没有,到资源商店里搜索也找不到 解决方法: Windows>Pac ...
- Linux dts 设备树详解(一) 基础知识
Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 1 前言 2 概念 2.1 什么是设备树 dts(device tree)? 2. ...
- [hdu5375 Gray code]DP
题意:给一个二进制码,其中有一些位上为'?',对每个问号确定是'0'还是'1',最后以它对应的格雷码来取数,第i位为1则取第i个数,求取得的数的和的最大值. 思路:二进制码B转换成格雷码G的方法是,G ...
- [codeforces 200 E Tractor College]枚举,扩展欧几里得,三分
题目出自 Codeforces Round #126 (Div. 2) 的E. 题意大致如下:给定a,b,c,s,求三个非负整数x,y,z,满足0<=x<=y<=z,ax+by+cz ...
- JS理论--正则表达式RegExp的创建、元字符、优先度、方法(test(),exec(),match(),replace())
实战,参数可以对照上面的,代码一定要敲 var str = 'abc123cba456aaa789'; var reg = /\d+/g; console.log(reg.test(str)) //s ...