@autowired注解原理_Spring框架第二谈:IOC,xml配置文件给属性赋值,注解实现赋值

推荐学习

  • 啃完这份宝藏级“Spring高级源码笔记”,面试P7问源码还会心虚?
  • 阿里架构师总结Spring核心系列:Spring,Cloud,Spring5,MVC等
  • Spring复习大纲:依赖注入Ioc+Beans+注解+数据访问+AOP+MVC等
39731e99f854f08e89bc19ba749548fa.png

在spring的对象文件中,给Java对象的属性赋值:

    di依赖注入,表示创建对象,给属性赋值    di的实现方法有两种:        1、在spring的配置文件中,使用标签完成,叫做基于XML的di实现        2、使用spring中的注解,完成属性赋值,叫做基于注解的id实现    di的语法分类:        1、set注入(设值 注入):spring调用类的set方法实现属性的赋值。        2、构造注入:spring调用类的有参数的构造方法,创建对象,在构造方法中完成赋值

基于XML的di实现

注入:赋值简单类型:spring中规定Java的基本数据类型和String都是简单类型di:给属性赋值

1、set注入(设值注入)

spring调用类的set方法,你可以在set方法中完成属性的赋值

简单类型的set注入:

一个property只能给一个属性赋值 需要有set方法,否则会报错

引用类型的设值注入

        一个property只能给一个属性赋值

xml文件中的代码:(使用set方法赋值标签)

2、构造注入

spring调用类有参数构造的方法,在创建对象的同时,在构造方法中赋值 构造注入使用标签

标签:一个表示构造方法一个参数

属性:

name:表示构造方法的形参名index:表示构造方法的参数的位置,参数从左往右位置是0,1,2的顺序(在按顺序传参时,可以省略)value:构造方法的形参类型的简单类型的,使用valueref:构造方法的形参类型是引用类型的,使用ref

代码(中的name-value的格式使用)

代码(中的index-value的格式使用,当参数为有序的时候index可以省略)

 

3、引用类型的自动注入

    spring框架根据某些规则可以给引用类型赋值,不用你再给引用类型赋值了    常用规则:byName,byType
  • byType自动注入(按类型自动注入)
  1. Java类中引用类型的数据类型和bean的class值是一样的
  2. Java类中引用类型的数据类型和bean的class的值是父子关系
  3. Java类中引用类型的数据类型和bean的class的值接口和实现类的关系

语法:

简单类型赋值

注意:

在byType中,在xml配置文件中声明bean只能有一个符合条件的,多于一个就是多余

代码:

 
  • byName自动注入(按名称自动注入)

Java类中 引用用类型的属性名和spring容器中(配置文件)的id一样,且数据类型是一致的,这样的容器中的bean,spring能够根据名称赋值给引用类型

4、多个配置文件:(分模块的配置文件)

    1、每个文件的大小比一个文件要小得多,效率高    2、避免多人竞争冲突

如果项目有多个模块(相关功能在一起),一个模块一个配置文件

    多个文件的分配方式:    1、按功能模块,一个模块一个配置文件    2、按类的功能,数据库相关的配置一个配置文件,做事务的功能一个配置文件…

包含关系的配置文件:

    主配置文件:包含其他区配置文件的,主配置文件一般不定义对象    语法:    关键字:"classpath:"表示类路径(class文件所在的目录)    在spring的配置文件中要指定其他文件的位置,需要classpath,告诉spring到哪里去加载读取文件

在包含关系的配置文件中,可以使用通配符(*:表示任意字符),可以把某些符合条件的文件一次加载进来

总配置文件:

各模块配置文件的写法:

  

基于注解的DI:通过注解完成Java对象创建,属性赋值

学习的注解:

    @Component:放在类上面生成对象,或给对象赋值    @Respotory:    @Service    @Controller    @Value:给对象赋值,set方法上面,也可以放在属性上面    @Autowired:自动注入,默认byType,spring框架自带的 ,requied = true,如果要使用byName@Q…(value="")    @Resource:自动注入的,默认byName,当byName不能成功赋值时,会使用byType

步骤:

  1. 加入maven依赖 spring-context,在你加入spring-context的同时,间接加入spring-aop的依赖使用注解必须使用spring-aop依赖
  2. 在类中加入spring的注解(多个不同功能的注解)
  3. 在spring的配置文件中,加入一个组件扫描器的标签,说明注解在你的项目中的位置
  4. 创建spring容器:ApplicationContext,获取对象

