@Resource注解完成自动装配

@Resource注解是通过名字来自动装配的。在spring中自动装配的模式如果是通过名字来自动装配那么必须保证bean的名字和pojo 的属性名一直。

下面是详细代码:说明了@Resource注解是通过名字来完成自动装配的,可以说@Resource注解在某些情况下可以代替@Autowired(通过类型)注解.

Address类的代码如下:

package com.timo.domain;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.lang.Nullable;

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

public class Address implements InitializingBean  ,BeanPostProcessor{
    private String city6;
    private String state3;

    public Address() {
        System.out.println("Instantiate");
    }

    public String getCity4() {
        return city6;
    }

    public void setCity(String city) {
        this.city6 = city;
        System.out.println("populate properties");
    }

    public String getState2() {
        return state3;
    }

    public void setState(String state) {
        this.state3 = state;
    }
    public void destory(){
        System.out.println("destory");
    }

    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet");
    }
    public void init(){
        System.out.println("init");
    }
    @PostConstruct
    public void postConstructor(){
        System.out.println("post constructor");
    }

    @Nullable
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization");
        return null;
    }

    @Nullable
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization");
        return null;
    }
}

Student类的代码如下:

package com.timo.domain;

import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.config.BeanPostProcessor;

import javax.annotation.Resource;

public class Student implements BeanNameAware,BeanPostProcessor{
    private Integer age;
    private String name;
    @Resource
    //用@Resource注解完成自动装配。
    private Address address;

    public Student(Address address) {
        this.address = address;
    }

    public Student(String name, Address address) {
        this.name = name;
        this.address = address;
    }

    public Student(Integer age, String name, Address address) {
        this.age = age;
        this.name = name;
        this.address = address;
    }

    public Student() {
        System.out.println("student Instantiate");
    }

    public Integer getAge2() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName2() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", address=" + address +
                '}';
    }
    public void show(){
        System.out.println(address.getCity4());
        System.out.println(address.getState2());
    }
    public void setBeanName(String name) {
        System.out.println("the bean name is:"+name);
    }
}

配置文件的代码如下:applicationContext-resource.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:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xmlns:aop="http://www.springframework.org/schema/aop"
       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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
    <!--<context:annotation-config/> only looks for annotations on beans in the same application context in which
    it is defined  RequiredAnnotationBeanPostProcessor   AutowiredAnnotaionBeanPostProcessor
    CommonAnnotationBeanPostProcessor PersistenceAnnotaionBeanPostProcessor-->
    <context:annotation-config/>
    <bean id="address" class="com.timo.domain.Address">
        <property name="city" value="安徽省"/>
        <property name="state" value="合肥市"/>
    </bean>
    <bean id="student" class="com.timo.domain.Student"></bean>
</beans>

测试类的代码如下:

package com.timo.test;

import com.timo.domain.Student;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test23 {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-resource.xml");
        Student student = applicationContext.getBean(Student.class);
        student.show();

    }
}

上述中如果你把Student类中的@Resource去掉,则会有空指针异常。

posted @ 2017-11-28 21:12  技术让世界更精彩  阅读(980)  评论(0编辑  收藏  举报