微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