`
js-code
  • 浏览: 96115 次
  • 性别: Icon_minigender_1
  • 来自: 兰州
社区版块
存档分类
最新评论

使用spring2.5注释驱动的IOC功能

    博客分类:
  • SSH
阅读更多

注释配置相对于 XML 配置具有很多的优势:

它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作。如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO 的属性名、类型等信息,如果关系表字段和 PO 属性名、类型都一致,您甚至无需编写任务属性映射信息——因为这些信息都可以通过 Java 反射机制获取。
注释和 Java 代码位于一个文件中,而 XML 配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和 Java 代码放在一起,有助于增强程序的内聚性。而采用独立的 XML 配置文件,程序员在编写一个功能时,往往需要在程序文件和配置文件中不停切换,这种思维上的不连贯会降低开发效率。
因此在很多情况下,注释配置比 XML 配置更受欢迎,注释配置有进一步流行的趋势。Spring 2.5 的一大增强就是引入了很多注释类,现在您已经可以使用注释配置完成大部分 XML 配置的功能。在这篇文章里,我们将向您讲述使用注释进行 Bean 定义和依赖注入的内容。






回页首




原来我们是怎么做的

在使用注释配置之前,先来回顾一下传统上是如何配置 Bean 并完成 Bean 之间依赖关系的建立。下面是 3 个类,它们分别是 Office、Car 和 Boss,这 3 个类需要在 Spring 容器中配置为 Bean:

Office 仅有一个属性:


清单 1. Office.java
               

Java代码 复制代码
  1. package com.baobaotao;   
  2. public class Office {   
  3.     private String officeNo =”001”;   
  4.   
  5.     //省略 get/setter   
  6.   
  7.     @Override  
  8.     public String toString() {   
  9.         return "officeNo:" + officeNo;   
  10.     }   
  11. }  
package com.baobaotao;
public class Office {
    private String officeNo =”001”;

    //省略 get/setter

    @Override
    public String toString() {
        return "officeNo:" + officeNo;
    }
}




Car 拥有两个属性:


清单 2. Car.java
               
Java代码 复制代码
  1. package com.baobaotao;   
  2.   
  3. public class Car {   
  4.     private String brand;   
  5.     private double price;   
  6.   
  7.     // 省略 get/setter   
  8.   
  9.     @Override  
  10.     public String toString() {   
  11.         return "brand:" + brand + "," + "price:" + price;   
  12.     }   
  13. }  
package com.baobaotao;

public class Car {
    private String brand;
    private double price;

    // 省略 get/setter

    @Override
    public String toString() {
        return "brand:" + brand + "," + "price:" + price;
    }
}




Boss 拥有 Office 和 Car 类型的两个属性:


清单 3. Boss.java
               
Java代码 复制代码
  1. package com.baobaotao;   
  2.   
  3. public class Boss {   
  4.     private Car car;   
  5.     private Office office;   
  6.   
  7.     // 省略 get/setter   
  8.   
  9.     @Override  
  10.     public String toString() {   
  11.         return "car:" + car + "\n" + "office:" + office;   
  12.     }   
  13. }  
package com.baobaotao;

public class Boss {
    private Car car;
    private Office office;

    // 省略 get/setter

    @Override
    public String toString() {
        return "car:" + car + "\n" + "office:" + office;
    }
}




我们在 Spring 容器中将 Office 和 Car 声明为 Bean,并注入到 Boss Bean 中:下面是使用传统 XML 完成这个工作的配置文件 beans.xml:


清单 4. beans.xml 将以上三个类配置成 Bean
               
Xml代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans    
  5.  http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
  6.     <bean id="boss" class="com.baobaotao.Boss">  
  7.         <property name="car" ref="car"/>  
  8.         <property name="office" ref="office" />  
  9.     </bean>  
  10.     <bean id="office" class="com.baobaotao.Office">  
  11.         <property name="officeNo" value="002"/>  
  12.     </bean>  
  13.     <bean id="car" class="com.baobaotao.Car" scope="singleton">  
  14.         <property name="brand" value=" 红旗 CA72"/>  
  15.         <property name="price" value="2000"/>  
  16.     </bean>  
  17. </beans>  
<?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=" 红旗 CA72"/>
        <property name="price" value="2000"/>
    </bean>
</beans>



当我们运行以下代码时,控制台将正确打出 boss 的信息:


清单 5. 测试类:AnnoIoCTest.java
               
Java代码 复制代码
  1. import org.springframework.context.ApplicationContext;   
  2. import org.springframework.context.support.ClassPathXmlApplicationContext;   
  3. public class AnnoIoCTest {   
  4.   
  5.     public static void main(String[] args) {   
  6.         String[] locations = {"beans.xml"};   
  7.         ApplicationContext ctx =    
  8.             new ClassPathXmlApplicationContext(locations);   
  9.         Boss boss = (Boss) ctx.getBean("boss");   
  10.         System.out.println(boss);   
  11.     }   
  12. }   
  13.    
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AnnoIoCTest {

    public static void main(String[] args) {
        String[] locations = {"beans.xml"};
        ApplicationContext ctx = 
		    new ClassPathXmlApplicationContext(locations);
        Boss boss = (Boss) ctx.getBean("boss");
        System.out.println(boss);
    }
}
 


这说明 Spring 容器已经正确完成了 Bean 创建和装配的工作。






使用 @Autowired 注释

Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。来看一下使用 @Autowired 进行成员变量自动注入的代码:


清单 6. 使用 @Autowired 注释的 Boss.java
               
Java代码 复制代码
  1. package com.baobaotao;   
  2. import org.springframework.beans.factory.annotation.Autowired;   
  3.   
  4. public class Boss {   
  5.   
  6.     @Autowired  
  7.     private Car car;   
  8.   
  9.     @Autowired  
  10.     private Office office;   
  11.   
  12.     …   
  13. }  
package com.baobaotao;
import org.springframework.beans.factory.annotation.Autowired;

public class Boss {

    @Autowired
    private Car car;

    @Autowired
    private Office office;

    …
}



Spring 通过一个 BeanPostProcessor 对 @Autowired 进行解析,所以要让 @Autowired 起作用必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。


清单 7. 让 @Autowired 注释工作起来
               
Xml代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans    
  5.  http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
  6.   
  7.     <!-- 该 BeanPostProcessor 将自动起作用,对标注 @Autowired 的 Bean 进行自动注入 -->  
  8.     <bean class="org.springframework.beans.factory.annotation.   
  9.         AutowiredAnnotationBeanPostProcessor"/>  
  10.   
  11.     <!-- 移除 boss Bean 的属性注入配置的信息 -->  
  12.     <bean id="boss" class="com.baobaotao.Boss"/>  
  13.     
  14.     <bean id="office" class="com.baobaotao.Office">  
  15.         <property name="officeNo" value="001"/>  
  16.     </bean>  
  17.     <bean id="car" class="com.baobaotao.Car" scope="singleton">  
  18.         <property name="brand" value=" 红旗 CA72"/>  
  19.         <property name="price" value="2000"/>  
  20.     </bean>  
  21. </beans>  
<?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">

    <!-- 该 BeanPostProcessor 将自动起作用,对标注 @Autowired 的 Bean 进行自动注入 -->
    <bean class="org.springframework.beans.factory.annotation.
        AutowiredAnnotationBeanPostProcessor"/>

    <!-- 移除 boss Bean 的属性注入配置的信息 -->
    <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>



这样,当 Spring 容器启动时,AutowiredAnnotationBeanPostProcessor 将扫描 Spring 容器中所有 Bean,当发现 Bean 中拥有 @Autowired 注释时就找到和其匹配(默认按类型匹配)的 Bean,并注入到对应的地方中去。

按照上面的配置,Spring 将直接采用 Java 反射机制对 Boss 中的 car 和 office 这两个私有成员变量进行自动注入。所以对成员变量使用 @Autowired 后,您大可将它们的 setter 方法(setCar() 和 setOffice())从 Boss 中删除。

当然,您也可以通过 @Autowired 对方法或构造函数进行标注,来看下面的代码:


清单 8. 将 @Autowired 注释标注在 Setter 方法上
               
Java代码 复制代码
  1. package com.baobaotao;   
  2.   
  3. public class Boss {   
  4.     private Car car;   
  5.     private Office office;   
  6.   
  7.      @Autowired  
  8.     public void setCar(Car car) {   
  9.         this.car = car;   
  10.     }   
  11.     
  12.     @Autowired  
  13.     public void setOffice(Office office) {   
  14.         this.office = office;   
  15.     }   
  16.     …   
  17. }  
package com.baobaotao;

public class Boss {
    private Car car;
    private Office office;

     @Autowired
    public void setCar(Car car) {
        this.car = car;
    }
 
    @Autowired
    public void setOffice(Office office) {
        this.office = office;
    }
    …
}



这时,@Autowired 将查找被标注的方法的入参类型的 Bean,并调用方法自动注入这些 Bean。而下面的使用方法则对构造函数进行标注:


清单 9. 将 @Autowired 注释标注在构造函数上
               
Java代码 复制代码
  1. package com.baobaotao;   
  2.   
  3. public class Boss {   
  4.     private Car car;   
  5.     private Office office;   
  6.     
  7.     @Autowired  
  8.     public Boss(Car car ,Office office){   
  9.         this.car = car;   
  10.         this.office = office ;   
  11.     }   
  12.     
  13.     …   
  14. }  
package com.baobaotao;

public class Boss {
    private Car car;
    private Office office;
 
    @Autowired
    public Boss(Car car ,Office office){
        this.car = car;
        this.office = office ;
    }
 
    …
}



由于 Boss() 构造函数有两个入参,分别是 car 和 office,@Autowired 将分别寻找和它们类型匹配的 Bean,将它们作为 Boss(Car car ,Office office) 的入参来创建 Boss Bean。






当候选 Bean 数目不为 1 时的应对方法

在默认情况下使用 @Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。当找不到一个匹配的 Bean 时,Spring 容器将抛出 BeanCreationException 异常,并指出必须至少拥有一个匹配的 Bean。我们可以来做一个实验:


清单 10. 候选 Bean 数目为 0 时
               
Xml代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.      xsi:schemaLocation="http://www.springframework.org/schema/beans    
  5.  http://www.springframework.org/schema/beans/spring-beans-2.5.xsd ">  
  6.     
  7.     <bean class="org.springframework.beans.factory.annotation.   
  8.         AutowiredAnnotationBeanPostProcessor"/>    
  9.   
  10.     <bean id="boss" class="com.baobaotao.Boss"/>  
  11.   
  12.     <!-- 将 office Bean 注释掉 -->  
  13.     <!-- <bean id="office" class="com.baobaotao.Office">  
  14.     <property name="officeNo" value="001"/>  
  15.     </bean>-->  
  16.   
  17.     <bean id="car" class="com.baobaotao.Car" scope="singleton">  
  18.         <property name="brand" value=" 红旗 CA72"/>  
  19.         <property name="price" value="2000"/>  
  20.     </bean>  
  21. </beans>  
<?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 class="org.springframework.beans.factory.annotation.
        AutowiredAnnotationBeanPostProcessor"/> 

    <bean id="boss" class="com.baobaotao.Boss"/>

    <!-- 将 office Bean 注释掉 -->
    <!-- <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>



由于 office Bean 被注释掉了,所以 Spring 容器中将没有类型为 Office 的 Bean 了,而 Boss 的 office 属性标注了 @Autowired,当启动 Spring 容器时,异常就产生了。

当不能确定 Spring 容器中一定拥有某个类的 Bean 时,可以在需要自动注入该类 Bean 的地方可以使用 @Autowired(required = false),这等于告诉 Spring:在找不到匹配 Bean 时也不报错。来看一下具体的例子:


清单 11. 使用 @Autowired(required = false)
               
Java代码 复制代码
  1. package com.baobaotao;   
  2.   
  3. import org.springframework.beans.factory.annotation.Autowired;   
  4. import org.springframework.beans.factory.annotation.Required;   
  5.   
  6. public class Boss {   
  7.   
  8.     private Car car;   
  9.     private Office office;   
  10.   
  11.     @Autowired  
  12.     public void setCar(Car car) {   
  13.         this.car = car;   
  14.     }   
  15.     @Autowired(required = false)   
  16.     public void setOffice(Office office) {   
  17.         this.office = office;   
  18.     }   
  19.     …   
  20. }  
package com.baobaotao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Required;

public class Boss {

    private Car car;
    private Office office;

    @Autowired
    public void setCar(Car car) {
        this.car = car;
    }
    @Autowired(required = false)
    public void setOffice(Office office) {
        this.office = office;
    }
    …
}



当然,一般情况下,使用 @Autowired 的地方都是需要注入 Bean 的,使用了自动注入而又允许不注入的情况一般仅会在开发期或测试期碰到(如为了快速启动 Spring 容器,仅引入一些模块的 Spring 配置文件),所以 @Autowired(required = false) 会很少用到。

和找不到一个类型匹配 Bean 相反的一个错误是:如果 Spring 容器中拥有多个候选 Bean,Spring 容器在启动时也会抛出 BeanCreationException 异常。来看下面的例子:


清单 12. 在 beans.xml 中配置两个 Office 类型的 Bean
               

Xml代码 复制代码
  1. <bean id="office" class="com.baobaotao.Office">  
  2.     <property name="officeNo" value="001"/>  
  3. </bean>  
  4. <bean id="office2" class="com.baobaotao.Office">  
  5.     <property name="officeNo" value="001"/>  
  6. </bean>  
<bean id="office" class="com.baobaotao.Office">
    <property name="officeNo" value="001"/>
</bean>
<bean id="office2" class="com.baobaotao.Office">
    <property name="officeNo" value="001"/>
</bean>




我们在 Spring 容器中配置了两个类型为 Office 类型的 Bean,当对 Boss 的 office 成员变量进行自动注入时,Spring 容器将无法确定到底要用哪一个 Bean,因此异常发生了。

Spring 允许我们通过 @Qualifier 注释指定注入 Bean 的名称,这样歧义就消除了,可以通过下面的方法解决异常:


清单 13. 使用 @Qualifier 注释指定注入 Bean 的名称
Java代码 复制代码
  1.                    
  2. @Autowired  
  3. public void setOffice(@Qualifier("office")Office office) {   
  4.     this.office = office;   
  5. }   
  6.    
                
@Autowired
public void setOffice(@Qualifier("office")Office office) {
    this.office = office;
}
 



@Qualifier("office") 中的 office 是 Bean 的名称,所以 @Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了。@Autowired 可以对成员变量、方法以及构造函数进行注释,而 @Qualifier 的标注对象是成员变量、方法入参、构造函数入参。正是由于注释对象的不同,所以 Spring 不将 @Autowired 和 @Qualifier 统一成一个注释类。下面是对成员变量和构造函数入参进行注释的代码:

对成员变量进行注释:


清单 14. 对成员变量使用 @Qualifier 注释
               
Java代码 复制代码
  1. public class Boss {   
  2.     @Autowired  
  3.     private Car car;   
  4.     
  5.     @Autowired  
  6.     @Qualifier("office")   
  7.     private Office office;   
  8.     …   
  9. }  
public class Boss {
    @Autowired
    private Car car;
 
    @Autowired
    @Qualifier("office")
    private Office office;
    …
}




对构造函数入参进行注释:


清单 15. 对构造函数变量使用 @Qualifier 注释
Java代码 复制代码
  1.                    
  2. public class Boss {   
  3.     private Car car;   
  4.     private Office office;   
  5.   
  6.     @Autowired  
  7.     public Boss(Car car , @Qualifier("office")Office office){   
  8.         this.car = car;   
  9.         this.office = office ;   
  10.     }   
  11. }   
  12.    
                
public class Boss {
    private Car car;
    private Office office;

    @Autowired
    public Boss(Car car , @Qualifier("office")Office office){
        this.car = car;
        this.office = office ;
	}
}
 



@Qualifier 只能和 @Autowired 结合使用,是对 @Autowired 有益的补充。一般来讲,@Qualifier 对方法签名中入参进行注释会降低代码的可读性,而对成员变量注释则相对好一些。





使用 JSR-250 的注释

Spring 不但支持自己定义的 @Autowired 的注释,还支持几个由 JSR-250 规范定义的注释,它们分别是 @Resource、@PostConstruct 以及 @PreDestroy。

@Resource

@Resource 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,面 @Resource 默认按 byName 自动注入罢了。@Resource 有两个属性是比较重要的,分别是 name 和 type,Spring 将 @Resource 注释的 name 属性解析为 Bean 的名字,而 type 属性则解析为 Bean 的类型。所以如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性,这时将通过反射机制使用 byName 自动注入策略。

Resource 注释类位于 Spring 发布包的 lib/j2ee/common-annotations.jar 类包中,因此在使用之前必须将其加入到项目的类库中。来看一个使用 @Resource 的例子:


清单 16. 使用 @Resource 注释的 Boss.java
               
Java代码 复制代码
  1. package com.baobaotao;   
  2.   
  3. import javax.annotation.Resource;   
  4.   
  5. public class Boss {   
  6.     // 自动注入类型为 Car 的 Bean   
  7.     @Resource  
  8.     private Car car;   
  9.   
  10.     // 自动注入 bean 名称为 office 的 Bean   
  11.     @Resource(name = "office")   
  12.     private Office office;   
  13. }   
  14.    
package com.baobaotao;

import javax.annotation.Resource;

public class Boss {
    // 自动注入类型为 Car 的 Bean
    @Resource
    private Car car;

    // 自动注入 bean 名称为 office 的 Bean
    @Resource(name = "office")
    private Office office;
}
 



一般情况下,我们无需使用类似于 @Resource(type=Car.class) 的注释方式,因为 Bean 的类型信息可以通过 Java 反射从代码中获取。

要让 JSR-250 的注释生效,除了在 Bean 类中标注这些注释外,还需要在 Spring 容器中注册一个负责处理这些注释的 BeanPostProcessor:

Xml代码 复制代码
  1. <bean    
  2.   class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>  
  3.    
<bean 
  class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>
 


CommonAnnotationBeanPostProcessor 实现了 BeanPostProcessor 接口,它负责扫描使用了 JSR-250 注释的 Bean,并对它们进行相应的操作。

@PostConstruct 和 @PreDestroy

Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,您既可以通过实现 InitializingBean/DisposableBean 接口来定制初始化之后 / 销毁之前的操作方法,也可以通过 <bean> 元素的 init-method/destroy-method 属性指定初始化之后 / 销毁之前调用的操作方法。关于 Spring 的生命周期,笔者在《精通 Spring 2.x—企业应用开发精解》第 3 章进行了详细的描述,有兴趣的读者可以查阅。

JSR-250 为初始化之后/销毁之前方法的指定定义了两个注释类,分别是 @PostConstruct 和 @PreDestroy,这两个注释只能应用于方法上。标注了 @PostConstruct 注释的方法将在类实例化后调用,而标注了 @PreDestroy 的方法将在类销毁之前调用。


清单 17. 使用 @PostConstruct 和 @PreDestroy 注释的 Boss.java
               
Java代码 复制代码
  1. package com.baobaotao;   
  2.   
  3. import javax.annotation.Resource;   
  4. import javax.annotation.PostConstruct;   
  5. import javax.annotation.PreDestroy;   
  6.   
  7. public class Boss {   
  8.     @Resource  
  9.     private Car car;   
  10.   
  11.     @Resource(name = "office")   
  12.     private Office office;   
  13.   
  14.     @PostConstruct  
  15.     public void postConstruct1(){   
  16.         System.out.println("postConstruct1");   
  17.     }   
  18.   
  19.     @PreDestroy  
  20.     public void preDestroy1(){   
  21.         System.out.println("preDestroy1");    
  22.     }   
  23.     …   
  24. }  
package com.baobaotao;

import javax.annotation.Resource;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class Boss {
    @Resource
    private Car car;

    @Resource(name = "office")
    private Office office;

    @PostConstruct
    public void postConstruct1(){
        System.out.println("postConstruct1");
    }

    @PreDestroy
    public void preDestroy1(){
        System.out.println("preDestroy1"); 
    }
    …
}




您只需要在方法前标注 @PostConstruct 或 @PreDestroy,这些方法就会在 Bean 初始化后或销毁之前被 Spring 容器执行了。

我们知道,不管是通过实现 InitializingBean/DisposableBean 接口,还是通过 <bean> 元素的 init-method/destroy-method 属性进行配置,都只能为 Bean 指定一个初始化 / 销毁的方法。但是使用 @PostConstruct 和 @PreDestroy 注释却可以指定多个初始化 / 销毁方法,那些被标注 @PostConstruct 或 @PreDestroy 注释的方法都会在初始化 / 销毁时被执行。

通过以下的测试代码,您将可以看到 Bean 的初始化 / 销毁方法是如何被执行的:


清单 18. 测试类代码
               
Java代码 复制代码
  1. package com.baobaotao;   
  2.   
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;   
  4.   
  5. public class AnnoIoCTest {   
  6.   
  7.     public static void main(String[] args) {   
  8.         String[] locations = {"beans.xml"};   
  9.         ClassPathXmlApplicationContext ctx =    
  10.             new ClassPathXmlApplicationContext(locations);   
  11.         Boss boss = (Boss) ctx.getBean("boss");   
分享到:
评论

相关推荐

    精通Spring2.5pdf书籍proSpring2.5

    书中涵盖的内容包括但不限于:Spring的核心概念、IoC和AOP的实现原理、数据访问策略、Web MVC框架的使用、以及RESTful服务和Web服务的构建。通过学习,开发者可以提高项目开发效率,减少代码耦合,更好地实现松耦合...

    Spring2.5-中文参考手册chm

    在Spring 2.5中,Spring MVC引入了更多的注解驱动特性,简化了配置。 **数据访问集成** Spring 2.5增强了对多种数据访问技术的支持,包括JDBC、ORM(Object-Relational Mapping)框架如Hibernate和MyBatis等。它...

    使用Spring2.5的Autowired实现注释型的IOC

    使用 Spring 2.5 的 Autowired 实现注释型的 IOC 在 Spring 2.5 中,Autowired 是一个非常重要的特性,它可以实现快速的自动注入,无需在 XML 文档里面添加 bean 的声明,大大减少了 XML 文档的维护。下面我们将...

    spring 2.5框架图

    Spring 2.5框架是Java开发中的一个里程碑版本,它为开发者提供了丰富的功能和改进,尤其是在企业级应用开发中。这个框架的核心在于IoC(Inversion of Control)和AOP(Aspect-Oriented Programming),旨在简化Java...

    spring 2.5 IOC 自动扫描,自动注入

    而自动扫描和自动注入是Spring 2.5中实现IOC的两个核心特性,极大地简化了配置工作,提高了开发效率。以下是对这两个特性的详细解释: **自动扫描**: 自动扫描是Spring框架的一个强大功能,它允许开发者指定一个或...

    Spring2.5-中文参考手册chm.zip

    5. **容器改进**:Spring 2.5的IoC容器增强了对Java 5和6特性的支持,如泛型和注解。同时,提供了更强大的Bean定义合并功能,使得在不同模块之间共享Bean配置变得更加容易。 6. **Web应用上下文**:Spring 2.5引入...

    spring2.5常用包

    Spring 2.5 是 Spring 框架的一个重要版本,它在之前的版本基础上引入了许多增强功能和改进,为开发者提供了更强大的工具集。这个压缩包包含的“spring常用包”很可能是为了帮助开发者理解并使用 Spring 2.5 的核心...

    struts2.1+spring2.5+hibernate3.3整合之第一步(spring2.5+hibernate3.3)

    Spring2.5是全面的企业级应用框架,它不仅包含IoC(Inversion of Control,控制反转)容器,用于管理对象的生命周期和依赖关系,还提供了AOP(Aspect-Oriented Programming,面向切面编程)功能,实现了对横切关注点...

    Spring2.5 IOC的简单实现

    **Spring 2.5 IOC(控制反转)的简单实现** Spring 框架是 Java 开发中的一个核心组件,尤其在企业级应用中广泛应用。它提供了依赖注入(Dependency Injection,DI),也就是通常所说的控制反转(Inversion of ...

    使用 Spring 2.5 基于注解驱动的 Spring.pdf

    ### 使用Spring 2.5基于注解驱动的SpringMVC:深入解析与实践 #### 核心知识点概览 在Spring 2.5版本中,框架显著增强了对注解的支持,特别是针对SpringMVC(Model-View-Controller)模块,引入了基于注解的配置...

    使用 Spring 2.5 基于注解驱动的 Spring MVC.doc

    本文将深入探讨Spring MVC注解的功能及其在Spring 2.5中的应用。 首先,Spring 2.5中的注解驱动的Spring MVC允许开发者摆脱对XML配置的依赖,从而减少了配置文件的复杂性。例如,传统的Spring MVC配置通常需要在`...

    Spring2.5-Reference_zh_CN.txt

    Spring2.5版本是该系列的一个重要版本,它引入了许多新特性并优化了原有功能。 #### 二、依赖注入(IoC) 依赖注入(Inversion of Control, IoC)是Spring框架的核心特性之一,它通过将对象间的依赖关系交由外部...

    spring2.5 api 离线版

    Spring2.5-Reference_zh_CN.chm Spring2.5-中文参考手册.chm spring——AOP,IOC.doc Spring框架快速入门之简介.doc spring配置全书.doc Spring中的IOC与AOP详解.ppt

    使用 Spring 2_5 注释驱动的 IoC 功能.mht

    **Spring 2.5 注释驱动的 IoC 功能详解** Spring 框架自 2.5 版本开始引入了对注解的强大支持,极大地简化了依赖注入(Dependency Injection,简称 DI)的配置过程。注解驱动的 IoC(Inverse of Control,控制反转...

    spring2.5相关的jar包

    此外,Spring 2.5还增强了依赖注入(DI)功能,引入了基于注解的配置,允许在类级别和方法级别使用`@Autowired`、`@Qualifier`等注解,减少了XML配置文件的复杂性。这需要`spring-beans.jar`,`spring-context.jar`...

    spring2.5源码编译

    《Spring 2.5源码编译全解析》 在软件开发领域,深入理解框架的源码对于提升技术水平和优化应用至关重要。Spring作为Java领域的主流框架之一,其2.5版本是许多开发者学习和研究的基础。本文将详细介绍如何编译...

    Spring2.5和Hibernate3集成--学习spring aop ioc

    Spring2.5和Hibernate3集成 采用声明式事务 1.声明式事务的配置 * 配置sessionFactory * 配置事务管理器 * 配置事务的传播特性 * 配置哪些类哪些方法使用事务 2.编写业务逻辑方法 * 继承...

    spring2.5中文开发手册

    这份手册能够帮助开发者理解并掌握Spring的众多功能,包括配置和使用Spring IoC容器,如何在项目中集成Spring MVC和Spring的事务管理功能,以及如何使用Spring AOP进行面向切面的编程等。通过这份手册,开发者可以...

    cxf+Spring2.5

    Apache CXF是一个开源服务框架,它允许开发人员创建和消费Web服务,而Spring框架则是一个广泛使用的Java企业级应用的IOC(Inversion of Control)和AOP(Aspect Oriented Programming)容器。将两者结合,可以方便地...

Global site tag (gtag.js) - Google Analytics