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的使用的更多相关文章

  1. 学习AOP之透过Spring的Ioc理解Advisor

    花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...

  2. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  3. 深入理解DIP、IoC、DI以及IoC容器

    摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...

  4. 自己实现简单Spring Ioc

    IoC则是一种 软件设计模式,简单来说Spring通过工厂+反射来实现IoC. 原理简单说明: 其实就是通过解析xml文件,通过反射创建出我们所需要的bean,再将这些bean挨个放到集合中,然后对外 ...

  5. 使用Microsoft的IoC框架:Unity来对.NET应用进行解耦

    1.IoC/DI简介 IoC 即 Inversion of Control,DI 即 Dependency Injection,前一个中文含义为控制反转,后一个译为依赖注入,可以理解成一种编程模式,详 ...

  6. DIP原则、IoC以及DI

    一.DIP原则 高层模块不应该依赖于底层模块,二者都应该依赖于抽象. 抽象不应该依赖于细节,细节应该依赖于抽象. 该原则理解起来稍微有点抽象,我们可以将该原则通俗的理解为:"依赖于抽象&qu ...

  7. 【初探Spring】------Spring IOC(三):初始化过程---Resource定位

    我们知道Spring的IoC起到了一个容器的作用,其中装得都是各种各样的Bean.同时在我们刚刚开始学习Spring的时候都是通过xml文件来定义Bean,Spring会某种方式加载这些xml文件,然 ...

  8. 【初探Spring】------Spring IOC(二):初始化过程---简介

    首先我们先来看看如下一段代码 ClassPathResource resource = new ClassPathResource("bean.xml"); DefaultList ...

  9. 【初探Spring】------Spring IOC(一)

    IOC:Inversion of Control(控制反转).IOC它所体现的并不是一种技术,而是一种思想,一种将设计好的对象交给容器来管理的思想.IOC的核心思想就体现在控制.反转这两个词上面,要理 ...

  10. .NET里简易实现IoC

    .NET里简易实现IoC 前言 在前面的篇幅中对依赖倒置原则和IoC框架的使用只是做了个简单的介绍,并没有很详细的去演示,可能有的朋友还是区分不了依赖倒置.依赖注入.控制反转这几个名词,或许知道的也只 ...

随机推荐

  1. ACM学习历程—POJ1088 滑雪(dp && 记忆化搜索)

    Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...

  2. 【Lintcode】036.Reverse Linked List II

    题目: Reverse a linked list from position m to n. Given m, n satisfy the following condition: 1 ≤ m ≤ ...

  3. Django 模板 自定义context_processors

    Django版本 1.8.4 为什么要自定义context_processors 在做博客的过程中,在浏览排行,评论排行,标签,文章归档,友情链接等内容每一个显示页面都是要显示的.如果在每一个view ...

  4. ubuntu下 修改主机名

    sudo gedit /etc/hostname 写入: sudo gedit /etc/hosts

  5. openstack开发环境搭建

    1       目的 让linux下的openstack代码能在windows上面实现同步开发. 2       目标 使用samba实现window与Linux的文件共享. 3       实验环境 ...

  6. 10天彻底搞定-webpack4.0

    本机存放的路径: F:\教程\10天彻底搞定-webpack4.0 联想电脑代码存放的路径: D:\MyDemos\webpack4 10天彻底搞定-webpack4.0 1.webpack课程介绍 ...

  7. js中“||”和“&&”的高级用法

    例1:用于赋值&&:从左往右依次判断,当当前值为true则继续,为false则返回此值(是返回未转换为布尔值时的原值哦)|| : 从左往右依次判断,当当前值为false则继续,为tru ...

  8. javascript数组对象

    constructor属性 返回数组对象原型 var arr = [1,2,3,4,5]; arr.constructor //输出 function Array() { [native code] ...

  9. 51Nod - 1640 天气晴朗的魔法 大+小生成树(最大值最小)/二分

    天气晴朗的魔法 这样阴沉的天气持续下去,我们不免担心起他的健康.   51nod魔法学校近日开展了主题为“天气晴朗”的魔法交流活动.   N名魔法师按阵法站好,之后选取N - 1条魔法链将所有魔法师的 ...

  10. Sybase.在PowerDesigner中如何添加-约束

    Sybase.在PowerDesigner中如何添加-约束 资料 2010-06-23 08:57:09 阅读21 评论0   字号:大中小 订阅 唯一约束 唯一约束与创建唯一索引基本上是一回事,因为 ...