1. 程式人生 > 其它 >第1章 Spring基礎:5、Spring Bean

第1章 Spring基礎:5、Spring Bean

技術標籤:javaspring

學習目標:

Spring Bean


學習大綱:

1、Bean的例項化
2、Bean的作用域
3、Bean的初始化和銷燬


學習內容:

一、Bean的例項化

在面向物件程式設計中,想使用某個物件時,需要先例項化該物件。同樣,在Spring框架中,想使用Spring容器中的Bean,也需要例項化Bean。
Spring框架例項化Bean有三種方式:構造方法例項化、靜態工廠例項化和例項工廠例項化(其中,最常用的例項方法是構造方法例項化)。


下面通過一個例項【例1-5】ch1_5來演示Bean的例項化過程,具體步驟如下。

1.使用Eclipse建立Web應用並匯入JAR包


使用Eclipse建立一個名為ch1_5的Dynamic Web project,並將Spring的四個基礎包、第三方依賴包commons-logging-1.2.jar以及spring-aop-5.2.9.RELEASE.jar等JAR包複製到ch1_5的WEB-INF/lib目錄中。
在這裡插入圖片描述

2.建立例項化Bean的類
在ch1_5應用的src目錄下,建立包instance,並在該包中建立BeanClass、BeanInstanceFactory以及BeanStaticFactory等例項化Bean的類。

BeanClass的程式碼如下:

package instance;

public class
BeanClass { public String message; public BeanClass() { message="構造方法例項化Bean"; } public BeanClass(String s) { message=s; } }

BeanInstanceFactory的程式碼如下:

package instance;

public class BeanInstanceFactory{
	public BeanClass createBeanClassInstance() {
	return new BeanClass("呼叫例項工廠方法例項化Bean"
); } }

BeanStaticFactory的程式碼如下:

package instance;

public class BeanStaticFactory
{
	private static BeanClass beanInstance=new BeanClass("呼叫靜態工廠方法呼叫例項化Bean");
	public static BeanClass createInstance() {
		return beanInstance;
	}

}

3.建立配置類
在ch1_5應用的src目錄下,建立包config,並在該包中建立配置類JavaConfig。在該配置類中使用@Bean定義3個Bean,具體程式碼如下:

package config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import instance.BeanClass;
import instance.BeanStaticFactory;
import instance.BeanInstanceFactory;
@Configuration
public class JavaConfig
{
	/**
	 *  構造方法例項化
	 */
	@Bean(value="beanClass")
	public BeanClass getBeanClass() {
		return new BeanClass();
	}
	
	/**
	 *  靜態工廠例項化
	 */
	@Bean(value="beanStaticFactory")
	public BeanClass getBeanStaticFactory() {
		return BeanStaticFactory.createInstance();
	}
	
	/**
	 * 例項工廠例項化
	 */
	@Bean(value="beanInstanceFactory")
	public BeanClass getBeanInstanceFactory() {
		BeanInstanceFactory bi=new BeanInstanceFactory();
		return bi.createBeanClassInstance();
	}

}

4.建立測試類
在ch1_5應用的config包中,建立測試類TestBean,在該類中測試配置類定義的Bean,程式碼如下:

package config;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import instance.BeanClass;

public class TestBean
{
	public static void main(String[] args) {
		//初始化Spring容器ApplicationContext
		AnnotationConfigApplicationContext appCon=new AnnotationConfigApplicationContext(JavaConfig.class);
		BeanClass b1=(BeanClass)appCon.getBean("beanClass");
		System.out.println(b1+b1.message);
		BeanClass b2=(BeanClass)appCon.getBean("beanStaticFactory");
		System.out.println(b2+b2.message);
		BeanClass b3=(BeanClass)appCon.getBean("beanInstanceFactory");
		System.out.println(b3+b3.message);
		appCon.close();
	}

}

5.執行測試類
執行測試類TestBean的main方法,發現錯誤:
在這裡插入圖片描述
找到解決方案

執行結果如下:在這裡插入圖片描述

二、Bean的作用域

在Spring中,不僅可以完成Bean的例項化,還可以為Bean指定作用域。在Spring中為Bean的例項定義瞭如表1.2所示的作用域,通過@Scope註解來實現。
在這裡插入圖片描述


