欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring详解(二)【Ioc控制反转】

程序员文章站 2022-05-12 22:23:38
...

什么是IOC?

Spring容器Bean管理的三种方式(xml配置)

Spring容器创建对象的时机


什么是 IOC

即控制反转,它不是什么技术,而是一种设计思想。传统的创建对象的方法是直接通过 new 关键字,而 Spring 则是通过 IOC 容器来创建对象,也就是说我们将创建对象的控制权交给了 IOC 容器。用一句话来概括 IOC:IOC 让程序员不再关注怎么去创建对象,而是关注对象创建之后的操作,把对象的创建、初始化、销毁等工作交给Spring容器来做。

Spring 容器Bean管理的三种方式

第一步:搭建一个Spring环境,创建工程,引入相应jar包,创建applicationContext.xml文件,如下图:

Spring详解(二)【Ioc控制反转】

第二步:创建测试对象HelloIoc

package main.com.ysdrzp.spring.ioc;

public class HelloIoc {

	public void sayHello() {
		System.out.println("Hello Ioc!");
	}
}

传统方式创建对象的方法:new 关键字

Hello ioc = new HelloIoc();

现在看下如何通过Spring的IOC容器来管理Bean对象

第一种方法:利用默认的构造方法

<?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">
    <!--创建对象的第一种方式:利用无参构造器
        id:唯一标识符
        class:类的全类名
      -->
    <bean id="helloIoc" class="com.ys.ioc.HelloIoc" ></bean>  
    <!-- 别名属性name和bean的id属性对应 -->
    <alias name="helloIoc" alias="helloIoc2"/>
     
</beans>
package test.com.ysrzp.spring.ioc;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import main.com.ysdrzp.spring.ioc.HelloIoc;

public class HelloIocTest {

	public static void main(String[] args) {
		
		// 启动Spring容器
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		// 从Spring容器中取出数据
		HelloIoc ioc = (HelloIoc) applicationContext.getBean("ioc");
		// 通过对象调用方法
		ioc.sayHello();
		// 利用配置文件alias别名属性创建对象
		HelloIoc ioc2 = (HelloIoc) applicationContext.getBean("helloIoc");
		ioc.sayHello();
	}
}

第二种方式:利用静态工厂方法

package main.com.ysdrzp.spring.ioc;

public class HelloStaticFactory {
	
	public HelloStaticFactory() {
		System.out.println("HelloStaticFactory constructor");
	}
	
	public static HelloIoc getInstance() {
		return new HelloIoc();
	}

}
<!-- 
    创建对象的第二种方式:利用静态工厂方法 
    factory-method:静态工厂类的获取对象的静态方法
    class:静态工厂的全类名
    -->
<bean id="helloStaticFactory" lazy-init="true" factory-method="getInstance" class="main.com.ysdrzp.sping.ioc.HelloStaticFactory"></bean>
// Spring容器只负责调用静态工厂方法,而这个静态工厂方法需要我们自己实现
HelloIoc ioc = (HelloIoc) applicationContext.getBean("helloStaticFactory");
ioc.sayHello();

第三种方式:利用实例工厂方法

package main.com.ysdrzp.spring.ioc;

import main.com.ysdrzp.spring.ioc.HelloIoc;

public class HelloInstanceFactory {

	public HelloInstanceFactory() {
		System.out.println("HelloInstanceFactory constructor");
	}
	
	public HelloIoc getInstance() {
		HelloIoc instanceIoc = new HelloIoc();
		return instanceIoc;
	}
}
<!--
      创建对象的第三种方式:利用实例工厂方法
      factory-bean:指定当前Spring中包含工厂方法的beanID
      factory-method:工厂方法名称
      --> 
<bean id="instanceFactory" class="com.ys.ioc.HelloInstanceFactory"></bean> 
<bean id="instance" factory-bean="instanceFactory" factory-method="getInstance"></bean> 
HelloIoc ioc = (HelloIoc) applicationContext.getBean("helloStaticFactory");
ioc.sayHello();

 

相关标签: 控制反转