- 浏览: 91788 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
hvang1988:
...
Spring --- Transaction Management -
Branding:
谢谢,原来总是记不住,这下知道原理了
“Hello Java” -- Java安装
承接前一篇Spring --- IOC,继续IOC的介绍
6) 方法注入
首先说说方法注入的使用场景:
当一个singleton bean A 在每次方法调用的时候都需要一个non-singleton bean B,此时就会产生这样一个问题,因为A为singleton,所以容器只会创建一次A,那么也只有一次机会来创建A的属性,无论你是通过setter还是constructor方式注入Bean B,Bean B也只能被初始化一次,而实际需求是我们调用每个方法的时候又都需要一个新的Bean B实例。而方法注入就是解决这个问题的方法之一。具体看看如何实现:
Spring 会自动通过CGLIB动态生成一个子类,继承CommandManager ,并重写原有的createCommand()方法,再根据配置信息createCommand()方法会自动返回一个command bean。
还有一种任意方法的替代方式,不过这不太常用,这里写出来仅供参考吧:
MyValueCalculator 的computeValue方法将被ReplacementComputeValue中的reimplement方法中对应的逻辑所取代。
7) Bean scopes
spring的Bean scopes一共有五种: singleton、prototype、request、session、global session,大致可以分为两类:
第一类是singleton和prototype, singleton表示单件模式,prototype在每次请求该Bean时会新建一个实例。其中singleton是spring bean的缺省值。
第二类是request,session,global session。它们是专用于Web应用程序上下文里的Bean的范围的。要使用这3个属性值之前,我们需要先在web应用的web.xml文件中添加如下配置:
对于spring2.4+的版本:
而对于spring2.3及以下版本,添加的配置应为:
request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效。
session作用域表示该次HTTP请求会产生一个新的bean,同时该beand的生命周期与当前HTTP session一样。
global session与session类似,只是它的生命周期与global portlet session一致。(要理解global session需要知道portlet的概念,为了突出重点,这里就不对portlet作进一步的说明了。http://www.lhjy.net/RecruiStu/JSJ/200512/20350.html)
最后,当一个singleton的bean需要关联一个request session或global session 的时候,因为singleton的bean只会实例化一次,所以我们需要一个代理来实现userPreference的scope
8) bean的生命周期
bean的初始化:
1' 声明初始化函数:
2' 继承InitializingBean 接口:
bean的销毁:
1'声明销毁函数:
2' 继承DisposableBean接口:
在Spring启动和关闭时被调用的callback方法:
首先是类的层次关系:
当ApplicationContext启动或停止时,它会通过LifecycleProcessor来与所有声明的bean的周期做状态更新。而SmartLifecycle的用法如下:
isAutoStartup返回的值决定是否在Spring启动的时候运行start方法,ture的话则运行.
isRunning返回的值决定是否在Spring关闭的时候运行stop(Runnable arg0)方法,ture的话则运行.
getPhase返回的值决定启动的顺序,值越小越先启动,越后关闭,用于调整在有多个这样的bean的时候,这些bean之间启动的优先级.
非web环境下,需要设置ctx.registerShutdownHook(),Spring容器关闭的时候才会调用stop方法.
6) 方法注入
首先说说方法注入的使用场景:
当一个singleton bean A 在每次方法调用的时候都需要一个non-singleton bean B,此时就会产生这样一个问题,因为A为singleton,所以容器只会创建一次A,那么也只有一次机会来创建A的属性,无论你是通过setter还是constructor方式注入Bean B,Bean B也只能被初始化一次,而实际需求是我们调用每个方法的时候又都需要一个新的Bean B实例。而方法注入就是解决这个问题的方法之一。具体看看如何实现:
package fiona.apple; // no more Spring imports! public abstract class CommandManager { public Object process(Object commandState) { // grab a new instance of the appropriate Command interface Command command = createCommand(); // set the state on the (hopefully brand new) Command instance command.setState(commandState); return command.execute(); } // okay... but where is the implementation of this method? protected abstract Command createCommand(); }
<!-- a stateful bean deployed as a prototype (non-singleton) --> <bean id="command" class="fiona.apple.AsyncCommand" scope="prototype"> <!-- 具体配置这里省略 --> </bean> <!-- commandProcessor uses statefulCommandHelper --> <bean id="commandManager" class="fiona.apple.CommandManager"> <lookup-method name="createCommand" bean="command"/> </bean>
Spring 会自动通过CGLIB动态生成一个子类,继承CommandManager ,并重写原有的createCommand()方法,再根据配置信息createCommand()方法会自动返回一个command bean。
还有一种任意方法的替代方式,不过这不太常用,这里写出来仅供参考吧:
public class MyValueCalculator { public String computeValue(String input) { // some real code... } // some other methods... } /** meant to be used to override the existing computeValue(String) implementation in MyValueCalculator */ public class ReplacementComputeValue implements MethodReplacer { public Object reimplement(Object o, Method m, Object[] args) throws Throwable { // get the input value, work with it, and return a computed result String input = (String) args[0]; ... return ...; } }
<bean id="myValueCalculator" class="x.y.z.MyValueCalculator"> <!-- arbitrary method replacement --> <replaced-method name="computeValue" replacer="replacementComputeValue"> <arg-type>String</arg-type> </replaced-method> </bean> <bean id="replacementComputeValue" class="a.b.c.ReplacementComputeValue"/>
MyValueCalculator 的computeValue方法将被ReplacementComputeValue中的reimplement方法中对应的逻辑所取代。
7) Bean scopes
spring的Bean scopes一共有五种: singleton、prototype、request、session、global session,大致可以分为两类:
第一类是singleton和prototype, singleton表示单件模式,prototype在每次请求该Bean时会新建一个实例。其中singleton是spring bean的缺省值。
第二类是request,session,global session。它们是专用于Web应用程序上下文里的Bean的范围的。要使用这3个属性值之前,我们需要先在web应用的web.xml文件中添加如下配置:
对于spring2.4+的版本:
<web-app> ... <listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener> ... </web-app>
而对于spring2.3及以下版本,添加的配置应为:
<web-app> ... <filter> <filter-name>requestContextFilter</filter-name> <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class> </filter> <filter-mapping> <filter-name>requestContextFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ... </web-app>
request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效。
session作用域表示该次HTTP请求会产生一个新的bean,同时该beand的生命周期与当前HTTP session一样。
global session与session类似,只是它的生命周期与global portlet session一致。(要理解global session需要知道portlet的概念,为了突出重点,这里就不对portlet作进一步的说明了。http://www.lhjy.net/RecruiStu/JSJ/200512/20350.html)
最后,当一个singleton的bean需要关联一个request session或global session 的时候,因为singleton的bean只会实例化一次,所以我们需要一个代理来实现userPreference的scope
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"> <aop:scoped-proxy/> </bean> <bean id="userManager" class="com.foo.UserManager"> <property name="userPreferences" ref="userPreferences"/> </bean>
8) bean的生命周期
bean的初始化:
1' 声明初始化函数:
<bean id="exampleInitBean" class="examples.ExampleBean" init-method="init"/> public class ExampleBean { public void init() { // do some initialization work } }
2' 继承InitializingBean 接口:
<bean id="exampleInitBean" class="examples.AnotherExampleBean"/> public class AnotherExampleBean implements InitializingBean { public void afterPropertiesSet() { // do some initialization work } }
bean的销毁:
1'声明销毁函数:
<bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/> public class ExampleBean { public void cleanup() { // do some destruction work (like releasing pooled connections) } }
2' 继承DisposableBean接口:
<bean id="exampleInitBean" class="examples.AnotherExampleBean"/> public class AnotherExampleBean implements DisposableBean { public void destroy() { // do some destruction work (like releasing pooled connections) } }
在Spring启动和关闭时被调用的callback方法:
首先是类的层次关系:
public interface Lifecycle { void start(); void stop(); boolean isRunning(); } public interface LifecycleProcessor extends Lifecycle { void onRefresh(); void onClose(); } public interface Phased { int getPhase(); } public interface SmartLifecycle extends Lifecycle, Phased { boolean isAutoStartup(); void stop(Runnable callback); }
当ApplicationContext启动或停止时,它会通过LifecycleProcessor来与所有声明的bean的周期做状态更新。而SmartLifecycle的用法如下:
public class LfCycleBean1 implements SmartLifecycle{ protected static final Log log = LogFactory.getLog(LfCycleBean1.class); private boolean isRunning = false; @Override public boolean isAutoStartup() { // TODO Auto-generated method stub return true; } @Override public void stop(Runnable arg0) { arg0.run(); isRunning = false; log.info("stop Runnable"); } @Override public boolean isRunning() { // TODO Auto-generated method stub return isRunning; } @Override public void start() { isRunning = true; log.info("start "); } @Override public void stop() { isRunning = false; log.info("stop"); } @Override public int getPhase() { return -1; } } <bean id="LfCycleBean1" class="com.test.spring.lifecycle.LfCycleBean1" />
isAutoStartup返回的值决定是否在Spring启动的时候运行start方法,ture的话则运行.
isRunning返回的值决定是否在Spring关闭的时候运行stop(Runnable arg0)方法,ture的话则运行.
getPhase返回的值决定启动的顺序,值越小越先启动,越后关闭,用于调整在有多个这样的bean的时候,这些bean之间启动的优先级.
非web环境下,需要设置ctx.registerShutdownHook(),Spring容器关闭的时候才会调用stop方法.
AbstractApplicationContext ctx = new ClassPathXmlApplicationContext(new String []{"beans.xml"}); ctx.registerShutdownHook();
发表评论
-
Spring --- Transaction Management
2012-12-26 09:52 10694一)spring的事务管理 事务管理并非spring独 ... -
Spring --- AOP IV
2012-12-21 16:44 997Spring AOP APIs 一)一个最简单的例子 publ ... -
Spring --- AOP III
2012-12-19 13:19 1077这篇文章先补充两个AOP的概念: 一)引入(Introduct ... -
Spring --- AOP II
2012-12-17 19:29 1227一)Spring AOP---schema-based ... -
Spring --- AOP
2012-12-13 16:10 1196一)什么是AOP AOP(A ... -
Spring --- SpEL
2012-12-11 16:10 9612一)什么是SpEL SpEL -- Spring Expr ... -
Spring --- Data Binding
2012-12-10 14:40 3133一) BeanWrapper BeanWrapper这个类 ... -
Spring --- Validation
2012-12-07 15:05 1877一) Validator接口 Spring的Validat ... -
Spring --- Resource
2012-12-06 16:50 1594一)如何使用spring中的r ... -
Spring --- IOC III
2012-12-04 15:34 1324承接上两篇IOC的介绍,我们继续... 9)Applicati ... -
Spring --- IOC
2012-11-28 16:36 1148一) IOC其实很简单 什么是IOC(控制反转)? 这名 ... -
开篇简介--Spring is not only Spring Framework
2012-03-06 16:42 1765一)什么是Spring 在java领域,当我们提起Spri ...
相关推荐
Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- ...
这个jar文件"Spring-ioc-jar"包含了实现Spring IOC功能所需的关键类和接口,是学习和使用Spring IOC技术的基础。 Spring框架的IOC容器是其核心组件,主要由`ApplicationContext`和`BeanFactory`两个接口代表。`...
**Spring IoC 框架详解** Spring框架是Java开发中的一个核心组件,它提供了许多功能,其中最重要的一项就是Inversion of Control(IoC),也称为Dependency Injection(DI)。IoC容器是Spring的核心,它负责管理...
这里提到的是一组完整的Spring库,包括`spring-core`、`spring-context`、`spring-webmvc`、`spring-web`、`spring-beans`、`spring-test`、`spring-jdbc`、`spring-orm`、`spring-aop`和`spring-tx`,它们都是3.2.0...
1. **spring-context-3.1.2.RELEASE.jar**:提供Spring的IoC(Inversion of Control)容器和AOP(Aspect Oriented Programming)支持,这是Spring框架的基础,为Spring Security提供了配置和事件处理能力。...
标题“Spring-MVC+Spring-IOC+Spring-JdbcTemple”揭示了这个项目或教程是关于如何集成并使用Spring框架的三个核心模块:Spring MVC、Spring IOC(Inversion of Control,控制反转)以及Spring JDBC Template。...
spring-IOC的一些笔记心得
Spring的核心模块提供了如IoC(Inversion of Control,控制反转)容器、AOP代理、事件传播、资源处理等功能。同时,它还可能包含Spring与其他技术的集成,如Spring JDBC、Spring ORM(对象关系映射)用于数据库操作...
Spring的核心设计理念是依赖注入(Dependency Injection,简称DI),它通过反转控制(Inversion of Control,IoC)来降低组件之间的耦合度。这种设计模式使得应用程序的配置和业务逻辑分离,从而提高了代码的可测试...
Spring框架的核心是IoC(Inversion of Control)容器,它负责管理对象的生命周期和依赖关系。当需要使用CGLIB或Objenesis创建代理对象时,Spring容器会根据配置和上下文信息,动态地生成并管理这些代理对象。 6. *...
在Spring 1.0版本中,核心概念主要围绕IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)展开。IoC使得对象的创建和管理由Spring容器负责,而不是由代码直接创建,这样降低...
spring-**cntext**-4.3.6.RELEASE.jar:spring提供了基础IOC功能上的扩展服务,提供了很多企业级服务的支持,如邮件服务,任务调度,JNDI定位,EJB集成,远程访问,缓存以及各种试图层框架的封装等。 spring-...
1. **spring-core**: 提供了基础的IoC(Inversion of Control)容器,它是Spring框架的核心。IoC允许开发者通过配置来管理对象的生命周期和依赖关系,使得代码更加松耦合。 2. **spring-beans**: 支持Bean工厂和XML...
Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它将对象的创建和管理权交由Spring容器处理,使得开发者可以更专注于业务逻辑的编写,而不是对象的生命周期管理。下面,我们将深入探讨Spring...
Spring框架是Java开发中的核心组件,它以IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)为核心,极大地简化了企业级应用的开发工作。Spring-4.0.3是Spring框架的一个...
在Java Spring框架中,Spring IoC(Inversion of Control,控制反转)是核心特性之一,它使得应用程序的组件之间的依赖关系不再由代码直接管理,而是交由Spring IoC容器负责。这种设计模式降低了代码间的耦合,提高...
spring-ioc学习 新手可以下过来学习下, spring-ioc简介
spring 3.2.4 Realease 的所有jar包: spring-context-3.2.4.RELEASE.jar spring-core-3.2.4.RELEASE.jar spring-beans-3.2.4.RELEASE.jar spring-test-3.2.4.RELEASE.jar spring-web-3.2.4.RELEASE.jar spring-aop-...
其中,有4个是Spring的基础包,对应Spring核心容器的4个模块,是Spring项目...spring-context-5.1.8.RELEASE.jar //提供在基础IoC上的扩展服务 spring-expression-5.1.8.RELEASE.jar //提供对Spring表达式语言的支持
**Spring-IOC实例详解** Spring框架是Java开发中不可或缺的一部分,尤其在企业级应用中,其Inversion of Control(IoC)容器是其核心特性之一。IoC,也被称为依赖注入(Dependency Injection,DI),是一种设计模式...