下面通過一個例項【例1-6】來演示Bean的作用域,具體步驟如下:
1.使用Eclipse建立Web應用並匯入JAR包
使用Eclipse建立一個名為ch1_6的Dynamic Web project,並將Spring的四個基礎包、第三方依賴包commons-logging-1.2.jar以及spring-aop-5.2.9.RELEASE.jar等JAR包複製到ch1_6的WEB-INF/lib目錄中。
在這裡插入圖片描述

2.編寫不同作用域的Bean
在ch1_6應用的src目錄下,建立包service,並在該包中建立SingletonService和PrototypeService類。在SingletonService類中,Bean的作用域為預設作用域singleton;在PrototypeService類中,Bean的作用域為預設作用域prototype。

SingletonService的程式碼如下:

package service;
import org.springframework.stereotype.Service;

@Service
public class SingletonService
{

}

PrototypeService的程式碼如下:

package service;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

@Service
@Scope("prototype")
public class PrototypeService
{

}

3.建立配置類
在ch1_6應用的src目錄下,建立包config,並在該包中建立配置類ScopeConfig

ScopeConfig的程式碼如下:

package config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("service")
public class ScopeConfig
{

}

4.建立測試類
在ch1_6應用的config包中,建立測試類TestScope,在該測試類中分別獲得SingletonService和PrototypeService的兩個Bean例項,具體程式碼如下:

package config;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import service.PrototypeService;
import service.SingletonService;

public class TestScope
{
	public static void main(String[] args) {
		//初始化Spring容器ApplicationContext
		AnnotationConfigApplicationContext appCon=
				new AnnotationConfigApplicationContext(ScopeConfig.class);
		SingletonService ss1=appCon.getBean(SingletonService.class);
		SingletonService ss2=appCon.getBean(SingletonService.class);
		System.out.println(ss1);
		System.out.println(ss2);
		PrototypeService ps1=appCon.getBean(PrototypeService.class);
		PrototypeService ps2=appCon.getBean(PrototypeService.class);
		System.out.println(ps1);
		System.out.println(ps2);
		appCon.close();
	} 
}

5.執行測試類
在這裡插入圖片描述

三、Bean的初始化和銷燬: 在實際工程應用中,經常需要在Bean使用之前或之後做些必要的操作,Spring對Bean的生命週期的操作提供了支援。可以使用@Bean註解的initMethod和destroyMethod屬性(相當於XML配置的init-method和destroy-method)對Bean進行初始化和銷燬。


下面通過一個例項【例1-7】來演示Bean的初始化和銷燬,具體步驟如下。

1.使用Eclipse建立Web應用並匯入JAR包
使用Eclipse建立一個名為ch1_7的Dynamic Web project,並將Spring的四個基礎包、第三方依賴包commons-logging-1.2.jar以及spring-aop-5.2.9.RELEASE.jar等JAR包複製到ch1_7的WEB-INF/lib目錄中。
在這裡插入圖片描述

2.建立Bean的類
在ch1_7應用的src目錄下,建立包service,並在該包中建立MyService類,具體程式碼如下:

package service;

public class MyService
{
  public void initService() {
  	System.out.println("initMethod");
  }
  public MyService() {
  	System.out.println("構造方法");
  }
  public void destroyService() {
  	System.out.println("destroyMethod");
  }
}

3.建立配置類
在ch1_7應用的src目錄下,建立包config,並在該包中建立配置類JavaConfig,具體程式碼如下:

package config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import service.MyService;

@Configuration
public class JavaConfig
{
	//initMethod和destroyMethod指定MyService類的initService和destroyService方法
	//在構造方法之後、銷燬之前執行
	@Bean(initMethod="initService",destroyMethod="destroyService")
	public MyService getMyService() {
		return new MyService();
	}
}

4.建立測試類
在ch1_7應用的config包中,建立測試類TestInitAndDestroy,具體程式碼如下:

package config;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import service.MyService;

public class TestInitAndDestroy
{
	public static void main(String[] args)
	{
		AnnotationConfigApplicationContext appCon=
				new AnnotationConfigApplicationContext(JavaConfig.class);
		MyService ms=appCon.getBean(MyService.class);
		appCon.close();
	}

}

5.執行測試類

在這裡插入圖片描述


學習時間:


學習產出:

1、 技術筆記 1 遍
2、CSDN 技術部落格 1 篇