spring中创建bean对象时多例和单例的区别

spring中创建bean对象时多例和单例的区别,第1张

在<bean>标签中,加上scope属性来控制对象容器中的数量。

1、scope

=

singlton

单例模式,对象在容器中全局唯一,在IOC容器初始化的时候该对象就会被创建。

2、scope

=

prototype

多例模式,在每一次调用getBean的时候IOC容器才会创建该对象的实体,并且每次创建都是不同的对象。

默认的是单例的,如果不想单例需要如下配置:

<bean

id="user"

class=""

singleton="false"/>

singleton就是配置这个bean是否是单例的,如果不写,就是默认值true。

在标签中,加上scope属性来控制对象在容器中的数量

(1)scope

=

singlton

单例模式,对象在容器中全局唯一,在IOC容器初始化的时候该对象就会被创建

(2)scope

=

prototype

多例模式,在每一次调用getBean的时候IOC容器才会创建该对象的实体。

PO(persistant object) 持久对象

在o/r映射的时候出现的概念,如果没有o/r映射,没有这个概念存在了。通常对应数据模型(数据库),本身还有部分业务逻辑的处理。可以看成是与数据库中的表相映射的java对象。最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合。PO中应该不包含任何对数据库的 *** 作。

VO(value object) 值对象

通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要

TO(Transfer Object),数据传输对象

在应用程序不同tie(关系)之间传输的对象

BO(business object) 业务对象

从业务模型的角度看,见UML元件领域模型中的领域对象。封装业务逻辑的java对象,通过调用DAO方法,结合PO,VO进行业务 *** 作。

POJO(plain ordinary java object) 简单无规则java对象

纯的传统意义的java对象。就是说在一些Object/Relation Mapping工具中,能够做到维护数据库表记录的persisent object完全是一个符合Java Bean规范的纯Java对象,没有增加别的属性和方法。

DAO(data access object) 数据访问对象

是一个sun的一个标准j2ee设计模式,这个模式中有个接口就是DAO,它负持久层的 *** 作。为业务层提供接口。此对象用于访问数据库。通常和PO结合使用,DAO中包含了各种数据库的 *** 作方法。通过它的方法,结合PO对数据库进行相关的 *** 作。夹在业务逻辑与数据库资源中间。配合VO, 提供数据库的CRUD *** 作…

O/R Mapper 对象/关系 映射

定义好所有的mapping之后,这个O/R Mapper可以帮我们做很多的工作。通过这些mappings,这个O/R Mapper可以生成所有的关于对象保存,删除,读取的SQL语句,不再需要写那么多行的DAL代码了。

方法一:在初始化时保存ApplicationContext对象 方法二:通过Spring提供的utils类获取ApplicationContext对象 方法三:继承自抽象类ApplicationObjectSupport 方法四:继承自抽象类WebApplicationObjectSupport 方法五:实现接口ApplicationContextAware 方法六:通过Spring提供的ContextLoader

获取spring中bean的方式总结:

方法一:在初始化时保存ApplicationContext对象

[html] view plain copy

ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContextxml");

acgetBean("beanId");

说明:这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。

方法二:通过Spring提供的工具类获取ApplicationContext对象

[java] view plain copy

ApplicationContext ac1 = WebApplicationContextUtilsgetRequiredWebApplicationContext(ServletContext sc);

ApplicationContext ac2 = WebApplicationContextUtilsgetWebApplicationContext(ServletContext sc);

ac1getBean("beanId");

ac2getBean("beanId");

说明:这种方式适合于采用Spring框架的B/S系统,通过ServletContext对象获取ApplicationContext对象,然后在通过它获取需要的类实例。上面两个工具方式的区别是,前者在获取失败时抛出异常,后者返回null。

方法三:继承自抽象类ApplicationObjectSupport

说明:抽象类ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获取ApplicationContext。

Spring初始化时,会通过该抽象类的setApplicationContext(ApplicationContext context)方法将ApplicationContext 对象注入。

方法四:继承自抽象类WebApplicationObjectSupport

说明:类似上面方法,调用getWebApplicationContext()获取WebApplicationContext

方法五:实现接口ApplicationContextAware

说明:实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象。Spring初始化时,会通过该方法将ApplicationContext对象注入。

以下是实现ApplicationContextAware接口方式的代码,前面两种方法类似:

[java] view plain copy

package comifabooMiomOmmgutil;

import orgspringframeworkcontextApplicationContext;

import orgspringframeworkcontextApplicationContextAware;

public class SpringContextUtil implements ApplicationContextAware {

private static ApplicationContext applicationContext;

/

实现ApplicationContextAware接口的context注入函数, 将其存入静态变量

/

public void setApplicationContext(ApplicationContext applicationContext) {

SpringContextUtilapplicationContext = applicationContext; // NOSONAR

}

/

取得存储在静态变量中的ApplicationContext

/

public static ApplicationContext getApplicationContext() {

checkApplicationContext();

return applicationContext;

}

/

从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型

/

@SuppressWarnings("unchecked")

public static <T> T getBean(String name) {

checkApplicationContext();

return (T) applicationContextgetBean(name);

}

/

从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型

/

@SuppressWarnings("unchecked")

public static <T> T getBean(Class<T> clazz) {

checkApplicationContext();

return (T) applicationContextgetBeansOfType(clazz);

}

/

清除applicationContext静态变量

/

public static void cleanApplicationContext() {

applicationContext = null;

}

private static void checkApplicationContext() {

if (applicationContext == null) {

throw new IllegalStateException("applicaitonContext未注入,请在applicationContextxml中定义SpringContextHolder");

}

}

}

虽然,spring提供的后三种方法可以实现在普通的类中继承或实现相应的类或接口来获取spring 的ApplicationContext对象,但是在使用是一定要注意实现了这些类或接口的普通java类一定要在Spring 的配置文件applicationContextxml文件中进行配置。否则获取的ApplicationContext对象将为null。

方法六:通过Spring提供的ContextLoader

[java] view plain copy

WebApplicationContext wac = ContextLoadergetCurrentWebApplicationContext();

wacgetBean(beanID);

最后提供一种不依赖于servlet,不需要注入的方式。但是需要注意一点,在服务器启动时,Spring容器初始化时,不能通过以下方法获取Spring 容器,细节可以查看spring源码orgspringframeworkwebcontextContextLoader。

以上就是关于spring中创建bean对象时多例和单例的区别全部的内容,包括:spring中创建bean对象时多例和单例的区别、java 里的bean与bean之间的对比、如何获取spring的bean等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10137491.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存