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:导入 ...
随机推荐
- 图论-网络流-最大流--POJ1273Drainage Ditches(Dinic)
Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 91585 Accepted: 3549 ...
- TCP的三次握手四次挥手理解及面试题
一.TCP概述 每一条TCP连接都有两个端点,这种端点我们叫作套接字(socket),它的定义为端口号拼接到IP地址即构成了套接字, 例如,若IP地址为192.0.0.1 而端口号为8000,那么得到 ...
- EditPlus编辑java代码 常规配置
- 3、Hive-sql优化,数据倾斜处理
一.Hive-sql优化 #增加reducer任务数量(拉取数量分流) ; #在同一个sql中的不同的job是否可以同时运行,默认为false set hive.exec.parallel=true; ...
- 【Kafka】Flume整合Kafka
目录 需求 一.Flume下载地址 二.上传解压Flume 三.配置flume.conf 四.启动flume 五.测试整合 需求 实现flume监控某个目录下面的所有文件,然后将文件收集发送到kafk ...
- Wpf 正常关闭程序 Gc 来不及回收?
最近在使用Udp开发客户端,发现很长时间GC都无法回收UdpClient,所以我决定强制标记Gc,非常奇怪的是,毫无作用,在Windows任务管理器中,也看不见程序的身影.简单来说,gc是系统为你独立 ...
- IDEA 创建Spring项目后org.springframework.boot报错
IDEA 创建 Spring boot 项目后 ,在pom.xml文件中 org.springframework.boot出错,刷新也没有作用. 如图: 可以降低 org.springframewor ...
- markdown:列表、表格、代码实现
插入列表 1. dsf2. dsds 插入表格header 1 | header 2---|---row 1 col 1 | row 1 col 2row 2 col 1 | row 2 col 2 ...
- Android Loader使用时,屏幕解锁后,重复加载
在使用AsyncTaskLoader时,当手机解锁后,会重复加载数据,代码如下: static class CouponShopQueryLoader extends AsyncTaskLoader& ...
- webpack 中,module,chunk 和 bundle 的区别是什么?
前两天为了优化公司的代码打包项目,恶补了很多 webpack4 的知识.要是放在几年前让我学习 webpack 我肯定是拒绝的,之前看过 webpack 的旧文档,比我们内部项目的文档还要简陋. 但是 ...