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框架的使用只是做了个简单的介绍,并没有很详细的去演示,可能有的朋友还是区分不了依赖倒置.依赖注入.控制反转这几个名词,或许知道的也只 ...
随机推荐
- BZOJ_1304_[CQOI2009]叶子的染色_树形DP
BZOJ_1304_[CQOI2009]叶子的染色_树形DP Description 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白 ...
- bzoj 3653 谈笑风生——主席树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3653 原来一直想怎么线段树合并.可是不会把角标挪一位. 查询的其实是子树内一段深度的点的 s ...
- bzoj 5281 [Usaco2018 Open]Talent Show——0/1分数规划
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5281 把分子乘1000,就能在整数里做了. 这种水题也花了这么久…… #include< ...
- Oracle字符串截断
字段.SUBSTR(string,start_position,[length]) 求子字符串,返回字符串解释:string 元字符串, start_position 开始位置(从0开始), leng ...
- resiprocate使用入门:内网搭建基于repro的sipproxy测试环境
测试环境 sipproxy:repro + centos 客户端:windows电脑客户端使用X-Lite,手机andriod客户端使用linphone repro配置和启动 log的配置 如果使用默 ...
- SpringMVC之二:配置 Spring MVC
Servlet 3.0规范在2009年12月份就发布了,因此很有可能你会将应用部署到支持Servlet 3.0的Servlet容器之中,如tomcat7.0及以上.在Servlet 3 规范中,可以使 ...
- CSharp读取配置文件的类(简单实现)
Reinventing the wheel 系列 CSharp 读取配置文件的类 简单实现(注意没有写) 本人对CS 不是很熟,库也不熟,所以到网上找个实现,并自己添加了点异常.如果只是读取信息,足够 ...
- Behave + Selenium(Python) 三
来自T先生 通过之前的2篇文章,大家都了解了如果利用behave和selenium打开网页和进行基本的操作,但是这些对于项目来说,却是往往不够的. 如果对junit或者TestNG熟悉的人都知道有@B ...
- SRAM SROM DRAM DROM DDR NAND FLASH EMMC的区别
RAM(Random Access Memory)的全名为随机存取记忆体,它相当于PC机上的移动存储,用来存储和保存数据的.它在任何 时候都可以读写,RAM通常是作为操作系统或其他正在运行程序的临时存 ...
- js修改页面动态添加input框显示与按钮可编辑
1. <%@ page language="java" contentType="text/html;charset=UTF-8"%> <%@ ...