推荐学习
- 啃完这份宝藏级“Spring高级源码笔记”,面试P7问源码还会心虚?
- 阿里架构师总结Spring核心系列:Spring,Cloud,Spring5,MVC等
- Spring复习大纲:依赖注入Ioc+Beans+注解+数据访问+AOP+MVC等
在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自动注入(按类型自动注入)
- Java类中引用类型的数据类型和bean的class值是一样的
- Java类中引用类型的数据类型和bean的class的值是父子关系
- 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
步骤:
- 加入maven依赖 spring-context,在你加入spring-context的同时,间接加入spring-aop的依赖使用注解必须使用spring-aop依赖
- 在类中加入spring的注解(多个不同功能的注解)
- 在spring的配置文件中,加入一个组件扫描器的标签,说明注解在你的项目中的位置
- 创建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、建立资源文件:
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