spring——IOC控制反转

一.IOC简介

IOC inversion of controller(控制反转)
spring的控制反转:

  • 是一种设计思想。
  • 把对象的创建,初始化,销毁等工作交给spring ioc容器,由spring ioc容器控制对象的生命周期。

二.spring创建对象的三种方式

spring创建对象的三种方式参考

创建com.jp.domain包,存放JavaBean对象

package com.jp.domain;
public class Person {
	public String name;
	//无参构造
	public Person(){}
	//有参构造
	public Person(String name){this.name=name;}
	public void talk(){
		System.out.println("讲话...");
	}
}

applicationContext.xml,总的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" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- applicationContext.xml文件是主文件 -->
	<!-- 导入applicationContext_helloworld.xml文件 -->
	<import resource="com/jp/applicationContext_helloworld.xml"/>
	<!-- 导入applicationContext_person.xml文件 -->
	<import resource="com/jp/domain/applicationContext_person.xml"/>
</beans>

1.无参构造

applicationContext_person.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" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- 无参构造 -->
	<bean id="p" class="com.jp.domain.Person"></bean>
</beans>

测试类Demo.java

package com.jp.domain;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Demo {
	//方式1:spring通过默认的构造函数创建对象
	@Test
	public void test1(){
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
		Object o = ac.getBean("p");
		Person p=(Person)o;
		System.out.println(p);
	}
}

2.静态工厂

创建工厂类,BeanFactory.java

package com.jp.domain;

public class BeanFactory {
	//静态工厂,不用创建对象,直接类名.方法使用
	public static Person getInstance(){
		return new Person();
	}
}

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" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- 静态工厂 -->
	<bean id="factory" class="com.jp.domain.BeanFactory" factory-method="getInstance"></bean>
</beans>

测试类Demo.java

package com.jp.domain;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Demo {
	//方式2:spring通过静态工厂创建对象
	@Test
	public void test2(){
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
		Person p = (Person)ac.getBean("factory");
		System.out.println(p);
	}
}

3.实例工厂

创建工厂类,BeanFactory.java

package com.jp.domain;

public class BeanFactory {
	//实例化工厂,要先创建BeanFactory对象,才能调用这个方法
	public Person getInstance(){
		return new Person();
	}
}

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" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- 实例工厂 -->
	<!-- factory-bean要与上面的id值一样,下面的id值可以随便写 -->
	<bean id="factory" class="com.jp.domain.BeanFactory"></bean>
	<bean id="f" factory-bean="factory" factory-method="getInstance"></bean>
</beans>

测试类Demo.java

package com.jp.domain;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Demo {
	//方式3:spring通过实例化工厂创建对象
	@Test
	public void test3(){
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
		BeanFactory factory = (BeanFactory)ac.getBean("factory");
		System.out.println(factory);
		Person p =(Person)ac.getBean("f");
		System.out.println(p);
	}
}

三.Bean标签

1.bean标签的scope属性

Demo.java

package com.jp.scope;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.jp.domain.Person;

public class Demo {
	@Test
	public void test1(){
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
		Person p1 = (Person) ac.getBean("p");
		System.out.println(p1);
		Person p2 = (Person) ac.getBean("p");
		System.out.println(p2);
		Person p3 = (Person) ac.getBean("p");
		System.out.println(p3);
	}
}

①.singleton

单例,scope属性的默认值。代表在spring ioc容器中只创建一个bean实例,每次都调用这一个对象。当使用单例时,对象中的List集合等存储容器放在成员位置会有线程安全问题,但可以放到某个函数中,即局部位置。

applicationContext_scope.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" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
	<bean id="p" class="com.jp.domain.Person" scope="singleton"></bean>
</beans>

Demo.java的三个结果相同

②.prototype多例

多例,每次从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" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
	<bean id="p" class="com.jp.domain.Person" scope="prototype"></bean>
</beans>

Demo.java的三个结果不相同

③.request

用在web开发中,将bean对象request.setAttribute()存储到request作用域中

④.session

用在web开发中,将bean对象session.setAttribute()存储到session作用域中

2.bean创建生命周期

①.创建对象

spring容器通过默认的构造函数创建对象

②.调用初始化方法

init-method=“init”

③.调用工程方法

talk()

④.调用销毁方法

estory-method=“destory”

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
	<bean id="person" class="com.jp.domain.Person" lazy-init="true" init-method="init" destroy-method="destroy"></bean>
</beans>
package com.jp.domain;

public class Person {
	public String name;
	public Person(){
		System.out.println("Person对象创建了...");
	}
	public Person(String name){
		this.name=name;
	}
	public void talk(){
		System.out.println("讲话...");
	}
	public void init(){
		System.out.println("初始化方法...");
	}
	public void destroy(){
		System.out.println("销毁方法...");
	}
}
package com.jp.life;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.jp.domain.Person;

public class Demo {
	@Test
	public void test1(){
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
		Person p=(Person)ac.getBean("person");
		p.talk();
	}
}
  • lazy-init属性
    lazy-init="false"或者"default"或者不写
    spring容器一启动,对象就创建完毕(调用空的构造方法)
    lazy-init=“true”
    调用spring容器调用getBean方法时,对象才创建(调用空的构造方法)
  • init-method=“Person对象中的初始化方法名”;
  • destroy-method=“Person对象中的销毁方法名”;

版权声明:本文为weixin_43908649原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。