1、singleton作用域
当一个bean的作用域设置为singleton,那么Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。换言之,当把一个bean定义设置为singleton作用域时,Spring IOC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例,这里要注意的是singleton作用域和GOF设计模式中的单例是完全不同的,单例设计模式表示一个ClassLoader中只有一个class存在,而这里的singleton则表示一个容器对应一个bean,也就是说当一个bean被标识为singleton时候,spring的IOC容器中只会存在一个该bean。
配置实例:
<bean id="role" class="springchapter2maryGameRole" scope="singleton"/>
或者
<bean id="role" class="springchapter2maryGameRole" singleton="true"/>
2、prototype
prototype作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)都会产生一个新的bean实例,相当于一个new的 *** 作,对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个 prototype bean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责。(让Spring容器释放被singleton作用域bean占用资源的一种可行方式是,通过使用 bean的后置处理器,该处理器持有要被清除的bean的引用。)
配置实例:
<bean id="role" class="springchapter2maryGameRole" scope="prototype"/>
或者
<beanid="role" class="springchapter2maryGameRole" singleton="false"/>
3、request
request表示该针对每一次>
如何取得Spring管理的bean (请用第3种方法):
1、servlet方式加载时,
webxml
Xml代码
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>orgspringframeworkwebservletDispatcherServlet</servlet-class>
<init-param>
<param-name>contExtConfigLocation</param-name>
<param-value>classpath:/springMVCxml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
spring容器放在ServletContext中的key是orgspringframeworkwebservletFrameworkServletCONTEXTspringMVC
注意后面的springMVC,是你的servlet-name配置的值,注意适时修改。
Java代码
ServletContext sc=略
WebApplicationContext attr = (WebApplicationContext)scgetAttribute("orgspringframeworkwebservletFrameworkServletCONTEXTspringMVC");
2、listener方式加载时:
webxml
Xml代码
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext</param-value>
</context-param>
<listener>
<listener-class>orgspringframeworkwebcontextContextLoaderListener</listener-class>
</listener>
jsp/servlet可以这样取得
Java代码
ServletContext context = getServletContext();
WebApplicationContext applicationContext = WebApplicationContextUtils getWebApplicationContext(context);
3、通用的方法来了,神器啊,前的 1、2两种方法并不通用,可以抛弃了。
在配置文件中加入:
Xml代码
<!-- 用于持有ApplicationContext,可以使用SpringContextHoldergetBean('xxxx')的静态方法得到spring bean对象 -->
<bean class="comxxxxxSpringContextHolder" lazy-init="false" />
Java代码
import orgspringframeworkcontextApplicationContext;
import orgspringframeworkcontextApplicationContextAware;
/
以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候中取出ApplicaitonContext
/
public class SpringContextHolder implements ApplicationContextAware {
private static ApplicationContext applicationContext;
/
实现ApplicationContextAware接口的context注入函数, 将其存入静态变量
/
public void setApplicationContext(ApplicationContext applicationContext) {
SpringContextHolderapplicationContext = 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中,可以使用依赖注入(Dependency Injection,DI)来实现Bean之间的依赖关系。
依赖注入是指,在创建Bean时,容器会自动将Bean所依赖的其他Bean注入到它们中,以实现它们之间的依赖关系。Spring提供了多种方式来实现依赖注入,包括构造函数注入、Setter方法注入和字段注入等。
下面以构造函数注入为例,介绍如何实现Bean之间的依赖关系:
1 定义两个Bean,其中一个Bean依赖于另一个Bean。
@Component
public class BeanA {
private BeanB beanB;
public BeanA(BeanB beanB) {
thisbeanB = beanB;
}
}
@Component
public class BeanB {
}
2 在配置类中使用@Bean注解,将这两个Bean定义为Spring容器的Bean。
@Configuration
public class AppConfig {
@Bean
public BeanA beanA(BeanB beanB) {
return new BeanA(beanB);
}
@Bean
public BeanB beanB() {
return new BeanB();
}
}
在这里,使用@Bean注解将BeanA和BeanB定义为Spring容器的Bean,同时在创建BeanA时,通过构造函数注入将BeanB注入到BeanA中。
3 在其他类中使用@Autowired注解,将Bean注入到需要的地方。
@Component
public class OtherBean {
@Autowired
private BeanA beanA;
}
在这里,使用@Autowired注解将BeanA注入到OtherBean中,因为BeanA中已经注入了BeanB,所以在使用BeanA时也可以使用BeanB。
通过上述步骤,我们就可以在Spring中实现Bean之间的依赖关系了。
以上就是关于在Spring中,Bean有几种作用域全部的内容,包括:在Spring中,Bean有几种作用域、什么是spring的内部bean、如何查看 spring注入的bean等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)