Spring 2.5 Annotation
Reference:
http://www.ibm.com/developerworks/cn/java/j-lo-spring25-ioc/
http://www.ibm.com/developerworks/cn/java/j-lo-spring25-mvc/
http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-iocannt/
http://www.ibm.com/developerworks/cn/java/
《精通 Spring 2.x—企业应用开发精解》陈雄华 (quickselect@163.com), 技术总监, 宝宝淘网络科技有限公司
http://download.csdn.net/detail/zheng12tian/2584987
Appicable scene:
Spring with Annotation:
1) Bean 的依赖关系是固定的,(如 Service 使用了哪几个 DAO 类),这种配置信息不会在部署时发生调整。
2) 类是自己写的,可以在源码里面加入 Annotation.
Spring with XML:
1) 部署时需要修改的,放在xml里面修改后不需要编译源码,例如: 数据源、缓存池、持久层操作模板类、事务管理等内容的配置。
2) 引用第三方库,则无法修改源代码,例如:JdbcTemplate、SessionFactoryBean
Spring with xml:
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="boss" class="com.baobaotao.Boss">
<property name="car" ref="car"/>
<property name="office" ref="office" />
</bean>
<bean id="office" class="com.baobaotao.Office">
<property name="officeNo" value="002"/>
</bean>
<bean id="car" class="com.baobaotao.Car" scope="singleton">
<property name="brand" value="Jaguar XJ"/>
<property name="price" value="89"/>
</bean>
</beans>
注入属性 @Autowired
//标注在字段上
public class Boss {
@Autowired
private Car car;
@Autowired
private Office office;
}
//标注在方法上
public class Boss {
private Car car;
private Office office;
@Autowired
public void setCar(Car car) {
this.car = car;
}
}
//标注在构造函数上
public class Boss {
private Car car;
private Office office;
@Autowired
public Boss(Car car ,Office office){
this.car = car;
this.office = office ;
}
}
//beans.xml
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!-- Spring 通过一个 BeanPostProcessor 对 @Autowired 进行解析,所以要让 @Autowired 起作用必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。-->
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
<!-- 移除 boss Bean 的属性注入配置的信息, 扫描 Autowired 标注,注入属性, 默认按类型匹配 -->
<bean id="boss" class="com.baobaotao.Boss"/>
<bean id="office" class="com.baobaotao.Office">
<property name="officeNo" value="001"/>
</bean>
<bean id="car" class="com.baobaotao.Car" scope="singleton">
<property name="brand" value="Bugatti"/>
<property name="price" value="4200"/>
</bean>
</beans>
1) 当找不到一个匹配的 Bean 时,Spring 容器将抛出 BeanCreationException 异常,并指出必须至少拥有一个匹配的 Bean。可以使用 @Autowired(required = false)
2) 如果 Spring 容器中拥有多个候选 Bean,Spring 容器在启动时也会抛出 BeanCreationException 异常。
public class Boss {
@Autowired
private Car car;
@Autowired
@Qualifier("office")
private Office office;
}
@Autowired
public void setOffice(@Qualifier("office") Office office) {
this.office = office;
}
@Autowired 可以对成员变量、方法以及构造函数
@Qualifier 的标注对象是成员变量、方法入参、构造函数入参。
//自动注入的策略就从 byType 转变成 byName
@Resource 注入属性
@Autowired 是 Spring 提供的, 默认按 byType 自动注入
@Resource 是 JSR250 定义的, Spring 也支持,与 @Autowired 等效, (默认按 byName 自动注入)
让 @Resource 生效,需要加 <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>
public class Boss {
// 自动注入类型为 Car 的 Bean
@Resource
private Car car;
// 自动注入 bean 名称为 office 的 Bean
@Resource(name = "office")
private Office office;
}
JSR 250
JSR250 定义了 @Resource, @PostConstruct 和 @PreDestroy
@PostConstruct / @PreDestroy 等效于 实现 InitializingBean/DisposableBean 接口进行初始化和销毁。也可以通过 <bean> 元素的 init-method/destroy-method 属性指定初始化之后 / 销毁之前调用的操作方法。
@PostConstruct 可以定义在多个初始化方法上。而接口或者 init-method 只能一个。
让 JSR250的 Annotations 生效, 需要在 xml 里面加 BeanPostProcessor:
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(new String[] {"beans.xml"};);
Boss boss = (Boss) ctx.getBean("boss");
System.out.println(boss);
ctx.destroy();// 关闭 Spring 容器,以触发 Bean 销毁方法的执行
}
使用<context:annotation-config/> 简化配置
<context:annotationconfig/> 将隐式地向 Spring 容器注册 AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor、RequiredAnnotationBeanPostProcessor。
//beans.xml
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config/>
<bean id="boss" class="com.baobaotao.Boss"/>
<bean id="office" class="com.baobaotao.Office">
<property name="officeNo" value="001"/>
</bean>
<bean id="car" class="com.baobaotao.Car" scope="singleton">
<property name="brand" value=" 红旗 CA72"/>
<property name="price" value="2000"/>
</bean>
</beans>
使用 @Component
通过 @Autowired 或 @Resource 在 Bean 类中使用自动注入功能,
但是 Bean 还是在 XML 文件中通过 <bean> 进行定义 —— 也就是说,在 XML 配置文件中定义 Bean,通过 @Autowired 或 @Resource 为 Bean 的成员变量、方法入参或构造函数入参提供自动注入的功能。
通过注释定义 Bean,从 XML 配置文件中完全移除 Bean 定义的配置: @Component
//默认实例化为 car,首字母小写,也可以指定名称。 @Component("myCar")
@Component
public class Car {
…
}
@Component("boss")
public class Boss {
@Autowired
private Car car;
@Autowired
private Office office;
…
}
//beans.xml
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:component-scan base-package="com.baobaotao"/>
</beans>
Filter:
<context:component-scan base-package="com.baobaotao">
<context:include-filter type="regex" expression="com\.baobaotao\.service\..*"/>
<context:exclude-filter type="aspectj" expression="com.baobaotao.util..*"/>
</context:component-scan>
<context:component-scan/>
不但启用了对类包进行扫描以实施注释驱动 Bean 定义的功能,
同时还启用了注释驱动自动注入的功能(即还隐式地在内部注册了 AutowiredAnnotationBeanPostProcessor 和 CommonAnnotationBeanPostProcessor),
因此当使用 <context:component-scan/> 后,就可以将 <context:annotation-config/> 移除了。
Scope
默认情况下通过 @Component 定义的 Bean 都是 singleton 的,如果需要使用其它作用范围的 Bean,可以通过 @Scope 注释来达到目标
@Scope("prototype")
@Component("boss")
public class Boss {
…
}
采用具有特殊语义的注释
@Repository, @Service, @Controller, @Component 是等效的
但是从注释类的命名上,这 3 个注释分别和持久层、业务层和控制层(Web 层)相对应。
虽然目前这 3 个注释和 @Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能。
所以,如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用 @Repository, @Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释。
分享到:
相关推荐
Struts2、Hibernate3和Spring2.5是Java Web开发中的三大框架,它们各自负责不同的职责,但可以协同工作以构建高效的企业级应用。这里主要讨论的是如何将这三者结合,并利用注解(Annotation)进行配置,以简化开发...
在本文中,我们将探讨如何将Direct Web Remoting (DWR) 3.0与Spring 2.5框架整合,并利用注解(Annotation)进行配置。DWR是一个允许JavaScript与Java服务器端进行交互的库,而Spring 2.5引入了对注解的强大支持,...
2. **注解驱动开发(Annotation-based Development)**:Spring 2.5开始大规模支持Java注解,比如`@Service`、`@Repository`和`@Controller`,它们分别用于标记业务层、数据访问层和控制层的组件。这使得XML配置文件...
博文链接:https://pesome.iteye.com/blog/236273
Spring 2.5引入了更强大的依赖注入机制,允许通过注解(Annotation)来声明依赖,不再局限于XML配置。`@Autowired`注解可以自动装配bean,而`@Qualifier`则用于指定多个相同类型的bean中需要哪一个。这种改进使得...
spring2.5 + hibernate3.2x 标注(annotation)开发的简单示例 http://blog.csdn.net/IamHades/archive/2008/01/11/2038188.aspx
**Spring 2.5 中文帮助文档概述** Spring框架是Java平台上的...阅读"Spring2.5中文帮助手册.pdf"和"Spring2.5有哪些改进.txt"这两个文件,将能详细了解到这些改进的实施细节和使用方法,为实际开发工作提供有力支持。
2. **注解驱动的开发(Annotation-based Development)**:Spring 2.5引入了大量的新注解,如`@Autowired`、`@Service`、`@Repository`和`@Controller`等,极大地减少了XML配置文件的使用。这些注解简化了组件扫描和...
Spring 2.5 API 是 Spring 框架的一个版本,发布于2008年,是当时的一个重要更新。这个版本引入了许多新特性,优化了已有功能,并为后续的3.0版本打下了基础。以下将详细介绍 Spring 2.5 API 中的关键知识点。 一、...
Struts2、Spring2.5和Hibernate3.0是Java Web开发中三个非常重要的框架,它们各自负责不同的职责,但可以协同工作以构建高效、可维护的Web应用程序。本项目整合了这三个框架,并利用注解(Annotation)进行配置,...
2. **注解驱动的开发(Annotation-based Development)**:Spring 2.5大量引入了注解,例如`@Service`、`@Repository`和`@Controller`,用于标记业务层、数据访问层和表现层的类,简化了XML配置文件。 3. **AOP(面向...
《Spring2.5-中文参考手册》是一份详尽阐述Spring框架2.5版本的中文文档,对于理解和应用Spring框架的开发人员来说,是不可或缺的参考资料。这份CHM(Compiled HTML Help)版本的手册,集成了Spring 2.5的所有核心...
【Spring2.5的新特性】 Spring框架自诞生以来,一直致力于简化企业级应用的开发,提供强大且非侵入式的解决方案。Spring2.5在这个方向上迈出了一大步,尤其对于使用Java 5或更高版本的开发者来说,它带来了更多便利...
在Spring框架中,TestContext模块为开发者提供了强大的测试支持,特别是在Spring 2.5版本中,这个测试框架进一步增强了测试的便利性和可扩展性。它允许我们以声明式的方式配置和管理测试环境,包括bean的初始化、...
《Spring2.5中文开发手册》是一本专为Spring 2.5框架用户提供深度解析和实践指导的重要参考资料。Spring作为Java领域中极为重要的轻量级框架,2.5版本是其发展历程中的一个重要里程碑,它引入了许多增强特性和优化,...
在Spring 2.5版本中,面向切面编程(AOP)是一个强大的功能,它允许开发者定义“切面”来封装横切关注点,如日志、事务管理、权限检查等,使得代码更加模块化和可重用。AspectJ是一个成熟的AOP框架,Spring在其AOP...
首先,Spring2.5引入了基于注解的配置(Annotation-based Configuration),这极大地简化了XML配置文件的编写,使得应用程序的装配过程更加直观和简洁。开发者可以通过在类或方法上添加如@Service、@Repository、@...
Spring 2.5 版本引入了基于注释(Annotation)的配置,提供了完全基于注释配置 Bean、装配 Bean 的功能,以替换原来基于 XML 的配置。这种新的配置方式可以充分利用 Java 的反射机制获取类结构信息,减少配置的工作...
《Spring 2.5 开发参考手册》是针对Spring框架2.5版本的一份详尽指南,该版本在Spring框架的发展历程中具有重要的里程碑意义。它引入了许多创新特性和改进,旨在提升开发者的工作效率和应用的灵活性。以下将对Spring...