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. 几个网络模型的示例代码(BlockingModel、OverlappedModel、WSAEventSelect、CompletionRoutine)..c++

    作者的blog:猪)的网络编程世界 几个网络模型的示例代码代码包括了下面几个模型的示例:BlockingModel(阻塞模式).OverlappedModel(基于事件的重叠I/O).WSAEvent ...

  2. bzoj 3501 PA2008 Cliquers Strike Back —— 贝尔数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3501 用贝尔三角预处理贝尔数,拆模数并在 \( p \) 进制下使用公式,因为这样每次角标增 ...

  3. Python3解leetcode Symmetric Tree

    问题描述: Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). ...

  4. 五 akka streams kafka

    (转载 https://doc.akka.io/docs/akka-stream-kafka/current/home.html) 一: Akka Streams Kafka, also known ...

  5. selenium上传文件,怎么操作

    #通过os.path.abspath()方法,打开图片的绝对路径,然后,定位上传按钮,然后,send_keys()方法中,添加这个文件路径就可以了

  6. ssh无密码登录设置失败的 解决办法

    因为要安装hadoop所以需要设置ssh无密码登录,SSH的安装就不在这里介绍了: 我的系统是ubuntu15.10,开始按照网上很多的步骤去配置,最后发现登录时还要密码,登录多次也是这样的情况 最后 ...

  7. 如何增加新的PointT类型

    博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=286 为了增加新的point类型,首先需要进行定义,例如: struct M ...

  8. 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 ...

  9. UVa 10534 Wavio Sequence (LIS+暴力)

    题意:给定一个序列,求一个最长子序列,使得序列长度为奇数,并且前一半严格递增,后一半严格递减. 析:先正向和逆向分别求一次LIS,然后再枚举中间的那个数,找得最长的那个序列. 代码如下: #pragm ...

  10. NativeScript官方书籍:NativeScript in Action-用你现有技术构建移动应用程序

    大家好,我用nativescript做企业级移动应用开发一年多了.从最初只能看nativescript英文文档,到现在看到官方发布正式的书籍,感觉nativescript变得越来越好. 当然,在这个过 ...