`
klyuan
  • 浏览: 181947 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Spring JavaConfig开发指南(上)

    博客分类:
  • java
阅读更多
Spring JavaConfig开发指南
作者:袁光东
1.           什么是JavaConfig
Spring IOC有一个非常核心的概念——Bean。由Spring容器来负责对Bean的实例化,装配和管理。XML是用来描述Bean最为流行的配置方式。Spring可以从XML配置文件中读取任何类型的元数据并自动转换成相应的Java代码。Spring开变了java的编程模式,Spring的下载已经超过了1亿次,可见Spring已经有多流行。
随着Spring的日益发展,越来越多的人对Spring提出了批评。“Spring项目大量的烂用XML”就是最为严励的一个批评。由于Spring会把几乎所有的业务类都以Bean的形式配置在XML文件中,造成了大量的XML文件。使用XML来配置Bean失去了编译时的类型安全检查。大量的XML配置使得整个项目变得更加复杂。Rod Johnson也注意到了这个非常严重的问题。当随着JAVA EE 5.0的发布,其中引入了一个非常重要的特性------Annotations(注释)。注释是源代码的标签,这些标签可以在源代码层进行处理或通过编译器把它熔入到class文件中。在JAVA EE 5以后的版本中,注释成为了一个主要的配置选项。Spring使用注释来描述Bean的配置与采用XML相比,因类注释是在一个类源代码中,可以获得类型安全检查的好处。可以良好的支持重构。
JavaConfig就是使用注释来描述Bean配置的组件。JavaConfig 是Spring的一个子项目,
比起Spring,它还是一个非常年青的项目。目前的版本是1.0 M2。使用XML来配置Bean所能实现的功能,通过JavaConfig同样可以很好的实现。
 
2.           HelloWorld with JavaConfig
2.1 获得JavaConfig
JavaConfig的下载地址:
关于JavaConfig的更多信息请访问:
 
2.2 HelloWorld程序
我们将以HelloWorld程序来开始JavaConfig之旅!
HelloWorld.java
java 代码
  1. package com.springconfig.example.bean;   
  2. public class HelloWorld {   
  3.    private String word;   
  4.     
  5.     
  6. public void sayHello() {   
  7.  System.out.println(this.word);   
  8. }   
  9. public void setWord(String word) {   
  10.  this.word = word;   
  11. }    
  12. }   
 
HelloWorld.java是一个非常简单的java类。只有两个方法:
setWord()设置私有变量word的值。
SayHello()打印出word的值
 
现在我们以JavaConfig来描述HellWorld这个Bean,而不是以xml方式描述。
我们需要创建一个管理类,并加上适当的注释就可以了。
 
java 代码
 
上在的代码,我们创建了一个叫HelloWorldConfiguration的类,并加上了一个类级别的注释@Configuration.
这个类中,只有一个helloWorld()的方法,返回类型为HelloWorld。这个方法,首先会创建一个HelloWorld的实例,这个实例设置word属性为"Hello world!",然后返回这个实例。
这个方法有一个方法级别的注释@Bean
看起来,这个与普通的java类并没有什么不一样。
但是这是一个非常简单的JavaConfig实现。
如果把HelloWorld用xml来描述,等价于:
java 代码
  1. <!---->"1.0" encoding="UTF-8"?>   
  2. <!---->"-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">   
  3. <beans></beans>  
  4.   "helloWorld" class="com.springconfig.example.bean.HelloWorld">   
  5.     "word">   
  6.       <value></value>Hello world!   
  7.        
  8.      
  9.   
JavaConfig的使用也非常的简单
HelloWorldWithJavaConfig.java
java 代码
  1. package com.springconfig.example.chapter2;   
  2. public class HelloWorldWithJavaConfig {   
  3.  public static void main(String[] args){   
  4.   ApplicationContext config = new AnnotationApplicationContext(HelloWorldConfiguration.class.getName());   
  5.   HelloWorld helloWorld = (HelloWorld)config.getBean("helloWorld");   
  6.   helloWorld.sayHello();   
  7.  }   
  8. }   
 
程序运行后的输出结果如下:
Hello world!
 
可见JavaConfig的使用与XML一样简单,只是这里AnootationApplicationcontext替代了ClassPathXmlApplicationContext.
 
再来看看HelloWorldConfiguration类。
加上@Configuration注释后的HelloWorldConfiguration类就像一个描述Bean配置的XML文件。
加上@Bean注释后的helloWorld()方法就是一个Bean描述。Bean的ID为helloWorld.而Bean的class属性为com.springconfig.example.bean.HelloWorld.
并为这个Bean的word属性注入了值Hello world!
 
3.           JavaConfig 注释
JavaConfig使用Java代码来对配置,管理和实例化Bean.并交由Spring容器来使用。在使用XML文件来描述Bean配置时,需要定义许多专有的XML元素。而使用Java代码来描述Bean配置,是利用JDK 5 的注释特性。不管是使用XML还是Java代码,Spring都使它们在语义上保持一致。让我们看看JavaConfig中那些最重要的注释
 
3.1 @Configuration
@Configuration 标志配置类,可以在这个配置类中定义bean。在第二章我们已经接触过。
 
@Configuration
public class WebConfiguration{
//在这里定义Bean
}
 
@Configuration 等同于<beans></beans>标签。<beans></beans>标签的所有属性,都可以在@Configuration中进行定义。可以通过@Configuration的元素来自定义Configuration中bean的缺省的“自动织入方式”,“依赖检查方式”,“延时初始化”,及Configuration名称
 
@Configuration可选元素

元素名
元素类型
说明
默认值
取值说明
defaultAutowire
Autowire
默认自动织入方式
INHERITED
 
defaultDependencyCheck
DependencyCheck
默认依赖检查方式
DependencyCheck. UNSPECIFIED 即不进行依赖检查
 
defaultLazy
Lazy
默认延时初始化
Lazy. UNSPECIFIED
即不进行延时初始化
 
names
String[]
Configuration名称
""默认为空字符串
 
useFactoryAspects
boolean
是否使用切面从封装的Bean工厂自动织入
false
true,false

 
deaultAutowire标记Bean的自动织入方式,其取值在
org.springframework.beans.factory.annotation.Autowire类中进行定义。
 

模式
说明
INHERITED
不指定自动织入模式,从封装的factory中继承
NO
不使用自动织入
BY_NAME
根据名称织入bean的属性
BY_TYPE
根据类型织入bean的属性
注意:Autowire并没有定义constructor和autodetect这两种织入方式,也无需要这两种织入方式

 
DefaultDependencyCheck 标记Bean的依赖检查方式其取值在DependencyCheck中定义

模式
说明
UNSPECIFIED
不指定依赖检可方式,从封装的factory中继承
NONE
没有依赖检查
SIMPLE
对原始类型和集合进行依赖检查
OBJECTS
对对象进行依赖检查
ALL
对原始类,集合和对象都进行依赖检查

 
DefaultLazy 标记Bean是否进行延时初始化,其取值在Lazy类中定义

模式
说明
UNSPECIFIED
不指定延时初始化Bean方式,从封装的factory中继承
FALSE
不进延时初始化Bean
TRUE
延时初始化Bean

 
 
示例:
java 代码
  1. package com.springconfig.example.chapter3;   
  2. @Configuration(defaultAutowire=Autowire.BY_TYPE,defaultLazy=Lazy.FALSE)   
  3. public class ConfigurationFull extends ConfigurationSupport {   
  4.     
  5. @Bean  
  6. public HelloWorld helloWorld(){   
  7. HelloWorld helloWorld = new HelloWorld();   
  8. helloWorld.setWord(word());   
  9. return helloWorld;   
  10. }   
  11. @Bean  
  12. public String word(){   
  13. String word ="HelloWorld!";   
  14. return word;   
  15. }   
  16. }   
  17.     
 
需要注意的是使用@Configuration来注释一个java类后,这个配置类也会被定义成一个Bean.其Bean名称为这个Configuration类的完整类名。
 
java 代码
  1. package com.springconfig.example.chapter3;   
  2.     
  3. public class ConfigurationWithElement {   
  4.  public static void main(String[] args){   
  5.  ApplicationContext context = new AnnotationApplicationContext(ConfigurationFull.class.getName());   
  6.  ConfigurationFull configuration =(ConfigurationFull)context.getBean("com.springconfig.example.chapter3.ConfigurationFull");   
  7.  configuration.helloWorld().sayHello();   
  8.  }   
  9. }   
运行程序后,输出:
HelloWorld!
 
在Configuration中访问Factory
有时需要在Configuration类中获得Factory对象,可以继承ConfigurationSupport。
 
java 代码
  1. package com.springconfig.example.chapter3;   
  2.     
  3. @Configuration  
  4. public class ConfigurationWithSupport extends ConfigurationSupport{   
  5. @Bean  
  6. public String sayWord(){   
  7. String word = (String)getBean("word");   
  8. return word;           
  9. }   
  10. }   
 
在sayWord方法中,是能过getBean方法来获得一个名为word的Bean,并返回这个Bean的值。
 
java 代码
  1. public static void main(String[] args){   
  2. ApplicationContext context = new AnnotationApplicationContext(ConfigurationFull.class.getName(),ConfigurationWithSupport.class.getName());   
  3. String word = (String)context.getBean("sayWord");   
  4. System.out.println(word);   
  5. }   
 
 
3.2 @Bean
@Bean用来在Configuration中指定一个Bean定义。方法名就是Bean名称。当然你也可以使用aliases元素来为bean取一个别名。
java 代码
  1.     
  2. @Bean  
  3. public HelloWorld helloWorld(){   
  4. HelloWorld helloWorld = new HelloWorld();   
  5. helloWorld.setWord(word());   
  6. return helloWorld;   
  7. }   
 
例如:上面的例子,spring就像创造一个名称叫helloWorld的bean。返回值为HelloWorld类型的实例。
@Bean 是一个方法级的注释,用java代码来创建和装配一个Bean实列。它相当于<bean></bean>标签,并可以支持xml的<bean></bean>标签提供的大部分选项,如:autowiring,lazy-init,dependency-check,depends-on,scope等。
@Bean的可选元素
元素名
元素类型
说明
默认值
取值说明
aliases
String[]
Bean的别名
{}
 
dependencyCheck
DependencyCheck
默认依赖检查方式
DependencyCheck. UNSPECIFIED 即不进行依赖检查
 
allowOverriding
boolean
允许覆盖xml或其它Configuration的bean
false
 
autowire
AutoWire
自动织入方式
INHERITED
Autowire

 

dependsOn
String[]
当前Bean依赖的bean
{}
 
destroyMethodName
String
销毁方法名
 
initMethodName
String
初始化方法名
 

 

 

未完,继续见第二部份

分享到:
评论
5 楼 klyuan 2007-06-06  
leondu 写道
格式阿格式,不得不说je的编辑器实在是不好用,建议klyuan加一个附件。


我当时加附件就提交不成功!郁闷
4 楼 klyuan 2007-06-06  
http://www.iteye.com/topic/86273

下半部份

我竟然不能一次性发完!!
所以分成两个贴发!!!
3 楼 leondu 2007-06-05  
格式阿格式,不得不说je的编辑器实在是不好用,建议klyuan加一个附件。
2 楼 linxiao 2007-06-05  
好文章啊,受用
1 楼 打倒小日本 2007-06-05  
这么好的文章竟然没人讨论?
好好学习,不懂得地方再向楼主请教

相关推荐

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    在当今Java EE 开发中,Spring 框架是当之无愧的王者。而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    2.4 目前市场上常见的轻量级J2EE开发容器 2.5 小结 第二篇 建立和使用J2EE的开发平台 第三章 建立Java的开发平台 3.1 建立Java的开发环境 3.1.1 下载JDK 3.1.2 安装JDK 3.1.3 设定Path、Classpath和JAVA_HOME 3.2 ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    在当今Java EE 开发中,Spring 框架是当之无愧的王者。而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    2.4 目前市场上常见的轻量级J2EE开发容器 2.5 小结 第二篇 建立和使用J2EE的开发平台 第三章 建立Java的开发平台 3.1 建立Java的开发环境 3.1.1 下载JDK 3.1.2 安装JDK 3.1.3 设定Path、Classpath和JAVA_HOME 3.2 ...

    spring.net中文手册在线版

    Spring.NET以Java版的Spring框架为基础,将Spring.Java的核心概念与思想移植到了.NET平台上。 第一章 序言 第二章 简介 2.1.概述 2.2.背景 2.3.模块 2.4.许可证信息 2.5.支持 第三章 背景 3.1.控制反转 第...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    2.4 目前市场上常见的轻量级J2EE开发容器 2.5 小结 第二篇 建立和使用J2EE的开发平台 第三章 建立Java的开发平台 3.1 建立Java的开发环境 3.1.1 下载JDK 3.1.2 安装JDK 3.1.3 设定Path、Classpath和JAVA_HOME 3.2 ...

    springCloud

    Spring Cloud简介 Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud ...

    免费下载:自己整理的java学习资料

    自己整理的一些资料,不需要积分,希望对大家有帮助。 里面包有如下的一些java资料 Ant使用指南.pdf cvs.pdf Eclipse入门-- Eclipse的使用简介及插件开发.PDF ...spring2中文开发参考手册.chm a.txt

    ibatis 开发指南(pdf)

    ibatis 开发指南 ibatis Quick Start............................................................................................ 5 准备工作...........................................................

    《程序天下:J2EE整合详解与典型案例》光盘源码

    2.4 目前市场上常见的轻量级J2EE开发容器 2.5 小结 第二篇 建立和使用J2EE的开发平台 第三章 建立Java的开发平台 3.1 建立Java的开发环境 3.1.1 下载JDK 3.1.2 安装JDK 3.1.3 设定Path、Classpath和JAVA_HOME 3.2 ...

    java基于ssm的列车火车高铁票务信息管理系统 毕业设计源码论文

    本文以java为开发技术,实现了一个列车票务信息管理系统。列车票务信息管理系统的主要使用者分为管理员;个人中心、用户管理、车票信息管理、购票指南管理、管理员管理、论坛管理、我的收藏管理、系统管理、订单管理...

    webx3框架指南PDF教程附学习Demo

    完全建立在Spring框架之上,故可运用Spring的所有特性。 • 扩展性 —— Webx 3.0对Spring做了扩展,使Spring Bean不再是“bean”,而是升级成“组件”。一个组件可以扩展另一个组件,也可以被其它组件扩展。这种...

    java_技术参考汇集(完整版)

    config struts标签 ant使用指南 cvs eclipse开发、插件 hibernate javaAnnotation java配置文件编写说明 java设计模式 jboss log4j spring starts——actiong struts标签 swing tomcat webandxml 正则表达式…………...

    单点登录源码

    ├── zheng-config -- 配置中心[端口:1001] ├── zheng-upms -- 用户权限管理系统 | ├── zheng-upms-common -- upms系统公共模块 | ├── zheng-upms-dao -- 代码生成模块,无需开发 | ├── zheng-upms-...

    java ssm新生入学报到管理系统毕业设计项目源码含论文和ppt

    这是新款的基于B/S和Web开发的JavaWeb的SSM(Spring+SpringMVC+MyBatis)源码,包含源码数据库论文答辩ppt等,开发工具Idea支持eclipse,MySQL功能也比较全面,比较适合作为毕业设计使用,感兴趣的朋友可以下载看看 ...

    product-flow

    -用JavaConfig替换大多数XML配置文件以更好地维护 -仅保留XML文件作为Webflow的描述器,从而合理地更好地理解业务流程 -在JPA查询中使用多种方法,可以灵活地满足各种业务需求并有效地进行编程 -与JSP相比,展示了...

    asp.net知识库

    ASP.NET 2.0 正式版中无刷新页面的开发(示例代码的补充) ASP.NET2.0中themes、Skins轻松实现网站换肤! ASP.NET 2.0 中的代码隐藏和编译 ASP.NET 2.0 Language Swithcer and Theme Swicher 多语言转换和多样式主题...

Global site tag (gtag.js) - Google Analytics