首页 > 其他分享 >spring中的自动注入

spring中的自动注入

时间:2022-08-23 21:01:46浏览次数:75  
标签:spring class bean 自动 UserService public 注入

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中的属性按照类型从容器中找到并来进行赋值。

标签:spring,class,bean,自动,UserService,public,注入
From: https://www.cnblogs.com/likeguang/p/16617769.html

相关文章