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文件,如下图:
第二步:创建测试对象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();