SpringBean

3.1  Bean的配置

   Spring可以看作一个大型工厂,生产和管理Spring容器中的Bean。如何使用这个工厂生产和管理Bean,需要开发者将Bean配置在Spring的配置文件中。

3.2  Bean的实例化

    Spring框架实例化Bean有三种方式:构造方法实例化、静态工厂实例化和实例工厂实例化(其中,最常用的实例方法是构造方法实例化)。

1 .构造方法实例化:

(1).创建Web应用SpringBean

(2).创建BeanClass类
在SpringBean的src目录下,创建instance包,并在该包中创建BeanClass类,代码如下:

package instance;
public class BeanClass {	
	public String message;
	public BeanClass() {
		message = "构造方法实例化Bean";
	}
	public BeanClass(String s) {
		message = s;
	}
}

(3).创建配置文件

在SpringBean的src目录下,创建Spring的配置文件applicationContext.xml,在配置文件中定义一个id为constructorInstance的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">
   	<!-- 构造方法实例化Bean -->
	<bean id="constructorInstance" class="instance.BeanClass"/>
</beans>

(4).创建测试类

在SpringBean的src目录下,创建test包,并在该包下创建测试类TestInstance,代码如下:

package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import instance.BeanClass;
public class TestInstance {
	public static void main(String[] args) {
		//初始化Spring容器ApplicationContext,加载配置文件
		ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
		//测试构造方法实例化Bean
		BeanClass b1 = (BeanClass)appCon.getBean("constructorInstance");
		System.out.println(b1+ b1.message);
	}
}

结果:

3.2.2  静态工厂实例化

       使用静态工厂实例化Bean时,要求开发者在工厂类中创建一个静态方法来创建Bean的实例。配置Bean时,class属性指定静态工厂类,同时还需要使用factory-method属性指定工厂类中的静态方法。

(1).创建工厂类BeanStaticFactory

在instance包中,创建工厂类BeanStaticFactory,该类中有个静态方法来实例化对象,具体代码如下:

package instance;
public class BeanStaticFactory {
	private static BeanClass beanInstance = new BeanClass("调用静态工厂方法实例化Bean");
	public static BeanClass createInstance() {
        return beanInstance;
    }
}

(2).编辑配置文件

在配置文件applicationContext.xml中,添加如下配置代码:

<!-- 静态工厂方法实例化Bean,createInstance为静态工厂类BeanStaticFactory中的静态方法-->
<bean id="staticFactoryInstance" class="instance.BeanStaticFactory" factory-method="createInstance"/>

(3).添加测试代码

 在测试类TestInstance中,添加如下代码:

//测试静态工厂方法实例化Bean
BeanClass b2 = (BeanClass)appCon.getBean("staticFactoryInstance");
System.out.println(b2  + b2.message);

结果:

3.2.3  实例工厂实例化 

 使用实例工厂实例化Bean时,要求开发者在工厂类中创建一个实例方法来创建Bean的实例。配置Bean时,需要使用factory-bean属性指定配置的实例工厂,同时还需要factory-method属性指定实例工厂中的实例方法。

(1).创建工厂类BeanInstanceFactory

在instance包中,创建工厂类BeanInstanceFactory,该类中有个实例方法来实例化对象,具体代码如下:

package instance;
public class BeanInstanceFactory {
	public BeanClass createBeanClassInstance() {
	    return new BeanClass("调用实例工厂方法实例化Bean");
	}
}

(2).编辑配置文件

在配置文件applicationContext.xml中,添加如下配置代码:

    <bean id="myFactory" class="instance.BeanInstanceFactory"/>
<!-- 使用factory-bean属性指定配置工厂 ,
使用factory-method属性指定使用工厂中哪个方法实例化Bean-->
    <bean id="instanceFactoryInstance" factory-bean="myFactory" factory-method="createBeanClassInstance"/>

(3).添加测试代码

在测试类TestInstance中,添加如下代码:

//测试实例工厂方法实例化Bean
BeanClass b3 = (BeanClass)appCon.getBean("instanceFactoryInstance");
System.out.println(b3  + b3.message);

结果:

3.3  Bean的作用域 

作用域名称

描述

singleton

默认的作用域,使用singleton定义的Bean在Spring容器中只有一个Bean实例。

prototype

Spring容器每次获取prototype定义的Bean,容器都将创建一个新的Bean实例。

request

在一次HTTP请求中容器将返回一个Bean实例,不同的HTTP请求返回不同的Bean实例。
仅在Web Spring应用程序上下文中使用。

session

在一个HTTP Session中,容器将返回同一个Bean实例。仅在Web Spring应用程序上下文中使用。

application

为每个ServletContext对象创建一个实例,即同一个应用共享一个Bean实例。
仅在Web Spring应用程序上下文中使用。

websocket

为每个WebSocket对象创建一个Bean实例。仅在Web Spring应用程序上下文中使用。

 3.3.1  singleton作用域

       当将bean的scope设置为singleton时,Spring IoC容器仅生成和管理一个Bean实例。使用id或name获取Bean实例时,IoC容器将返回共享的Bean实例。

3.3.2  prototype作用域

  当bean的scope设置为prototype时,Spring IoC容器将为每次请求创建一个新的实例。如果将3.3.1中bean的配置修改如下

 3.4  Bean的生命周期

  1. Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化

  2. Bean实例化后对将Bean的引入和值注入到Bean的属性中

  3. 如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法

  4. 如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入

  5. 如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。

  6. 如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。

  7. 如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用

  8. 如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。

  9. 此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。

  10. 如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。

3.5  Bean的装配方式

3.5.1  基于XML配置的装配

Spring提供了两种基于XML配置的装配方式:构造方法注入和属性setter方法注入。

3.5.2  基于注解的装配

在Spring框架中定义了一系列的注解,常用注解如下所示。

  1. @Component
    该注解是一个泛化的概念,仅仅表示一个组件对象(Bean),可以作用在任何层次上。

  2. @Repository
    该注解用于将数据访问层(DAO)的类标识为Bean,即注解数据访问层Bean,其功能与@Component相同。

  3. @Service
    该注解用于标注一个业务逻辑组件类(Service层),其功能与@Component相同。

  4. @Controller
    该注解用于标注一个控制器组件类(Spring MVC的Controller),其功能与@Component相同。

  5. @Autowired
    该注解可以对类成员变量、方法及构造方法进行标注,完成自动装配的工作。通过使用@Autowired来消除setter和getter方法。默认按照Bean的类型进行装配。

  6. @Resource
    该注解与@Autowired的功能一样,区别在于该注解默认是按照名称来装配注入的,只有当找不到与名称匹配的Bean时才会按照类型来装配注入;而@Autowired默认按照Bean的类型进行装配,如果想按照名称来装配注入,则需要和@Qualifier注解一起使用。

  7. @Qualifier
    该注解与@Aitowired注解配合使用。当@Autowired注解需要按照名称来装配注入时需要和该注解一起使用,Bean的实例名称由@Qualifier注解的参数制定。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

情绪员Tim

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值