xml文件中添加组件扫描器

给类添加注解,并赋值

@Component(value = "studentdi02")public class Student {    @Value("东方不败")    private String name;    @Value("18")    private Integer age;    /**     * @Autowired     * 给引用类型赋值     *底层原理是自动注入,默认byType     * 当想要使用byName是添加注解@Qualifier(value = "的id")     */    @Autowired    @Qualifier(value = "myschool")    private School school;
@Component(value = "myschool")public class School {    @Value("湖中医")    private String name;    @Value("武汉")    private String address;
  • @Component注解:调用无参构造方法
当只有一个参数的时候value可以省略也可以不指定value的值,使用spring的默认名称(默认的名称就是类名的首字母小写)spring中和Component功能一致,创建对象的还有
  • @Respotory:(持久层注解)放在Dao的实现类上面,表示创建dao对象,dao对象是能够访问数据库的
  • @Service:(业务层类)放在service的实现类上面,创建service对象,service对象是业务处理,可以有事务功能的
  • @Controller:(控制器)放在控制器(处理器)类上面的,创建控制器对象的,控制器对象,能够接受用户提交的处理参数,显示请求的处理结果

三个注解使用和@Component使用语法一样,但是这三个还有额外的功能,给项目分层

指定多个包的方式:

  • 使用多次组件扫描器,指定不同的包
  • 使用分隔符(";“或”,")分隔多个包名
  • 指定父包(不建议使用顶级父包,会扫描无用的包)

1、简单类型的赋值:

@value:value是String类型的,表示简单类型的属性值

位置:

  • 在属性定义的上面,无需set方法,推荐使用
@Component("di02school")public class School {    @Value("湖中医")    private String name;    @Value("武汉")    private String address;
  • 在set方法的上面

2、引用类型赋值:

  • @Autowired

spring框架提供的注解,实现引用类型的赋值

spring中通过注解给引用类型赋值,使用的是自动注入原理,支持byType,byName

默认是byType

属性:

  • required:是一个boolean类型的,默认true
  • required = true:表示引用类型赋值失败,程序报错,并终止执行
  • required = false:表示引用类型赋值失败,程序正常执行,引用类型是null

添加注解的位置:

  • 在属性定义的上面,无需set方法(推荐)
  • set方法上面

byType:

  • School类型:
@Component("myscholl")public class School {    @Value("湖中医")    private String name;    @Value("武汉")    private String address;
  • Student类型:
@Component("di03student")public class Student {    @Value("都放假了")    private String name;    @Value("52")    private int age;    //@Autowired:使用的自动注入,默认是byType(根据类型查找)    @Autowired    private School school;    byName:    @Component("di03student")    public class Student {        @Value("都放假了")        private String name;        @Value("52")        private int age;        //@Autowired:使用的自动注入,默认是byType(根据类型查找)        /**         *  @Autowired  :表示自动注入         *  @Qualifier(value = "myshool"):表示通过名字寻找这个引用类型类型的对象         */        @Autowired        @Qualifier(value = "myshool")        private School school;
  • @Resource

来自jdk中的注解,spring框架提供了对这个注解的支持,可以使用它给引用类型赋值

使用的也是自动注入原理,支持byName,byType,默认是byName

默认先使用byName,byName失败再使用byType

只使用byName:增加一个属性name

位置:

  • set方法上面
  • 属性上面,无需set方法(推荐)
@Component("di04student")public class Student {    @Value("符合实际")    private String name;    @Value("23")    private int age;
//@Resource//jdk自带的,也是依据自动注入原理实现的,默认byName,当byName失败时,就会使用byType
@Resource(name = "myshool")    private School school;
  • 添加依赖:
javax.annotationjavax.annotation-api1.3.1

配置文件和${}结合

1、建立资源文件:

bed87048746f41b5653dece2e888efeb.png

2、在配置文件中,添加资源文件加载的标签

3、用注解给属性赋值@Value("${资源文件中对应的key}")

@Component(value = "di03student")public class Student {    @Value("${di03.student.name}")    private String name;    @Value("${di03.student.age}")    private Integer age;    @Resource(name = "myshool")    private School school;

作者:爱敲代码的小游子

原文链接:https://blog.csdn.net/qq_44895397/article/details/106630288

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值