`
flyingsword945
  • 浏览: 24302 次
  • 性别: Icon_minigender_2
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

spring in action 2.0读书笔记(三)

阅读更多
<bean id="baseSaxophonist" class="com.springinaction.springidol.Instrumentalist"
abstract="true">
<property name="instrument" ref="saxophone" />
<property name="song" value="Jingle Bells" />
</bean>
<bean id="kenny" parent="baseSaxophonist" />
<bean id="david" parent="baseSaxophonist" />

Spring inheritance(different from Java inheritance): abstract and parent, is commonly used to reduce the amount of redundant XML. e.g: TransactionProxyFactoryBean.

Spring提供了method injection功能,使你能够在runtime期间把method注入到class里.Spring提供了2种方式的method injection:
1.Method replacement—Enables existing methods (abstract or concrete) to be replaced at runtime with new implementations.
<bean id="magicBox"
    class="com.springinaction.springidol.MagicBoxImpl">
        <replaced-method name="getContents" replacer="tigerReplacer" />
</bean> 
<bean id="tigerReplacer" class="com.springinaction.springidol.TigerReplacer" />
 
import org.springframework.beans.factory.support.MethodReplacer;
public class TigerReplacer implements MethodReplacer {
    public Object reimplement(Object target, Method method,
        Object[] args) throws Throwable {
            return "A ferocious tiger";
    }
}

2.Getter injection—Enables existing methods (abstract or concrete) to be replaced at runtime with a new implementation that returns a specific bean from the Spring context. (这种方式是for"使用get开头的,而且返回值是在spring里有bean定义类型"的方法)
<bean id="stevie"
    class="com.springinaction.springidol.Instrumentalist">
        <lookup-method name="getInstrument" bean="guitar" />
</bean>

There’s no need to write a MethodReplacer class.

Injecting non-Spring beans
对于在spring里有定义bean,但又不是通过spring来创建的class,又应该如何使用spring呢?这种情况是可能的:例如,一个由ORM创建的object则不是spring创建的。
第一步:把bean定义成abstract:
<bean id="pianist"
    class="com.springinaction.springidol.Instrumentalist"
         abstract="true">
        <property name="instrument">
            <bean class="com.springinaction.springidol.Piano" />
        </property>
</bean>

第二步:如果把上面的定义(注意上面设置的id)和class联系起来
@Configurable("pianist")
public class Instrumentalist implements Performer {
…
}

@Configurable的作用有2个:
1> 它表明Instrumentalist的实例会被纳入和配置到spring container里,即使它是在outside of spring创建。
2> 它把Instrumentalist class与id为pianist联系在一起,当spring在配置一个实例时,它会寻找pianist bean作为模板来进行配置(包括DI)
第三步:在spring configure file里添加下列代码
<aop:spring-configured />

它表示有一些在外部创建的beans,需要被配置和纳入进spring container.
请注意:<aop:spring-configured/>是用到aspectJ,这意味着你的APP必须在一个AspectJ-enabled JVM里运行。
The best way to AspectJ-enable a Java 5 JVM is to start it with the following JVM argument:
-javaagent:/path/to/aspectjweaver.jar

Registering custom property editors
extends java.beans.PropertyEditorSupport
public class PhoneEditor
    extends java.beans.PropertyEditorSupport {
    //text value example “111-111-111”
    public void setAsText(String textValue) {
       String areaCode = textValue.substring(0,3);
       String prefix = textValue.substring(4,7);
       String number = textValue.substring(8);
       PhoneNumber phone = new PhoneNumber(areaCode, prefix, number);
       setValue(phone);
    }
}
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
    <property name="customEditors">
       <map>
           <entry key="com.springinaction.chapter03.propeditor.PhoneNumber">
              <bean id="phoneEditor" class="com.springinaction.chapter03.propeditor.PhoneEditor">
              </bean>
           </entry>
       </map>
    </property>
</bean>

CustomEditorConfigurer实质上是一个BeanFactoryPostProcessor,因此它会在bean factory初始化之后调用registerCustomEditor()方法来把custom editors load进BeanFactory里。
Postprocessing beans
PostProcessor有2种:
1) Bean PostProcessor (注意:BeanPostProcessor是for all beans的,not for one bean)implements BeanPostProcessor
postProcessBeforeInitialization()方法是在bean初始化之前被调用(即在bean定义中设置的“init-method”方法执行之前或实现InitializingBean接口的Bean的afterPropertiesSet()方法执行之前)
postProcessAfterInitialization()方法是在初始化之后被调用(即在bean定义中设置的“init-method”方法执行之后或实现InitializingBean接口的Bean的afterPropertiesSet()方法执行之后)
2) Bean Factory PostProcessor implements BeanFactoryPostProcessor
postProcessBeanFactory()方法会在all beans loaded之后,任何bean(包括BeanPostProcessor beans)被初始化(instantiated)之前,被spring container所调用。
Externalizing configuration properties
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
       <property name="location" value="jdbc.properties" />
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="url" value="${database.url}" />
    <property name="driverClassName" value="${database.driver}" />
    <property name="username" value="${database.user}" />
    <property name="password" value="${database.password}" />
</bean>

Resolving resource messages
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename">
       <value>trainingtext</value>
    </property>
</bean>
<spring:message code="computer"/>

Spring提供了一些Aware接口,如BeanFactoryAware、ApplicationContextAware、ResourceLoaderAware、ServletContextAware等等。比如,实现了BeanFactoryAware接口的bean,Spring容器会自动把BeanFactory对象注入该bean(当然,前提是该bean有一个BeanFactory变量),而实现了ApplicationContextAware接口的bean,会自动把ApplicationContext对象注入该bean(当然,前提是该bean有一个ApplicationContext变量)
Decoupling with application events
第一步:定义一个application event,它扩展了ApplicationEvent抽象类
第二步:定义一个Application listener,它实现org.springframework.context.ApplicationListener接口。
class HeartbeatForwarder implements ApplicationListener {
 public void onApplicationEvent(ApplicationEvent event) {
  if (event instanceof HeartbeatEvent) {
   System.out.println("Received heartbeat event: " + event.getTimestamp());
  }
 }
}

第三步:在spring里注册该listener。
第四步: 用来publish event的bean,因为publish event需要用到applicationcontext,所以implements ApplicationContextAware
class HeartbeatTask extends TimerTask implements ApplicationEventPublisherAware {

 private ApplicationEventPublisher eventPublisher;

 public void run() {
  HeartbeatEvent event = new HeartbeatEvent(this);
  eventPublisher.publishEvent(event);
 }

 public void setApplicationEventPublisher(ApplicationEventPublisher eventPublisher) {
  this.eventPublisher = eventPublisher;
 }
}

Scripting beans
把script bean注入到java class bean
<lang:jruby id="lime"
    script-source="classpath:com/springinaction/scripting/Lime.rb"
    script-interfaces="com.springinaction.scripting.Lime" />

把java class bean注入到script bean
<lang:groovy id="coconut"
script-source="classpath:com/springinaction/scripting/Coconut.groovy">
       <lang:property name="lime" ref="lime" />
</lang:groovy>

Refreshing scripted beans
<lang:jruby id="lime"
script-source="classpath:com/springinaction/scripting/Lime.rb"
script-interfaces="com.springinaction.scripting.Lime"
refresh-check-delay="5000"/>

Writing scripted beans inline
<lang:bsh id="lime"
    script-interfaces="com.springinaction.scripting.Lime">
<lang:inline-script><![CDATA[
void drink() {
System.out.println("Called the doctor woke him up!");
}
]]>
</lang:inline-script>
</lang:bsh>
分享到:
评论

相关推荐

    Struts2.0培训笔记

    本培训笔记将深入探讨Struts2.0的核心概念、特性以及如何在实际项目中有效应用。 一、Struts2.0框架基础 Struts2.0是Apache软件基金会的项目,它是Struts1.x的升级版,提供了更强大的功能和更好的性能。该框架通过...

    strust2.0学习笔记

    ### Struts2.0 学习笔记 #### 引言 Struts2 是一款非常流行的 Java Web 开发框架,它基于 Struts1 进行了重大的改进与优化,不仅继承了 Struts1 的优秀特性,还在此基础上进行了扩展,支持更加丰富的功能,如拦截...

    Struts 2 + Spring 2.0 + Hibernate 3.0整合笔记

    在本笔记中,我们将深入探讨这三个框架的整合过程及其核心概念。 **Struts 2** 是一个开源的MVC框架,它为Java Web应用程序提供了强大的控制层。Struts 2的核心是Action类,它是处理用户请求的中心。通过配置Action...

    Struts2.0学习笔记.doc

    Struts2.0是一个流行的Java Web开发框架,它极大地简化了MVC(模型-视图-控制器)架构的实现。在Struts2中,类型转换是自动进行的,旨在帮助开发者处理请求参数与Action类属性之间的类型匹配问题。文档中的内容主要...

    struts2.0笔记(1)

    总的来说,Struts2.0笔记将涵盖MVC设计模式的实现、Action的定义与调用、拦截器的应用、配置文件的解析、结果处理和视图展现等方面的知识。通过学习Struts2.0,开发者可以构建出结构清晰、易于维护的Web应用,同时也...

    Struts2.0笔记

    Struts2.0 是一款基于 MVC 设计模式的开源框架,用于构建企业级的 Java Web 应用。它简化了MVC开发,提供了一种更简单、更灵活的方式来处理请求和响应。以下是对Struts2.0核心概念的详细解释: 1. **运行环境配置**...

    Struts2 + Spring + Hibernate + DWR 项目布署笔记

    在`struts2-spring-plugin-2.0.11.2.jar`中,包含了Struts2与Spring集成所需的类和配置,帮助管理Struts2的Action实例。 其次,Spring框架是Java开发的核心工具,它不仅提供了DI和AOP,还支持事务管理、数据访问...

    struts2.0(希望可以帮助大家)

    这个压缩包包含的资源是作者学习Struts2.0过程中的笔记和示例,分为两个文档:struts2.0文档1-2.doc和struts2.0文档3-4-5.doc,涵盖了从基础到进阶的内容。 在"struts2.0文档1-2.doc"中,可能包括了以下知识点: 1...

    ssh笔记及jar包

    SSH(Struts+Spring+Hibernate)是一个经典的Java Web开发框架,它将Struts的MVC设计模式、Spring的依赖注入和事务管理以及Hibernate的对象关系映射整合在一起,为开发人员提供了一种高效、灵活的开发环境。这篇笔记...

    ssh整合学习笔记(图解)

    3. **Type属性值的设置**:在Struts配置文件中,将Action的type属性值设置为`SpringProxyAction`,这样,每当有请求到达时,Struts会自动调用Spring容器,由Spring负责实例化并调用具体的Action类,实现了框架之间的...

    Java/JavaEE 学习笔记

    第三章 Action,Result & Struts2 Tag Library......................267 第四章 Data Transfer & Type Converter..273 第五章 Validation(数据格式验证)..276 第六章 Internationalization(I18N:国际化).............

    j2ee SSH 整合笔记,献于新手。。

    - **修改`struts-config.xml`**:为了使用Spring管理Struts的Action,需要将原有的Action配置修改为使用Spring的代理Action。例如: ```xml &lt;action name="IndexActionForm" path="/indexAction" scope="request...

    J2EE学习笔记(J2ee初学者必备手册)

    第三章 Action,Result & Struts2 Tag Library......................267 第四章 Data Transfer & Type Converter..273 第五章 Validation(数据格式验证)..276 第六章 Internationalization(I18N:国际化).............

    Struts笔记

    - **易于集成**: Struts 可以很容易地与其他 Java EE 技术(如 Hibernate 和 Spring)进行集成。 - **灵活的配置**: 通过 XML 文件进行配置,使得开发者可以根据实际需求调整框架的行为。 #### 三、Struts的安装与...

    Strtus2学习笔记

    ### Struts2学习笔记知识点梳理 #### 一、前言及背景 - **Struts2简介**:Struts2是一个基于MVC模式的开源Web应用框架,它继承了Struts1的一些特性,并在此基础上进行了很多改进,使得开发更加便捷高效。 - **学习...

    struts2资料可做参考

    "struts2学习笔记(一) ——struts2与spring2_0的集成 - 一嗑立扑死 - CSDN博客.mht"可能详细讨论了如何将Struts2与Spring 2.0版本集成,包括Action的配置和依赖注入的使用。而"Struts2与Spring的结合 - Naviler的...

    struts学习笔记

    - **集成能力**:Struts2很容易与其他框架(如Spring、Hibernate等)集成。 **Struts2的下载**: - 官方网站:[http://www.apache.org/download](http://www.apache.org/download) - 下载包结构:Struts2-1.6.zip ...

Global site tag (gtag.js) - Google Analytics