Spring 基于注解的配置(三)(@Resource,@PostConstruct ,@PreDestory)

本文详细介绍了Spring中基于注解的配置,特别是@Resource注解的用法,包括其按名字装配的语义和默认匹配规则。同时,文章还探讨了@PostConstruct和@PreDestroy这两个用于生命周期管理的注解,以及它们与XML中init-method和destroy-method的比较。通过示例代码展示了它们在Bean实例化和销毁过程中的执行顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@Resource

简介:Spring也用提供JSR-250 @Resource 注解在属性或者Bean setter方法上使用,它是JavaEE 5和 JavaEE 6的公共部分
@Resource注解:采用按名字装配的语义(采用Spring默认配置的Bean的名字,常见的为首字母大写)
应用范围:在字段或者setter方法中使用
示例一:
Computer.java

package com.spring.Autowire;

/**
 * Created by ruanjianlin on 2017/10/6.
 */
public class Computer {
    public Computer() {
       System.out.println("You get a new computer");
}

public void play(){
    System.out.println("The computer is working! ");
}
}

Human.java

package com.spring.Autowire;

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

import javax.annotation.Resource;

/**
 * Created by ruanjianlin on 2017/10/6.
 */
public class Human {
    @Resource
 private Computer computer;
@Autowired
@Qualifier("manSing")
private Sing sing;

public Human() {
    System.out.println("The function of  Human constructor is working!");
}

public Human(Computer computer) {
    this.computer = computer;
    System.out.println("The function of  Human which has a parameter is working!");
}

public Computer getComputer() {
    return computer;
}


public void setComputer(Computer computer) {
    this.computer = computer;
    System.out.println("The function of setComputer is working!");
}

public void setSing(Sing sing) {
    this.sing = sing;
}

public void play(){
    computer.play();
    sing.sing();
}
}

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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<context:annotation-config/>
<context:component-scan base-package="com.spring" use-default-filters="false">
    <context:include-filter type="regex" expression="com.spring.Autowire.*"/>
</context:component-scan>

Spring默认的Bean的name为原名字首字母变小写,及Computer自动注册后名字为computer

If no name is specified explicitly, the default name is derived from the field name or setter method. In
case of a field, it takes the field name; in case of a setter method, it takes the bean property name.

解析:如果没有名字被明确规定,默认的名字将会从属性的名字或者setter方法中衍生,如果在属性上使用该注解那么它将会依据该名字去寻找Bean装配,,同理如果其在setter方法上使用,则其将会使用setter方法中的参数名称去寻找Bean完成装配

若通过名字无法匹配怎么办?

In the exclusive case of @Resource usage with no explicit name specified, and similar to @Autowired,
@Resource finds a primary type match instead of a specific named bean and resolves well known resolvable dependencies: the BeanFactory, ApplicationContext, ResourceLoader,
ApplicationEventPublisher, and MessageSource interfaces.

解析:如果没有具体的Bean名字可以匹配,那么此时@Resource将会与@Autowired注解类似,该注解按类型进行匹配而不是按名字匹配Bean,借助于此解决众所周知的可以解决的依赖项BeanFactory, ApplicationContext, ResourceLoader,ApplicationEventPublisher, 和 MessageSource 接口。

@PostConstruct @PreDestory注解

CommonAnnotationBeanPostProcessor 不仅可以识别@Resource注解,其也可以识别JSR-250(Java Specification Requests——java 规范要求)有关生命周期的注解
xml中的配置:
Init-method 指定Bean初始化时调用的方法
destory-method 指定Bean销毁时调用的方法
Java中
@PostConstruct 初始化回调函数的一个替代(构造函数之后调用)
@PreDestory 销毁回调函数的一个替代(最后调用)
示例:(在上述源代码基础上修改)
Human.java

package com.spring.Autowire;

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

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

/**
 * Created by ruanjianlin on 2017/10/6.
 */
public class Human {
@Resource
private Computer com;
@Autowired
@Qualifier("manSing")
private Sing sing;
@PostConstruct
public void init(){
    System.out.println("init");
}
@PreDestroy
public void destory(){
    System.out.println("destory");
}
public Human() {
    System.out.println("The function of  Human constructor is working!");
}

public Human(Computer computer) {
    this.com = computer;
    System.out.println("The function of  Human which has a parameter is working!");
}

public Computer getComputer() {
    return com;
}


public void setComputer(Computer computer) {
    this.com = computer;
    System.out.println("The function of setComputer is working!");
}

public void setSing(Sing sing) {
    this.sing = sing;
}

public void play(){
    com.play();
    sing.sing();
}
}

主要测试的方法:

Human human=(Human) app.getBean("human");
human.play();
human.destory();

运行结果:

You get a new computer
The function of  Human constructor is working!
init
The computer is working! 
This is a man singing!
destory

由结果可以看出先调用构造函数后调用初始化的回调方法,最后调用销毁的回调方法

Bean实例化与销毁时采用@PostConstruct ,@PreDestory注解与Init-method,destory-method的比较:
InitTest.java

package com.spring.demo;

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

/**
 * Created by ruanjianlin on 2017/10/8.
 */
public class InitTest {
    public InitTest() {
    System.out.println("InitTest()");
}

public void initialize(){
    System.out.println("init-method");
}
@PostConstruct
public void init(){
    System.out.println("@PostConstruct");
}
@PreDestroy
public void destory(){
    System.out.println(" @PreDestroy");
}
public void destoryMethod(){
    System.out.println("destory-method");
}
}

xml配置文件:

    <bean id="initTest" class="com.spring.demo.InitTest" init-method="initialize" destroy-method="">
 </bean>

运行结果:

InitTest()
@PostConstruct
init-method
 @PreDestroy

结果分析:
运行顺序为:

  1. 构造函数
  2. @PostConstruct初始化回调函数
  3. init-method注册初始化方法
  4. @PreDestroy销毁回调函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值