Spring——(三)生命周期

2018-10-27 23:38:00     

一、摘要

  • Spring容器生命周期
  • BeanFactory类
  • ApplicationContext类

二、Spring生命周期

1.创建SpringTest02工程,在service包下新建HelloSpring类,如下代码:

	package service;
	
	public class HelloSpring {
	
		public HelloSpring() {
			System.out.println("构造方法。。。");
		}
	
		// 定义初始化方法
		public void init() {
			System.out.println("init...");
		}
	
		public void hello() {
			System.out.println("hello...");
		}
	
		// 定义销毁方法
		public void destory() {
			System.out.println("destory...");
		}
	}

2.配置application-config.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:context="http://www.springframework.org/schema/context"
		xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context.xsd">
		<!-- name:唯一标识符,class:类的全类名 init-method:初始化方法 destroy-method:销毁方法-->
		<bean name="helloSpring" class="service.HelloSpring" init-method="init" destroy-method="destory"></bean>
	</beans>

  1. test包下新建TestSpring测试类,代码如下:
package test;    
import org.junit.Test;  
import org.springframework.context.ApplicationContext;  
import org.springframework.context.support.ClassPathXmlApplicationContext;    
import service.HelloSpring;    

public class TestSpring {  	
	@Test  	
	public void cycle() {  		
		// 从资源文件启动Spring Ioc容器并做初始化  		
		ApplicationContext context = new ClassPathXmlApplicationContext("spring/application-config.xml");  		
		// 创建Spring Ioc容器对象,按照名字和类型拿 bean  		
		HelloSpring hs = context.getBean("helloSpring", HelloSpring.class);
		// 通过对象调用方法  		
		hs.hello();  		
		// 销毁spring容器  		
		((ClassPathXmlApplicationContext) context).close();  	
	}  
}  

4.用JUnit测试cycle方法,得到以下结果:

构造方法。。。
init...
hello...
destory...
  • 通过断点调试,当程序执行完ApplicationContext context = new ClassPathXmlApplicationContext("spring/application-config.xml")的时候,打印出构造方法。。。 init...。继续往下执行,当程序执行完hs.hello()的时候,打印出hello...。继续往下执行,当程序执行完((ClassPathXmlApplicationContext) context).close()的时候,打印出destory...。至此,整个Spring容器执行完毕。

5.修改application-config.xml文件,新增lazy-init="true"延时加载(这个属性配置文件默认为false,现把他修改为ture)。配置如下:

<bean name="helloSpring" class="service.HelloSpring" 
init-method="init" destroy-method="destory" lazy-init="true"></bean>
  • 通过断点调试,当程序执行完ApplicationContext context = new ClassPathXmlApplicationContext("spring/application-config.xml")的时候,无任何打印结果,当程序执行到HelloSpring hs = context.getBean("helloSpring", HelloSpring.class)的时候才打印出构造方法。。。 init...
  • 因此得到以下结果:
  • 如果lazy-init为"default/false"在启动spring容器时创建对象(默认情况。
  • 如果lazy-init为"true",在context.getBean时才要创建对象.可以减少内存的消耗
  • scope="singleton"在单例模式下,启动 spring 容器,便会创建对象;scope="prototype"在多例模式下,启动容器并不会创建对象,获得 bean 的时候才会创建对象

6.修改application-config.xml文件,新增scope="prototype"多例模式(这个属性配置文件默认为singleton,现把他修改为prototype)。配置如下:

<bean name="helloSpring" class="service.HelloSpring" 
init-method="init" destroy-method="destory" scope="prototype"></bean>
  • 通过断点调试,发现过程和延时加载是一样的。启动容器并不会创建对象,获得 bean的时候才会创建对象。但是scope="prototype"时,调用close()方法时是不会调用destroy方法的

三、Spring容器设计

  • 主要接口:
  • BeanFactory
  • ApplicationContext
  • 通过代码跟踪:发现ApplicationContextBeanFactory的子类,且BeanFactory是最底层接口,而ApplicationContext是对BeanFactory功能做了许多的扩展,所以在绝大部分的工作场景下,都会使用 ApplicationContext作为Spring IoC容器。

  1. 其中BeanFactory底下的getBean对应了多个方法来获取配置给 Spring IoC 容器的 Bean。推荐使用按照名字和类型拿 bean: HelloSpring hs = context.getBean("helloSpring", HelloSpring.class);
  2. 通过代码跟踪可以看到ApplicationContext接口扩展了许许多多的接口,因此它的功能十分强大,所以在实际应用中常常会使用到的是ApplicationContext 接口,因为BeanFactory的方法和功能较少,而ApplicationContext的方法和功能较多。
  • 常见实现类:ClassPathXmlApplicationContext读取classpath中的资源:     ApplicationContext context = new ClassPathXmlApplicationContext("spring/application-config.xml");
  • 常见实现类:FileSystemXmlApplicationContext读取指定路径的资源:     ApplicationContext context = new FileSystemXmlApplicationContext("D:/application-config.xml");

四、总结

  1. Spring的生命周期:
  • springIOC容器利用无参构造器创建对象
  • 调用bean的初始化方法(init)
  • 调用bean的id
  • springIOC容器关闭时调用bean的销毁方法(destory)
  1. BeanFactory:
  • BeanFactory是Spring中最底层的接口,只提供了最简单的IoC功能,负责配置,创建和管理bean
  • 在应用中,一般不使用BeanFactory而推荐使用ApplicationContext应用上下文
  1. ApplicationContext:
  • 继承了BeanFactory拥有了基本的 IoC 功能
  • 支持国际化
  • 支持消息机制
  • 支持统一的资源加载
  • 支持AOP功能

ps:本篇博客源码下载链接:https://pan.baidu.com/s/1P-EcKRMgEWCZPdujefmWnA 密码:l7wa
Spring——(二)IOC控制反转/DI依赖注入

一、理解IOC和DIIOC(即控制反转)它不是什么技术,而是一种设计思想。传统创建对象的方式是通过new关键字,而Spring则是通过IOC容器来创建对象。IOC让程序员不在关注怎么去创建对象,而是关注与对象创建之后的操作,把对象的创建、初始化、销毁等工作交给Spring容器来做。IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:别找我们,我们找你即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找通常情况下,我们在家喝果汁,首先要买水果,买果汁机,然后自己榨成果汁,整个过程复杂且繁琐。如果去饮料店喝果汁呢?只需要告诉饮料店我需要什么果汁,果汁的创建过程等工作交给饮料店来做,至于果汁是怎么做的我不管,我只需要喝到果汁就行,当果汁有问题时,我们就向饮料店抛出异常。此时饮料店扮演的角色就是Spring IOC容器DI(依赖注入)比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢?Java

Spring——(四)注解方式 IOC/DI

一、摘要前面讲解IOC DI都是通过xml文件进行配置的,这种配置对小型项目是看不出什么问题,但是在大型项目上,就会觉得配置xml文件臃肿又麻烦了。因此,不再推荐使用xml的方式去装配Bean而是考虑使用注解的方式去装配Bean两种注解配置:自动装配:对注入对象行为的注解组件扫描:对Bean的注解二、自动装配 导入上一篇博客Spring——(二)IOC控制反转/DI依赖注入的源代码作为这篇博客的继续 修改xml配置文件,在xml配置文件中加上<context:annotation-config/>并且注释掉DI对象注入,如下配置:在Student实体类中的private Teacher teacher;前加上@Autowired注解,代码如下:package entity; import org.springframework.beans.factory.annotation.Autowired; public class Student { private int id; private String name; @Autowired private

 发表评论