spring中的自动注入

spring官方介绍

IOC和DI的介绍

This chapter covers the Spring Framework implementation of the Inversion of Control (IoC) principle. IoC is also known as dependency injection (DI)

IOC的又一个别名叫做DI,依赖注入也叫DI

spring可以将我们的业务对象通过一些配置元数据信息让其成为spring中的bean。

自动注入

官方文档解释:https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-factory-autowire

Autowiring modes

Mode Explanation
no (默认)不自动装配。 Bean 引用必须由 ref 元素定义。 对于较大的部署,不建议更改默认设置,因为明确指定协作者可以提供更大的控制力和清晰度。 在某种程度上,它记录了系统的结构。
byName 按属性名称自动装配。 Spring 寻找与需要自动装配的属性同名的 bean。 例如,如果一个 bean 定义被设置为按名称自动装配,并且它包含一个 master 属性(即,它有一个 setMaster(..) 方法),Spring 会查找一个名为 master 的 bean 定义并使用 它来设置属性。
byType 如果容器中恰好存在一个属性类型的 bean,则让属性自动装配。 如果存在多个,则会抛出一个致命异常,这表明您不能对该 bean 使用 byType 自动装配。 如果没有匹配的 bean,则不会发生任何事情(未设置属性)。
constructor 类似于 byType 但适用于构造函数参数。 如果容器中没有一个构造函数参数类型的 bean,则会引发致命错误。

自动注入是开发成员指定当前类要成为一个Bean之后,bean中的属性是否让spring来进行自动注入。

自动注入和@Autowired是没有关系的。也可以理解成是set的一种方式。

来看一下对应的设置

@Configuration
@ComponentScan("com.guang.beandefinitaiontest.demo11")
public class AppConfig {

}

@Component
public class User {
    private String name =  "lg";
    private String address = "sz";

}

public class UserService {

    private User user;

    public void setUser(User user) {
        this.user = user;
    }

    public void test(){
        System.out.println("UserService 执行了----->"+user);
    }
}


public class Test {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.register(AppConfig.class);
        GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
        genericBeanDefinition.setBeanClass(UserService.class);
        genericBeanDefinition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
        context.registerBeanDefinition("userService",genericBeanDefinition);
        context.refresh();
        UserService userService = context.getBean(UserService.class);
        userService.test();
    }
}

看一下控制台打印:

UserService 执行了----->com.guang.beandefinitaiontest.demo11.service.User@4034c28c

我们没有对UserService中的属性做任何处理,只是添加了一个

genericBeanDefinition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);

Spring将会默认的按照类型,给UserService中的属性按照类型从容器中找到并来进行赋值。

posted @ 2022-08-23 20:52  雩娄的木子  阅读(131)  评论(0编辑  收藏  举报