zl程序教程

您现在的位置是:首页 >  后端

当前栏目

[Spring] 声明Bean

Spring bean 声明
2023-09-14 08:59:41 时间
1 创建spring配置

spring容器提供了两种配置bean的方式,使用xml文件或java注解。一个典型的spring 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-3.0.xsd" 

 /beans 

在 beans 元素内,可以放置所有的spring配置信息,包括 bean 元素的声明。spring
的核心框架自带了10个命名空间配置,如下:


context 为配置spring应用上下文提供了配置元素,包括自动检测和自动装备bean、注入非spring直接管理的对象
public void perform() throws PerformanceException { System.out.println("JUGGLING " + beanBags + " BEANBAGS"); }

Juggler类默认可以同时抛3个豆袋子,但是也可以通过构造器设置豆袋子的个数。
声明一个bean:

 bean id="duke" / 

当spring加载该bean时,spring将使用默认的构造器来实例化duke bean。实际上,duke会使用如下代码来创建:

new com.springinaction.springidol.Juggler();

为了给duke一个排练机会,可以使用如下代码加载spring上下文:

ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-idol.xml");

Performer performer = (Performer)ctx.getBean("duke");

performer.perform();

其中,spring-idol.xml文件放置于resources目录下。

3 通过构造器注入

下面的xml声明了duke成为一个可以同时抛15个豆袋子的杂技师:

 bean id="duke" 

 constructor-arg value="15" / 

 /bean 

通过构造器注入对象引用
一个会朗诵诗歌的杂技师:

package com.springinaction.springidol;

public class PoeticJuggler extends Juggler {

 private Poem poem;

 public PoeticJuggler(Poem poem) {

 this.poem = poem;

 public PoeticJuggler(int beanBags, Poem poem) {

 super(beanBags);

 this.poem = poem;

 public void perform() throws PerformanceException {

 super.perform();

 System.out.println("While reciting...");

 poem.recite();

}

朗诵诗歌接口如下:

package com.springinaction.springidol;

public interface Poem {

 void recite();

}

Sonnet29实现了Poem接口:

package com.springinaction.springidol;

public class Sonnet29 implements Poem {

 private static String[] LINES = {

 "line1: --------",

 "line2: --------",

 "line3: --------",

 "line4: --------",

 "line5: --------",

 public Sonnet29() {}

 public void recite() {

 for (int i = 0; i LINES.length; i++) {

 System.out.println(LINES[i]);

}

可以使用如下配置将Sonnet29声明为一个spring bean:

 bean id="sonnet29" / 

有了poem之后要做的就是将poem赋予duke,将duke的声明如下:

 bean id="poeticDuke" 

 constructor-arg value="25" / 

 constructor-arg ref="sonnet29" / 

 /bean 

对于不是简单类型的参数,不能使用value属性进行赋值,而需要使用来传递bean引用。

如果想声明的bean没有一个公开的构造函数,则可以通过装配通过工厂方法创建的bean。

通过工厂方法创建bean
有时候静态工厂方法是实例化对象的唯一方法,spring支持通过 bean 元素的factory-method属性来装配工厂创建的bean。

Stage类是一个典型的单例类:

package com.springinaction.springidol;

public class Stage {

 private Stage() {}

 private static class StageSingletonHolder{

 static Stage instance = new Stage();

 public static Stage getInstance() {

 return StageSingletonHolder.instance;

}

为了在spring上下文中将Stage配置为bean,可以像下面的配置来使用factory-method:

 bean id="theStage" factory-method="getInstance" / 

如果要装配的对象需要通过静态方法来创建,那么这种配置方式可以适用于任何场景。

4 Bean的作用域

当在spring中配置bean时,我们可以为bean声明一个作用域。为了让spring在每次请求时都为bean产生一个新的实例,我们只需要配置bean的scope属性为prototype即可。例如,把演唱会门票声明为spring bean:

 bean id="ticket" scope="prototype" / 

spring的bean作用域允许用户配置所创建的bean属于哪一种作用域,而无需在bean的实现里硬编码作用域规则。


request 在一次HTTP请求中,每个bean定义对应一个实例。该作用域仅在基于web的spring上下文(例如spring mvc)中才有效
session 在一个HTTP Session中,每个bean对应一个实例。该作用域仅在基于web的spring上下文(例如spring mvc)中才有效
global-session 在一个全局HTTP Session中,每个bean定义一个实例。该作用域仅在Protlet上下文中才有效。

注意:spring有关单例的概念限于spring上下文的范围内,不像真正的单例,在每个类加载器中保证只有一个实例。spring的单例只能保证在每个应用上下文中只有一个bean的实例。没有人能够阻止你使用传统的方式实话同一个bean,甚至你可以定义几个 bean 声明来实例化同一个Bean。

5 初始化和销毁bean

为bean定义初始化和销毁操作,只需要使用init-method和destroy-method参数来配置bean元素,init-method属性指定了在初始化bean时要调用的方法,类似的,destroy-method属性指定了bean从容器移除之前要调用的方法。

例如,声明一个bean,实现在开始前关灯,在结束后关灯。

 bean id="autitorium" init-method="turnOnLights"

 destroy-mothod="turnOffLights" / 

当我们使用这种方法配置时,auditorium bean实例化后会立即调用turnOnLights()方法,在该bean从容器移除和销毁前,会调用turnOffLights()方法将灯关闭。

为bean定义初始化和销毁的另一种可选方式是,让bean实现spring的InitalizingBean和DisposableBean接口。spring以特殊的方式对待实现这两个接口的bean,允许它们进入bean的声明周期。实现这些接口的缺点是bean与spring的API产生了耦合。唯一可能使用spring的生命周期接口的场景是,开发一个明确在spring容器内使用的bean。

默认的init-method和destroy-method
如果在上下文中定义的很多bean都拥有相同名字的初始化方法和销毁方法,可以使用 beans 元素的default-init-method和default-destroy-method属性:

 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-3.0.xsd"

 default-init-method="turnOnLights"

 default-destroy-method="turnOffLights" 


转载:http://blog.csdn.net/foreverling/article/details/50878599


聊透Spring bean的生命周期 在对于Spring的所有解读中,Bean的生命周期都可谓是重中之重,甚至还有人称Spring就是个管理Bean的容器。Bean的生命周期之所以这么重要,被反复提及,是因为Spring的核心能力,比如对象创建(IOC)、属性注入(DI)、初始化方法的调用、代理对象的生成(AOP)等功能的实现,都是在bean的生命周期中完成的。清楚了bean的生命周期,我们才能知道Spring的神奇魔法究竟是什么,是怎么一步步赋能,让原本普通的java对象,最终变成拥有超能力的bean的。
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载