@Autowired介绍
Spring框架是Java领域中一个非常重要的企业级应用开发框架,它提供了全面的编程和配置模型,旨在帮助开发者更快速、更简单地创建应用程序。在Spring框架中,@Autowired
是一个非常重要的注解,它用于实现依赖注入(Dependency Injection, DI)的功能。
@Autowired
注解是Spring框架提供的一种自动装配(autowiring)的方式。当一个bean需要注入一个或多个依赖时,Spring容器会自动寻找匹配的bean并注入。这个过程是基于类型(byType)的,默认情况下,Spring会寻找类型匹配的唯一bean来完成注入。如果找到多个同类型的bean,则需要通过其他方式指定具体注入哪一个。
什么是依赖注入?
依赖注入是一种设计模式,用于减少代码之间的耦合度。在这个模式中,对象不需要自己创建它所依赖的对象,而是通过外部注入这些依赖对象。这样可以提高代码的灵活性和可测试性,因为依赖的对象可以被轻松替换或修改。
@Autowired源码
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {boolean required() default true;}
源代码截图
@Autowired属性介绍
- required:表示是否必须注入成功,取值为true或false。默认值是true,表示必须注入成功。当取值为true时,注入不成功会报错,否则,注入不成功不会报错。如果设置为
false
,则允许注入的依赖为null
。从Spring 4.3开始,@Autowired
可以用于final字段,但这种情况下不能设置required
属性为false
。如果需要自定义注入逻辑,可以通过实现@Autowired
注解的@AutowiredAnnotationBeanPostProcessor
类来实现。
@Autowired注解使用场景
-
构造函数注入:当
@Autowired
注解应用于构造函数时,Spring 容器会在创建 bean 时自动调用该构造函数,并注入所有需要的依赖。 -
方法注入:当
@Autowired
注解应用于方法时,Spring 容器会在创建 bean 后调用该方法,并注入所有需要的依赖。 -
字段注入:当
@Autowired
注解应用于字段时,Spring 容器会在创建 bean 时自动注入该字段。 -
属性 setter 方法注入:当
@Autowired
注解应用于 setter 方法时,Spring 容器会在创建 bean 后调用该 setter 方法,并注入所有需要的依赖。 -
当有多个Bean符合注入条件时,可以使用
@Qualifier
注解与@Autowired
结合使用,来指定具体要注入的Bean。这样可以解决自动装配时的歧义问题。
@Autowired测试示例代码
示例代码 一
AutowiredDemoService类
package com.yang.SpringTest.annotation.autowiredLearn;import org.springframework.stereotype.Service;/*** <p>Service类</p>** @author By: chengxuyuanshitang* Package com.yang.SpringTest.annotation.autowiredLearn* Ceate Time 2024-03-28 13:53*/
@Service
public class AutowiredDemoService {public void test () {System.out.println ("this is AutowiredDemoService test");}
}
AutowiredDemoController类
package com.yang.SpringTest.annotation.autowiredLearn;import lombok.ToString;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;/*** <p>Controller类</p>** @author By: chengxuyuanshitang* Package com.yang.SpringTest.annotation.autowiredLearn* Ceate Time 2024-03-28 13:53*/
@ToString
@Controller
public class AutowiredDemoController {@Autowiredprivate AutowiredDemoService autowiredDemoService;public void test () {System.out.println ("AutowiredDemoController.test");autowiredDemoService.test ();}}
AutowiredDemoConfig配置类
package com.yang.SpringTest.annotation.autowiredLearn;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;/*** <p>AutowiredDemoConfig配置类</p>** @author By: chengxuyuanshitang* Package com.yang.SpringTest.annotation.autowiredLearn* Ceate Time 2024-03-28 13:56*/
@Configuration
@ComponentScan(value = {"com.yang.SpringTest.annotation.autowiredLearn"})
public class AutowiredDemoConfig {
}
AutowiredDemoTest测试类
package com.yang.SpringTest.annotation.autowiredLearn;import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;/*** <p>AutowiredDemoTest测试类</p>** @author By: chengxuyuanshitang* Package com.yang.SpringTest.annotation.autowiredLearn* Ceate Time 2024-03-28 13:57*/
@Slf4j
public class AutowiredDemoTest {public static void main (String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext (AutowiredDemoConfig.class);AutowiredDemoService autowiredDemoService = context.getBean (AutowiredDemoService.class);log.info ("autowiredDemoService is : [ {} ]", autowiredDemoService);AutowiredDemoController autowiredDemoController = context.getBean (AutowiredDemoController.class);log.info ("autowiredDemoController is : [ {} ]", autowiredDemoController);autowiredDemoController.test ();}
}