`
louisling
  • 浏览: 143870 次
  • 性别: Icon_minigender_1
  • 来自: ZhuHai
社区版块
存档分类
最新评论

Spring 2.5 Annotation

 
阅读更多
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 annotation 整合

    Struts2、Hibernate3和Spring2.5是Java Web开发中的三大框架,它们各自负责不同的职责,但可以协同工作以构建高效的企业级应用。这里主要讨论的是如何将这三者结合,并利用注解(Annotation)进行配置,以简化开发...

    配置整合DWR3.0和Spring2.5使用annotation注解

    在本文中,我们将探讨如何将Direct Web Remoting (DWR) 3.0与Spring 2.5框架整合,并利用注解(Annotation)进行配置。DWR是一个允许JavaScript与Java服务器端进行交互的库,而Spring 2.5引入了对注解的强大支持,...

    传智播客spring2.5源代码

    2. **注解驱动开发(Annotation-based Development)**:Spring 2.5开始大规模支持Java注解,比如`@Service`、`@Repository`和`@Controller`,它们分别用于标记业务层、数据访问层和控制层的组件。这使得XML配置文件...

    Spring MVC 2.5 annotation 学习

    博文链接:https://pesome.iteye.com/blog/236273

    spring2.5源码

    Spring 2.5引入了更强大的依赖注入机制,允许通过注解(Annotation)来声明依赖,不再局限于XML配置。`@Autowired`注解可以自动装配bean,而`@Qualifier`则用于指定多个相同类型的bean中需要哪一个。这种改进使得...

    spring2.5+hibernate3.2

    spring2.5 + hibernate3.2x 标注(annotation)开发的简单示例 http://blog.csdn.net/IamHades/archive/2008/01/11/2038188.aspx

    Spring2.5中文帮助文档

    **Spring 2.5 中文帮助文档概述** Spring框架是Java平台上的...阅读"Spring2.5中文帮助手册.pdf"和"Spring2.5有哪些改进.txt"这两个文件,将能详细了解到这些改进的实施细节和使用方法,为实际开发工作提供有力支持。

    spring2.5官方jar

    2. **注解驱动的开发(Annotation-based Development)**:Spring 2.5引入了大量的新注解,如`@Autowired`、`@Service`、`@Repository`和`@Controller`等,极大地减少了XML配置文件的使用。这些注解简化了组件扫描和...

    spring2.5 api

    Spring 2.5 API 是 Spring 框架的一个版本,发布于2008年,是当时的一个重要更新。这个版本引入了许多新特性,优化了已有功能,并为后续的3.0版本打下了基础。以下将详细介绍 Spring 2.5 API 中的关键知识点。 一、...

    struts2 spring2.5 hibernate3.0 annotation 整合

    Struts2、Spring2.5和Hibernate3.0是Java Web开发中三个非常重要的框架,它们各自负责不同的职责,但可以协同工作以构建高效、可维护的Web应用程序。本项目整合了这三个框架,并利用注解(Annotation)进行配置,...

    spring2.5.jar

    2. **注解驱动的开发(Annotation-based Development)**:Spring 2.5大量引入了注解,例如`@Service`、`@Repository`和`@Controller`,用于标记业务层、数据访问层和表现层的类,简化了XML配置文件。 3. **AOP(面向...

    Spring2.5-中文参考手册

    《Spring2.5-中文参考手册》是一份详尽阐述Spring框架2.5版本的中文文档,对于理解和应用Spring框架的开发人员来说,是不可或缺的参考资料。这份CHM(Compiled HTML Help)版本的手册,集成了Spring 2.5的所有核心...

    Spring2.5的新特性

    【Spring2.5的新特性】 Spring框架自诞生以来,一直致力于简化企业级应用的开发,提供强大且非侵入式的解决方案。Spring2.5在这个方向上迈出了一大步,尤其对于使用Java 5或更高版本的开发者来说,它带来了更多便利...

    使用 Spring 2.5 TestContext 测试框架

    在Spring框架中,TestContext模块为开发者提供了强大的测试支持,特别是在Spring 2.5版本中,这个测试框架进一步增强了测试的便利性和可扩展性。它允许我们以声明式的方式配置和管理测试环境,包括bean的初始化、...

    Spring2.5中文开发手册

    《Spring2.5中文开发手册》是一本专为Spring 2.5框架用户提供深度解析和实践指导的重要参考资料。Spring作为Java领域中极为重要的轻量级框架,2.5版本是其发展历程中的一个重要里程碑,它引入了许多增强特性和优化,...

    Spring2.5使用AOP需要的aspectJ

    在Spring 2.5版本中,面向切面编程(AOP)是一个强大的功能,它允许开发者定义“切面”来封装横切关注点,如日志、事务管理、权限检查等,使得代码更加模块化和可重用。AspectJ是一个成熟的AOP框架,Spring在其AOP...

    Spring2.5_学习笔记.doc.zip

    首先,Spring2.5引入了基于注解的配置(Annotation-based Configuration),这极大地简化了XML配置文件的编写,使得应用程序的装配过程更加直观和简洁。开发者可以通过在类或方法上添加如@Service、@Repository、@...

    Spring2.5详细注解.doc

    Spring 2.5 版本引入了基于注释(Annotation)的配置,提供了完全基于注释配置 Bean、装配 Bean 的功能,以替换原来基于 XML 的配置。这种新的配置方式可以充分利用 Java 的反射机制获取类结构信息,减少配置的工作...

    spring2.5开发参考手册.rar

    《Spring 2.5 开发参考手册》是针对Spring框架2.5版本的一份详尽指南,该版本在Spring框架的发展历程中具有重要的里程碑意义。它引入了许多创新特性和改进,旨在提升开发者的工作效率和应用的灵活性。以下将对Spring...

Global site tag (gtag.js) - Google Analytics