📜  Spring @Autowired 注解

📅  最后修改于: 2022-05-13 01:54:41.542000             🧑  作者: Mango

Spring @Autowired 注解

@Autowired 注释将构造函数、Setter 方法、Properties 和 Config() 方法标记为自动装配,即通过 Spring 依赖注入机制在运行时“注入 bean”(对象),如下图所示:

启用@Autowired 注释

Spring bean 可以通过Java配置或 XML 配置声明。通过声明 bean,您向 Spring Container 提供元数据以在运行时返回所需的依赖对象。这称为 Spring Bean 自动装配。在基于Java的配置中,所有 bean 方法都在带有@configuration注释的类中定义。在运行时,Spring 将通过读取这些方法来提供 bean 定义。使用@Autowired ,正确的依赖项由 Spring Container 分配。

@Configuration
public class AppConfig {

// bean methods
}

在基于 XML 的配置中,如果使用@Autowired 注释连接 bean 则必须将添加到 XML 文件中。否则,您可以在 XML 配置文件中包含AutowiredAnnotationBeanPostProcessor bean。



@SpringBootAnnotation是@Configuration、@EnableAutoConfiguration 和@ComponentScan 的组合,用于扫描基础包和子包中包含的所有组件或服务以及其他配置文件。这将在 Spring Context 中注册它们并在运行时使用 @Autowired 注入 bean。

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

使用@Autowired

XML 配置文件

如果使用 XML 配置来连接 bean,则配置文件如下所示,




    
    
        
    

    
        
        
    

Java配置类

如果使用Java Configuration 来连接 bean,那么配置类看起来像这样,

package com.gfg.demo.config;

import com.gfg.demo.domain.Customer;
import com.gfg.demo.domain.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
    @Bean
    public Person person(){
        Person person = new Person();
        person.setName("ganesh");
        person.setAge("21");
        return person;
    }
}

在启用@Autowired 注释并决定要使用的配置之后。 bean 可以通过构造函数或属性或 setter 方法进行连接。例如,有两个 POJO 类 Customer 和 Person。 Customer 类依赖于 Person。

顾客。Java



@Component
public class Customer {

    private int type;
    private Person person;
    
    // Constructors
    // getters and setter
}

人。Java

public class Person {
    private String name;
    private String age;
    
    // Constructors
    // getters and setters
}

基于构造函数的自动装配

@Autowired注释对于基于构造函数的注入是可选的。在这里,容器中的 person 对象在创建 Customer 对象时被传递给构造函数。

@Component
public class Customer {

    private int type;
    private Person person;

    public Customer() {
    }

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

基于属性的自动装配

person 对象将在运行时使用@Autowired注释注入到属性 person 中

@Component
public class Customer {

    private int type;

    @Autowired
    private Person person;
}

基于 Setter 的自动装配

容器将在运行时使用 Person 对象调用 setter 方法。

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

可选依赖

如果没有定义Person类型的 bean,那么 Spring 将抛出NoSuchBeanDefinitionException 。它可以防止Spring容器将从抛出下面的异常成功启动。

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 
'com.gfg.demo.Person' available: expected at least 1 bean which qualifies as 
autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

为了解决这个问题,我们可以设置 @Autowired 的required属性为false

@Autowired(required = false)
private Person person;