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 ,则必须将
@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;