- 浏览: 184573 次
- 性别:
- 来自: 深圳
最新评论
-
mengfei86:
你们讨论的时候我刚上大学,。。。。、、现在都过去好多年了,。 ...
J2EE项目异常处理 -
di1984HIT:
文章不错,学习了
Ibatis读写CLOB数据 -
wulixiaodao:
main{
metodA();
}
详解spring事务属性 -
wulixiaodao:
Main{
Connection con=null;
...
详解spring事务属性 -
tao_gun:
感谢,有点懂了
详解spring事务属性
lazy |
Lazy
|
延时初始化策略
|
UNSPECIFIED
|
|
meta |
Meta[]
|
当前bean的元数据
|
{}
|
|
scope |
String
|
Bean的作用域
|
singleton
|
Singleton,prototype或自定义作用域
|
使用纯java方式的bean定义时,处理静态方法时,不再需要-Factory-method
java 代码
- @Bean
- public ExampleBean exampleBean() {
- return ExampleFactory.createBean();
- }
当用方法来定义一个Bean时,这个方法必须是public的。
示例:使用aliases元素。,定义一个Bean,别名为hello
java 代码
- @Bean(aliases={"hello"})
- public HelloWorld helloWorld(){
- HelloWorld helloWorld = new HelloWorld();
- helloWorld.setWord(word());
- return helloWorld;
- }
java 代码
- public static void main(String[] args){
- ApplicationContext context = new AnnotationApplicationContext(ConfigurationFull.class.getName());
- HelloWorld hello = (HelloWorld)context.getBean("hello");
- hello.sayHello();
- }
1.1 @ExternalBean
指定Bean是一个外部Bean
示例:
java 代码
- @Configuration
- public abstract class ExternalConfiguration {
- @ExternalBean
- public abstract HelloWorld helloWorld();
- }
java 代码
- public class ConfigurationWithExternal {
- public static void main(String[] args){
- ApplicationContext context = new AnnotationApplicationContext(ConfigurationFull.class.getName(),ExternalConfiguration.class.getName());
- HelloWorld hello = (HelloWorld)context.getBean("helloWorld");
- hello.sayHello();
- }
- }
这里,在ExternalConfiguration中定义的helloWorld自动会被,在ConfigurationFull中定义的helloWorld覆盖。
所以,@ExtenalBean的意思是,这个是在父Context中定义的,这个父context可以是一个Configuration或是一个外部的xml文件。使用这个注释的好处是为了保持重构友好。
1.2 @ScopedProxy
Spring通过scoped proxies提供了一个方便的作用域依赖的处理方法。最简单的方式就是创建一个代理。在当使用xml配置时,使用<aop:scoped-proxies></aop:scoped-proxies>元素。JavaConfig提供了一个等价物就是@ScopedProxy,它提供了<aop:scoped-proxies></aop:scoped-proxies>相同的语义和配置选项。
java 代码
- @Bean(scope = DefaultScopes.SESSION)
- @ScopedProxy
- public UserPreferences userPreferences() {
- return new UserPreferences();
- }
- @Bean
- public Service userService() {
- UserService service = new SimpleUserService();
- // a reference to the proxied 'userPreferences' bean
- service.seUserPreferences(userPreferences());
- return service;
- }
<aop:scoped-proxies></aop:scoped-proxies>及@ScopedProxy就是提供了这样的功能。
2. Bean的可见度
JavaConfig有一个非常好的特性就是可以控制Bean的可见度。JavaConfig可以使用Java方法的可见度修饰符来决定Bean是否可以被Application Context 和Bean Factory访问
java 代码
- @Configuration
- public class VisibilityConfiguration {
- @Bean
- public UserInfo publicUserInfo(){
- UserInfo user = new UserInfo();
- user.setName(protectedName());
- user.setAddres(privateAddres());
- return user;
- }
- @Bean
- protected String protectedName(){
- String name = "jack";
- return name;
- }
- private String privateAddres(){
- String addres= "Beijing";
- return addres;
- }
- }
java 代码
- public class ConfigurationWithVisibility {
- public static void main(String[] args){
- ApplicationContext context = new AnnotationApplicationContext(VisibilityConfiguration.class.getName());
- UserInfo user = (UserInfo)context.getBean("publicUserInfo");
- String name = (String)context.getBean("protectedName");
- String addres = (String)context.getBean("privateAddres");
- }
- }
当我们在Context中访问"protectedName"或"privateAddres"时都会抛出异常
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'protectedName' is defined
但是在VisibilityConfiguration内部,三个Bean是相互可以访问的。
所以如果在用@Bean注释的方法,如果不是public的,是不能被外部的ApplicationContext访问的。
JavaConfig 提供了Bean的可见度功能,利用Spring提供的层级应用上下文,用一个特殊的Configuration类来放置所有的隐藏Bean,在一个子应用上下文内,隐藏Bean能够访问父应用上下文定义的Bean。而父应用上下文的Bean却不能访问子应用上下文的隐藏Bean.
3. Bean的依赖设置
装配一个Bean,最简单的方法就是java提供的构造函数
java 代码
- @Bean(scope=DefaultScopes.PROTOTYPE)
- public UserInfo userInfo(){
- UserInfo user = new UserInfo();
- user.setName(name());
- return user;
- }
- @Bean(scope=DefaultScopes.SINGLETON)
- public String name(){
- String name = "jack";
- return name;
- }
Bean之间依赖的设置通过bean的方法名来进行设置,并不是通过bean名称。
Name()方法被@Bean注释后,它的Bean名称是name,但是在userInfo方法,来设置name属性是仍然需要使用方法名name(),而不是bean名称name.
java 代码
- 当使用@Bean标记后,Bean都会由Spring容器进行管理。UserInfo声明为prototype,而name声明为singleton.
- ApplicationContext context = new AnnotationApplicationContext(VisibilityConfiguration.class.getName());
- UserInfo user = (UserInfo)context.getBean("userInfo");
- UserInfo user2 =(UserInfo)context.getBean("userInfo");
- System.out.println(user == user2);
- String name = (String)context.getBean("name");
- String name2 = (String)context.getBean("name");
- System.out.println(name == name2);
false
true
可见,被@Bean标记后,每次从ApplicationContext中获得的userInfo的对象都不是同一个对象。而每次获得的name的对象都是同一个对象。
4. 使用JavaConfig
我们在前面的例子,已经多次看到了AnnotationApplicationContext的使用。现在来全面介绍AnnotationApplicationContext.
AnnotationApplicationContext提供了四个构造函数。
1.public AnnotationApplicationContext(java.lang.Class... classes)
可以把多个Configuration类构造成一个ApplicationContext
2. public AnnotationApplicationContext(java.lang.String... locations)
除了可以接收多个完整的Configuration类构造成一个ApplicationContext外,还可以接改ant风格的类路径。
例如:ApplicationContext context = new AnnotationApplicationContext(ConfigurationFull.class.getName(),ExternalConfiguration.class.getName());
ApplicationContext context = new AnnotationApplicationContext("**/configuration/*Configuration.class");
3.public AnnotationApplicationContext(org.springframework.context.ApplicationContext parent)
给定一个父ApplicationContext来构造一个AnnotationApplicationContext.
4. public AnnotationApplicationContext()
一个默认的构造函数
上面这些都是针对Configuration类的。而我们更多的时候需要与xml结合进行使用。
这就需要使用到org.springframework.config.java.process.ConfigurationPostProcessor.
java 代码
- <!---->"1.0" encoding="UTF-8"?>
- <!---->"-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
- <beans></beans>
- class="com.springconfig.example.chapter3.ConfigurationFull">
- class="org.springframework.config.java.process.ConfigurationPostProcessor"/>
java 代码
- public static void main(String[] args){
- ApplicationContext context = new ClassPathXmlApplicationContext("com/springconfig/example/chapter3/applicationContext.xml");
- String word = (String)context.getBean("word");
- System.out.println(word);
- }
- }
程序运行结果
HelloWorld!
注意,外部的xml可以直接使用Configuration中配置的Bean,而Configuration中的Bean需要使用Xml中的Bean,则需要使用@External注释。
5. Bean的命名策略
使用JavaConfig由方法产生的Bean,其方法名就是Bean名称。但是当多个方法重名,或者有多个Congiguration或与外部xml混用时,这种方式并不合适。不同的类全覆盖彼此的定义。为了自定义bean名称产生的行为,可以能过实现BeanNamingStrategy 接口来提供它自己的bean名称产生策略
BenaNamingStrategy有一个默认的实现MethodNameStrategy
MethodNameStrategy提供了一个prefix属性,用于指定Bean的前辍的产生方式
Prefix有三个取值。
NONE:即没有前辍,仍然使用方法名作为Bean的名称。
CLASS:使用类名称为作Bean的前辍,中间以.号相连。如:ConfigurationFull.word
FQN:使用完整的类路径作为Bean的前辍。如:com.springconfig.example.chapter3.ConfigurationFull.word
下面就这三种方式进行说明:
java 代码
- <!---->"1.0" encoding="UTF-8"?>
- <!---->"-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
- <beans></beans>
- class="com.springconfig.example.chapter3.ConfigurationFull">
- class="org.springframework.config.java.process.ConfigurationPostProcessor">
- "namingStrategy">
- class="org.springframework.config.java.naming.MethodNameStrategy">
- "prefix" value="CLASS"/>
java 代码
- public static void main(String[] args){
- ApplicationContext context = new ClassPathXmlApplicationContext("com/springconfig/example/chapter3/applicationContext.xml");
- String word = (String)context.getBean("ConfigurationFull.word");
- System.out.println(word);
- }
- }
程序输出:
HelloWorld!
把上面的prefix属性值换成FQN
java 代码
- public static void main(String[] args){
- ApplicationContext context = new ClassPathXmlApplicationContext("com/springconfig/example/chapter3/applicationContext.xml");
- String word = (String)context.getBean("com.springconfig.example.chapter3.ConfigurationFull.word");
- System.out.println(word);
- }
程序输出:
HelloWorld!
6. 注释还是XML
Spring因为XML大量使用而受到了越来越多的批评,也使得基于Spring的项目变得越来越复杂。使用XML来配置Bean,它无法进行类型安全检查,当类名称或方法名被改名之后,XML中的相应配置无法随之改变。这对项目的重构带来了极大的不方便。随着JAVA EE 5,JAVA EE 6的相继推出,其中一个最大的特性就是注释的使用。当Spring使用注释来Bean时,就可以在一个纯java的类中配置Bean.因为是在纯java的环境中,可以获得编译期类型安全检查的好处,当Bean的类名或方法名进行重构修改后,Configuration中的相应的定义会被同时修改。
JavaConfig就是为了简化Spring项目的产生的,JavaConfig的使用也非常的简单,可见JavaConfig应该是简化Spring项目的一种最好解决方式。但是并不意味着,JavaConfig就应该完全的取代xml配置。Xml的优势是就是配置的灵活性和参数化以及访问外部环境,以及在web系统中的应用。JavaConfig并不排斥xml,相反,它可以和xml很好的相结合,来降低spring项目开发的复杂度。在未来,xml应该会成为JavaConfig的补充。
7. 关于文档
该文档是一个全免费的文档,可以免费传播。引用请获得作者的同意!
发表评论
-
一个特殊的异常处理
2008-12-13 23:59 1403一个特殊的异常处理 文:袁光东 一、业务需求说明 前段时间接 ... -
程序员为什么不写单元测试
2007-07-04 11:31 29236程序员为什么不写单 ... -
Spring JavaConfig开发指南(上)
2007-06-03 10:25 7788Spring JavaConfig开发指南 作者:袁光东 1. ... -
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 开发过程,...
《Spring 深度整合指南》是一本专为开发者深入理解Spring框架及其与其他技术整合而编写的书籍。...总之,《Spring 深度整合指南》将引领读者全面探索Spring的世界,提升其在实际开发中的技能和效率。
《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**:一个开源框架,用于简化在云环境下开发微服务的过程。它提供了构建云原生应用的一系列工具,包括服务发现、配置管理、负载均衡、断路器、API网关等功能。 #### 二、服务发现 - **服务发现**:...
Spring Cloud作为Java开发领域内的一个主流微服务框架,为开发者提供了丰富的工具和组件,以帮助实现这一目标。本文将深入探讨Spring Cloud的核心概念、关键组件以及如何使用它来构建分布式应用。 1. 微服务架构 ...
在实际开发中,我们通常会创建一个MyBatis的配置文件(mybatis-config.xml),定义数据源、事务管理器等,并在Spring的配置文件中引用它们。Mapper接口和对应的XML映射文件用于定义SQL语句,Mapper接口的实现则可以...
**Spring JdbcTemplate 使用指南** Spring框架中的JdbcTemplate是数据库操作的核心组件之一,它提供了一种简单、安全的方式来执行SQL查询和更新,而无需手动管理数据库连接。本指南将深入探讨JdbcTemplate的用法,...
《iBatis 开发指南(中文版)》是一份详细阐述如何使用 iBatis 进行数据访问层开发的文档。iBatis 是一个优秀的、轻量级的Java持久层框架,它允许开发者将SQL语句与Java代码分离,提高了数据库操作的灵活性和效率。...