IOC的使用
1.概要:
在spring中,都是使用反射机制创建对象,将创建对象的权利交给spring容器,就是控制反转(ioc)
对象创建方式
- 有参构造
- 无参构造
- 工厂模式(静态,非静态)
2.创建IDEA控制台测试项目

3.导入依赖
日志依赖:log4j
测试依赖:junit
spring依赖:spring-context-support、core、context、expression、beans、test
4.创建resources
log4j.properties配置如下:
# log4J日志框架的配置文件 文件名字不能改
# DEBUG 表示日志的级别 调试
# Console 日志打印在控制台
log4j.rootLogger=DEBUG, Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
# 哪些日志需要打印
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
5.创建bean层
public class Person {
private Integer id;
private String name;
//无参,有参,getset,tostring
public Person() {
System.out.println("调用了无参构造");//方便观察如何调用的
}
public Person(Integer id, String name) {
System.out.println("调用了有参构造。。")
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
System.out.println("调用了setId");
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("调用了setName");
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
//静态工厂模式创建对象要单独在同一个bean中,新建一个类
package com.dream.bean;
public class PersonFactory {
public static Person createPerson(){
return new Person(3,"使用静态工厂创建p3.....");
}
}
//非静态工厂模式创建对象要单独新建一个类
package com.dream.bean;
public class PFactory {
public Person createPerson(){
return new Person(4,"使用非静态工厂创建p4.....");
}
}
6.创建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">
<!--使用Spring的反射机制 创建对象-->
<!--1:默认调用无参数的构造方法-->
<!--2.调用有参数的构方法创建对象-->
<!--3.使用静态工厂创建对象-->
<!--4.使用非静态工厂创建对象-->
<!--1:默认调用无参数的构造方法-->
<bean id="p1" class="com.dream.bean.Person">
<property name="id" value="1"/>
<property name="name" value="这是spring创建的第一个对象"/>
</bean>
<!--2.调用有参数的构造方法创建对象-->
<bean id="p2" class="com.dream.bean.Person">
<constructor-arg name="name" value="用index调整传入参数的顺序" index="1" />
<constructor-arg name="id" value="2" index="0" />
</bean>
<!--3.使用静态工厂创建对象-->
<bean id="p3" class="com.dream.bean.PersonFactory" factory-method="createPerson"/>
<!--4.使用非静态工厂创建对象-->
<bean id="factory" class="com.dream.bean.PFactory"/>
<bean id="p4" factory-bean="factory" factory-method="createPerson"/>
</beans>
7.创建测试类
package com.dream.test;
import com.dream.bean.Person;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class testSpring {
@Test
public void testSpring01(){
//启动加载配置文件,并启动Spring框架
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 从Spring容器中获取对象(装的是对象!Spring就是对象的容器!)
Person p = context.getBean("p1", Person.class);
System.out.println(p);
}
打印结果:
调用了无参构造
调用了setId
调用了setName
调用了无参构造
调用了setId
调用了setName
Person{id=1, name='这是spring创建的第一个对象'}
@Test
public void testSpring02(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Person p = context.getBean("p2", Person.class);
System.out.println(p);
}
打印结果:
调用了有参构造。。
调用了有参构造。。
调用了有参构造。。
调用了无参构造
调用了setId
调用了setName
Person{id=2, name='用index调整传入参数的顺序'}
@Test
public void testSpring03(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Person p = context.getBean("p3", Person.class);
System.out.println(p);
} 打印结果:Person{id=3, name='使用静态工厂创建p3.....'}
@Test
public void testSpring04(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Person p = context.getBean("p4", Person.class);
System.out.println(p);
}
打印结果: Person{id=4, name='使用非静态工厂创建p4.....'}
}
8.另附xml中属性解释

IOC的使用的更多相关文章
- 学习AOP之透过Spring的Ioc理解Advisor
花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
- 深入理解DIP、IoC、DI以及IoC容器
摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...
- 自己实现简单Spring Ioc
IoC则是一种 软件设计模式,简单来说Spring通过工厂+反射来实现IoC. 原理简单说明: 其实就是通过解析xml文件,通过反射创建出我们所需要的bean,再将这些bean挨个放到集合中,然后对外 ...
- 使用Microsoft的IoC框架:Unity来对.NET应用进行解耦
1.IoC/DI简介 IoC 即 Inversion of Control,DI 即 Dependency Injection,前一个中文含义为控制反转,后一个译为依赖注入,可以理解成一种编程模式,详 ...
- DIP原则、IoC以及DI
一.DIP原则 高层模块不应该依赖于底层模块,二者都应该依赖于抽象. 抽象不应该依赖于细节,细节应该依赖于抽象. 该原则理解起来稍微有点抽象,我们可以将该原则通俗的理解为:"依赖于抽象&qu ...
- 【初探Spring】------Spring IOC(三):初始化过程---Resource定位
我们知道Spring的IoC起到了一个容器的作用,其中装得都是各种各样的Bean.同时在我们刚刚开始学习Spring的时候都是通过xml文件来定义Bean,Spring会某种方式加载这些xml文件,然 ...
- 【初探Spring】------Spring IOC(二):初始化过程---简介
首先我们先来看看如下一段代码 ClassPathResource resource = new ClassPathResource("bean.xml"); DefaultList ...
- 【初探Spring】------Spring IOC(一)
IOC:Inversion of Control(控制反转).IOC它所体现的并不是一种技术,而是一种思想,一种将设计好的对象交给容器来管理的思想.IOC的核心思想就体现在控制.反转这两个词上面,要理 ...
- .NET里简易实现IoC
.NET里简易实现IoC 前言 在前面的篇幅中对依赖倒置原则和IoC框架的使用只是做了个简单的介绍,并没有很详细的去演示,可能有的朋友还是区分不了依赖倒置.依赖注入.控制反转这几个名词,或许知道的也只 ...
随机推荐
- 几个网络模型的示例代码(BlockingModel、OverlappedModel、WSAEventSelect、CompletionRoutine)..c++
作者的blog:猪)的网络编程世界 几个网络模型的示例代码代码包括了下面几个模型的示例:BlockingModel(阻塞模式).OverlappedModel(基于事件的重叠I/O).WSAEvent ...
- bzoj 3501 PA2008 Cliquers Strike Back —— 贝尔数
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3501 用贝尔三角预处理贝尔数,拆模数并在 \( p \) 进制下使用公式,因为这样每次角标增 ...
- Python3解leetcode Symmetric Tree
问题描述: Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). ...
- 五 akka streams kafka
(转载 https://doc.akka.io/docs/akka-stream-kafka/current/home.html) 一: Akka Streams Kafka, also known ...
- selenium上传文件,怎么操作
#通过os.path.abspath()方法,打开图片的绝对路径,然后,定位上传按钮,然后,send_keys()方法中,添加这个文件路径就可以了
- ssh无密码登录设置失败的 解决办法
因为要安装hadoop所以需要设置ssh无密码登录,SSH的安装就不在这里介绍了: 我的系统是ubuntu15.10,开始按照网上很多的步骤去配置,最后发现登录时还要密码,登录多次也是这样的情况 最后 ...
- 如何增加新的PointT类型
博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=286 为了增加新的point类型,首先需要进行定义,例如: struct M ...
- Adding In-App Purchase to your iOS and OS X Applications
Adding In-App Purchase to your iOS and OS X Applications In-App Purchase allows you to sell addition ...
- UVa 10534 Wavio Sequence (LIS+暴力)
题意:给定一个序列,求一个最长子序列,使得序列长度为奇数,并且前一半严格递增,后一半严格递减. 析:先正向和逆向分别求一次LIS,然后再枚举中间的那个数,找得最长的那个序列. 代码如下: #pragm ...
- NativeScript官方书籍:NativeScript in Action-用你现有技术构建移动应用程序
大家好,我用nativescript做企业级移动应用开发一年多了.从最初只能看nativescript英文文档,到现在看到官方发布正式的书籍,感觉nativescript变得越来越好. 当然,在这个过 ...