ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

spring中的自动注入

2022-08-23 21:01:48  阅读:207  来源: 互联网

标签: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,注入
来源: https://www.cnblogs.com/likeguang/p/16617769.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有