(二)spring的bean自动装配

spring的bean自动装配主要是通过@Autowired注解实现的

(一) bean源代码解析

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
//为true时,没有找到符合要求的bean,spring会抛出异常
boolean required() default true; }

从代码里可以看到该注解可以使用在构造函数,普通方法,参数,属性以及注解上,不能使用在类上,使用范围非常广。

 

(二)在类属性上使用@Autowired

1. 示例bean

package demo.ioc.annotation.autowired;

import org.springframework.stereotype.Component;

@Component
public class Person {
    private String uuid  = "123";

    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    @Override
    public String toString() {
        return "Person{" +
                "uuid='" + uuid + '\'' +
                '}';
    }
}
package demo.ioc.annotation.autowired;

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

public class Company {

    @Autowired
    private Person person;

    @Override
    public String toString() {
        return "Company{" +
                "person=" + person +
                '}';
    }
}

2. 测试

package demo.ioc.annotation.autowired;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

public class TestMain {
    public static void main(String[] args) {
//        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        ApplicationContext context = new AnnotationConfigApplicationContext(Company.class, Person.class);
        Company company =  context.getBean("company", Company.class);

        System.out.println(company);
    }
}
输出:Company{person=Person{uuid='123'}}

 

(三) 在构造函数上使用@Autowired

1.示例bean

package demo.ioc.annotation.autowired;

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

public class Company {

    private Person person;

    @Autowired
    public Company(Person person) {
        this.person = person;
    }

    @Override
    public String toString() {
        return "Company{" +
                "person=" + person +
                '}';
    }
}

 

2. 测试

package demo.ioc.annotation.autowired;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

public class TestMain {
    public static void main(String[] args) {
//        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        ApplicationContext context = new AnnotationConfigApplicationContext(Company.class, Person.class);
        Company company =  context.getBean("company", Company.class);

        System.out.println(company);
    }
}
输出: Company{person=Person{uuid='123'}}

放置在构造函数上时,spring自动为构造函数的入参注入参数。

 

(四) 在普通方法上使用@Autowired

1. 示例bean

package demo.ioc.annotation.autowired;

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

public class Company {

    private Person person;

    @Autowired
    public void setPerson(Person person) {
        this.person = person;
    }

    @Override
    public String toString() {
        return "Company{" +
                "person=" + person +
                '}';
    }
}

2. 测试

package demo.ioc.annotation.autowired;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

public class TestMain {
    public static void main(String[] args) {
//        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        ApplicationContext context = new AnnotationConfigApplicationContext(Company.class, Person.class);
        Company company =  context.getBean("company", Company.class);

        System.out.println(company);
    }
}
输出: Company{person=Person{uuid='123'}}

可以看到效果与构造函数一样

(五) 在入参上使用@Autowired

1. 示例bean

package demo.ioc.annotation.autowired;

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

public class Company {

    private Person person;


    public Company(@Autowired Person person) {
        this.person = person;
    }

    @Override
    public String toString() {
        return "Company{" +
                "person=" + person +
                '}';
    }
}

 

2. 测试

package demo.ioc.annotation.autowired;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

public class TestMain {
    public static void main(String[] args) {
//        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        ApplicationContext context = new AnnotationConfigApplicationContext(Company.class, Person.class);
        Company company =  context.getBean("company", Company.class);

        System.out.println(company);
    }
}
输出:Company{person=Person{uuid='123'}}

效果与放在构造函数上类似

 

(六) @Autowired的装配规则

1.默认按照类型进行自动装配

2.当同类型的bean有多个时,会按照bean的名称进行自动装配

3.当没有找到合适的bean时,如果required=true,则抛出异常。

posted @ 2022-07-19 19:54  取名好烦呀  阅读(79)  评论(0编辑  收藏  举报