- 浏览: 184571 次
- 性别:
- 来自: 深圳
最新评论
-
mengfei86:
你们讨论的时候我刚上大学,。。。。、、现在都过去好多年了,。 ...
J2EE项目异常处理 -
di1984HIT:
文章不错,学习了
Ibatis读写CLOB数据 -
wulixiaodao:
main{
metodA();
}
详解spring事务属性 -
wulixiaodao:
Main{
Connection con=null;
...
详解spring事务属性 -
tao_gun:
感谢,有点懂了
详解spring事务属性
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 代码
- package com.springconfig.example.bean;
- public class HelloWorld {
- private String word;
- public void sayHello() {
- System.out.println(this.word);
- }
- public void setWord(String word) {
- this.word = word;
- }
- }
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.0" encoding="UTF-8"?>
- <!---->"-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans></beans>
- "helloWorld" class="com.springconfig.example.bean.HelloWorld">
- "word">
- <value></value>Hello world!
JavaConfig的使用也非常的简单
HelloWorldWithJavaConfig.java
java 代码
- package com.springconfig.example.chapter2;
- public class HelloWorldWithJavaConfig {
- public static void main(String[] args){
- ApplicationContext config = new AnnotationApplicationContext(HelloWorldConfiguration.class.getName());
- HelloWorld helloWorld = (HelloWorld)config.getBean("helloWorld");
- helloWorld.sayHello();
- }
- }
程序运行后的输出结果如下:
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 代码
- package com.springconfig.example.chapter3;
- @Configuration(defaultAutowire=Autowire.BY_TYPE,defaultLazy=Lazy.FALSE)
- public class ConfigurationFull extends ConfigurationSupport {
- @Bean
- public HelloWorld helloWorld(){
- HelloWorld helloWorld = new HelloWorld();
- helloWorld.setWord(word());
- return helloWorld;
- }
- @Bean
- public String word(){
- String word ="HelloWorld!";
- return word;
- }
- }
需要注意的是使用@Configuration来注释一个java类后,这个配置类也会被定义成一个Bean.其Bean名称为这个Configuration类的完整类名。
java 代码
- package com.springconfig.example.chapter3;
- public class ConfigurationWithElement {
- public static void main(String[] args){
- ApplicationContext context = new AnnotationApplicationContext(ConfigurationFull.class.getName());
- ConfigurationFull configuration =(ConfigurationFull)context.getBean("com.springconfig.example.chapter3.ConfigurationFull");
- configuration.helloWorld().sayHello();
- }
- }
HelloWorld!
在Configuration中访问Factory
有时需要在Configuration类中获得Factory对象,可以继承ConfigurationSupport。
java 代码
- package com.springconfig.example.chapter3;
- @Configuration
- public class ConfigurationWithSupport extends ConfigurationSupport{
- @Bean
- public String sayWord(){
- String word = (String)getBean("word");
- return word;
- }
- }
在sayWord方法中,是能过getBean方法来获得一个名为word的Bean,并返回这个Bean的值。
java 代码
- public static void main(String[] args){
- ApplicationContext context = new AnnotationApplicationContext(ConfigurationFull.class.getName(),ConfigurationWithSupport.class.getName());
- String word = (String)context.getBean("sayWord");
- System.out.println(word);
- }
3.2 @Bean
@Bean用来在Configuration中指定一个Bean定义。方法名就是Bean名称。当然你也可以使用aliases元素来为bean取一个别名。
java 代码
- @Bean
- public HelloWorld helloWorld(){
- HelloWorld helloWorld = new HelloWorld();
- helloWorld.setWord(word());
- return helloWorld;
- }
例如:上面的例子,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
这么好的文章竟然没人讨论?
好好学习,不懂得地方再向楼主请教
好好学习,不懂得地方再向楼主请教
发表评论
-
一个特殊的异常处理
2008-12-13 23:59 1403一个特殊的异常处理 文:袁光东 一、业务需求说明 前段时间接 ... -
程序员为什么不写单元测试
2007-07-04 11:31 29236程序员为什么不写单 ... -
Spring JavaConfig开发指南(下)
2007-06-03 10:56 6558... -
ThreadLocal与synchronized
2007-05-22 17:49 27422ThreadLocal与synchronized Java良好 ... -
倒底该怎么写DAO的单元测试?
2007-05-17 16:17 14060public void testAddUserInfo() ... -
详解spring事务属性
2007-05-10 22:55 20456Spring声明式事务让我们从复杂的事务处理中得到解脱。使得我 ... -
Ibatis读写CLOB数据
2007-04-25 16:43 22892Ibatis是一个高效,方便,易于学习的数据访问组件,在性能上 ... -
细说框架风云 JSF能否拯救WEB江湖
2007-04-24 18:08 2082细说框架风云 JSF能否拯救WEB江湖 Java ... -
模板方法模式实现探讨
2007-04-23 18:30 4431模板方法(Template Method) ... -
Spring架构设计-增强MultiActionController
2007-04-20 12:04 4838Spring架构设计-增强MultiActionControl ... -
让Spring架构减化事务配置
2007-04-19 12:20 4692让Spring架构减化事务配置 注:原创文章,本文曾发表于it ... -
J2EE项目异常处理
2007-04-18 12:19 16423J2EE项目异常处理 ...
相关推荐
5. **使用JavaConfig开发Web应用程序**: - **JavaConfigWebApplicationContext**:专门为Web应用优化的容器实现。 6. **结合不同配置方法**: - **JavaConfig与XML结合**:可以同时使用JavaConfig和XML配置方式...
《Spring开发指南(夏昕)》是一本专为开发者准备的深入浅出的Spring框架学习资料,由知名技术专家夏昕编写。这本书旨在帮助读者理解并掌握Spring框架的核心概念、特性和最佳实践,从而在实际项目开发中游刃有余。 ...
《Spring Boot 中文指南》是针对Java开发人员的一份详细教程,主要讲解如何使用Spring Boot框架构建高效、简洁的应用程序。Spring Boot是Spring生态体系的一部分,它简化了Spring应用程序的初始设置和配置,使得...
Java Spring 技术路线导图是一份详尽的指南,旨在帮助开发者规划和理解Spring框架及其相关生态系统的深度和广度。Spring是Java领域中最受欢迎的开源框架之一,以其强大的功能和灵活性吸引了无数开发人员。它不仅提供...
在Java企业级应用开发中,Spring、Struts和Hibernate是三个非常重要的框架,它们共同构建了经典的MVC(Model-View-Controller)架构。本文将深入探讨这些框架的核心概念、功能以及它们如何协同工作,同时结合提供的...
### Spring MVC 学习指南详解 #### 一、Spring MVC 概述 Spring MVC 是 Spring 框架的一部分,主要用于构建基于 Model-View-Controller (MVC) 设计模式的 Web 应用程序。它提供了丰富的功能来简化 Web 开发过程,...
7. `config.xml`:这是Spring应用上下文的主要配置文件,包含了bean的定义和其他配置信息。开发者在此文件中声明服务、数据源、事务管理器等,定义bean的依赖注入。 8. `conf`:通常是一个包含其他配置文件的目录,...
《Java EE设计模式:...总之,《Java EE设计模式:Spring企业级开发最佳实践》是一本深度与广度并重的指南,它将帮助开发者深入理解如何在企业级应用中有效结合设计模式与Spring框架,实现高效、可靠的软件解决方案。
Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理。...这个高级详细开发指南将详细解析配置和代码,帮助读者深入理解Spring Security 3.1的工作原理和使用技巧,以便在实际项目中应用。
### Spring3_权威开发指南知识点总结 #### 一、Spring3与JavaEE6的关系 - **JavaEE6编程模型讨论**: - **JavaEE6够敏捷吗?**:本书探讨了JavaEE6是否真正达到了敏捷开发的标准。尽管JavaEE6引入了许多新特性来...
### Spring Security 3.1 高级开发指南详解 #### 一、Spring Security 3.1 使用方法概述 Spring Security 是一个强大的、高度可定制的身份验证和访问控制框架。Spring Security 3.1 版本提供了多种不同的配置方式...
Spring Boot是Java开发领域中的一款热门框架,它简化了基于Spring的应用程序开发,使得开发者能够快速构建可运行的独立应用程序。本指南将深入探讨Spring Boot的核心特性、优势以及如何使用它来构建微服务。 首先,...
在当今Java EE 开发中,Spring 框架是当之无愧的王者。而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring ...
### Spring Cloud参考指南知识点概述 #### 一、Spring Cloud概览 - **Spring Cloud**:一个开源框架,用于简化在云环境下开发微服务的过程。它提供了构建云原生应用的一系列工具,包括服务发现、配置管理、负载均衡...
Spring Cloud作为Java开发领域内的一个主流微服务框架,为开发者提供了丰富的工具和组件,以帮助实现这一目标。本文将深入探讨Spring Cloud的核心概念、关键组件以及如何使用它来构建分布式应用。 1. 微服务架构 ...
**Spring JdbcTemplate 使用指南** Spring框架中的JdbcTemplate是数据库操作的核心组件之一,它提供了一种简单、安全的方式来执行SQL查询和更新,而无需手动管理数据库连接。本指南将深入探讨JdbcTemplate的用法,...
在实际开发中,我们通常会创建一个MyBatis的配置文件(mybatis-config.xml),定义数据源、事务管理器等,并在Spring的配置文件中引用它们。Mapper接口和对应的XML映射文件用于定义SQL语句,Mapper接口的实现则可以...
《iBatis 开发指南(中文版)》是一份详细阐述如何使用 iBatis 进行数据访问层开发的文档。iBatis 是一个优秀的、轻量级的Java持久层框架,它允许开发者将SQL语句与Java代码分离,提高了数据库操作的灵活性和效率。...