文章目录

  • 一、创建bean的三种方式
  • 1、使用默认构造函数创建
  • 2、使用普通工厂的方法创建对象
  • 3、使用工厂模式 创建对象
  • 二、bean对象的作用范围
  • 1、bean.xml
  • 2、测试类
  • 三、bean对象的生命周期
  • 1、bean.xml
  • 2、业务层实现类
  • 3、测试类

  •  1.创建bean的三种方式
  •  2.bean对象的作用范围
  •  3.bean对象的生命周期

一、创建bean的三种方式

1、使用默认构造函数创建

<!-- 第一种方式:使用默认构造函数创建。
	在spring的配置文件中使用bean标签,配置id和class属性之后,且没有其他属性和标签时。
	采用的就是默认构造函数创建bean对象。
	注意:如果类中没有默认构造函数,则对象无法创建。
-->
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"></bean>
public class AccountServiceImpl implements IAccountService{
	
	public AccountServiceImpl() {
		System.out.println("对象创建了");
	}
	public AccountServiceImpl(String name) {
		System.out.println("对象创建了String name");
	}
	public void saveAccount() {
		System.out.println("AccountServiceImpl.saveAccount()");
	}
}

2、使用普通工厂的方法创建对象

<!-- 第二种方式:使用普通工厂的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)
     	此种方式是:
			先把工厂的创建交给 spring 来管理。
			然后在使用工厂的 bean 来调用里面的方法
			factory-bean 属性:用于指定实例工厂 bean 的 id。
			factory-method 属性:用于指定实例工厂中创建对象的方法。
        -->
   <bean id="instanceFactory" class="com.itheima.factory.InstanceFactory"></bean>
   <bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>
/**
  *	 第二种方式:spring 管理实例工厂-使用实例工厂的方法创建对象
  * 	模拟一个实例工厂,创建业务层实现类
  *	 	此工厂创建对象,必须现有工厂实例对象,再调用方法
  */
public class InstanceFactory {
	public IAccountService getAccountService() {
		return new AccountServiceImpl();
	}
}

如何改变spring管理的对象的成员属性值 spring默认管理bean对象的方式_xml

3、使用工厂模式 创建对象

<!-- 第三种方式:使用工厂模式 创建对象(使用某个类中的静态方法创建对象,并存入spring容器)
    	此种方式是:
			使用 StaticFactory 类中的静态方法 createAccountService 创建对象,并存入 spring 容器
			id 属性:指定 bean 的 id,用于从容器中获取
			class 属性:指定静态工厂的全限定类名
			factory-method 属性:指定生产对象的静态方法
    -->
    <bean id="accountService" factory-method="getAccountService" class="com.itheima.factory.StaticFactory"></bean>
/**
 * 	第三种方式:spring 管理静态工厂-使用静态工厂的方法创建对象
 * 	模拟一个静态工厂,创建业务层实现类
 */
public class StaticFactory {
	public static IAccountService getAccountService() {
		return new AccountServiceImpl();
	}
}

二、bean对象的作用范围

1、bean.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来管理 -->
	  <!-- bean的作用范围调整 
	bean标签的scope属性:
		作用:用于指定bean的作用范围
		取值:常用的就是单例和多例的
			singleton:单例的(默认值)
			prototype:多例的(创建两次对象)
			
			request:作用于web应用的请求范围
			session:作用于web应用的会话范围
			global-session:
				作用于集群环境的会话范围(全局会话范围),
				当不是集群环境时,它就是session
					
	<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl" scope="singleton"></bean>--> 
	
	<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl" scope="prototype"></bean>
</beans>

2、测试类

public class Client {
	
	public static void main(String[] args) {
		//1、获取核心容器对象
		ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
		//2、根据id获取bean对象
		IAccountService as = (IAccountService)ac.getBean("accountService");
		IAccountService as2 = (IAccountService)ac.getBean("accountService");
		System.out.println(as==as2);
		/**
		 	多例------>prototype:false
		 	单例------>singleton:true
		 	
		 	singleton:单例的(默认值)
			prototype:多例的(创建两次对象构造方法执行两次)
		 */
		//as.saveAccount();
	}
}

如何改变spring管理的对象的成员属性值 spring默认管理bean对象的方式_spring_02

三、bean对象的生命周期

1、bean.xml

<!-- bean对象的声明周期			
	(1)单例对象singleton	总结:单例对象的生命周期和容器相同
		出生:当容器创建时,对象出生
		活着:只要容器还在,对象一直活着
		死亡:容器销毁,对象死亡
	
	(2)多例对象:prototype
		出生:当我们使用对象时spring框架为我们创建
		活着:对象在使用过程中就一直活着。
		死亡:当对象长时间不用且没有别的对象引用时,(由java的垃圾回收器回收。)
	(3)方法:属性:init-method  destroy-method
		单例:(立即加载)在加载配置文件时加载。
		多例:(延迟加载)在使用对象时加载。
		
-->	       
     <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"
      scope="singleton" init-method="init" destroy-method="destroy"></bean>

2、业务层实现类

public class AccountServiceImpl implements IAccountService{
	
	public AccountServiceImpl() {
		System.out.println("空构造方法");
	}
	public AccountServiceImpl(String name) {
		System.out.println("对象创建了String name");
	}
	public void saveAccount() {
		System.out.println("servlce中的saveAccount方法执行了~~~");
	}
	
	//初始化方法
	public void init() {
		System.out.println("servlce中的init(初始化)方法执行了~~~");
	}
	//销毁方法
	public void destroy() {
		System.out.println("servlce中的destory(销毁)方法执行了~~~");
	}
}

3、测试类

public class Client {

	public static void main(String[] args) {
		//1、获取核心容器对象
		//ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
		//ApplicationContext没有关闭的方法,看不到容器销毁
		//ClassPathXmlApplicationContext有可以看到容器销毁
		ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
	
		//2、根据id获取bean对象
		IAccountService as = (IAccountService)ac.getBean("accountService");
		as.saveAccount();
		
		//手动关闭容器
		ac.close();
	}
}