在前面:
本人是一名物联网工程专业大二的学生,是互联网浪潮中一朵小小的浪花,写博客即是为了记录自己的学习历程,又希望能够帮助到很多和自己一样处于起步阶段的萌新。临渊羡鱼,不如退而结网。与其羡慕别人有顶尖的技术,还不如自己慢慢摸索学习。终有一天,你也能称为别人“羡慕”的人
博客主页:https://blog.csdn.net/qq_44895397
在spring的对象文件中,给Java对象的属性赋值:
di依赖注入,表示创建对象,给属性赋值
di的实现方法有两种:
1、在spring的配置文件中,使用标签完成,叫做基于XML的di实现
2、使用spring中的注解,完成属性赋值,叫做基于注解的id实现
di的语法分类:
1、set注入(设值 注入):spring调用类的set方法实现属性的赋值。
2、构造注入:spring调用类的有参数的构造方法,创建对象,在构造方法中完成赋值
注入:赋值
简单类型:spring中规定Java的基本数据类型和String都是简单类型
di:给属性赋值
spring调用类的set方法,你可以在set方法中完成属性的赋值
<bean id=“这个对象的唯一标识,通过id找到对象” class= "创建对象的类的全限定名称">
<property name="属性名" value="赋的值"></property>
</bean>
一个property只能给一个属性赋值 需要有set方法,否则会报错
<bean id=“这个对象的唯一标识,通过id找到对象” class= "创建对象的类的全限定名称">
<property name="属性名" ref="bean的id(对象的名称)" />
一个property只能给一个属性赋值
</bean>
xml文件中的代码:(使用set方法赋值
<bean id="school" class="com.yky.domain.School">
<property name="name" value="湖中医" />
<property name="address" value="湖北" />
</bean>
<bean id="student01" class="com.yky.domain.Student">
<property name="name" value="张三" />
<property name="age" value="19" />
<!--引用类型赋值:ref的值就是该类型的对象的id-->
<property name="school" ref="school"/>
</bean>
spring调用类有参数构造的方法,在创建对象的同时,在构造方法中赋值 构造注入使用
name:表示构造方法的形参名
index:表示构造方法的参数的位置,参数从左往右位置是0,1,2的顺序(在按顺序传参时,可以省略)
value:构造方法的形参类型的简单类型的,使用value
ref:构造方法的形参类型是引用类型的,使用ref
代码(
<bean id="student02" class="com.yky.domain.Student">
<constructor-arg name="name" value="李四" />
<constructor-arg name="age" value="19" />
<constructor-arg name="school" ref="school" />
</bean>
代码(
<bean id="student03" class="com.yky.domain.Student">
<constructor-arg index="0" value="李四" />
<constructor-arg index="1" value="19" />
<constructor-arg index="2" ref="school" />
</bean>
spring框架根据某些规则可以给引用类型赋值,不用你再给引用类型赋值了
常用规则:byName,byType
语法:
<bean id="" class="" autowire="byType">简单类型赋值</bean>
注意:
在byType中,在xml配置文件中声明bean只能有一个符合条件的,多于一个就是多余
代码:
<!--学校-->
<bean id="school" class="com.yky.domain.School">
<property name="name" value="湖中医" />
<property name="address" value="湖北" />
</bean>
<!--学生-->
<bean id="student03" class="com.yky.domain.Student" autowire="byType">
<property name="name" value="王五" />
<property name="age" value="20" />
</bean>
Java类中 引用用类型的属性名和spring容器中(配置文件)
<bean id="school" class="com.yky.domain.School">
<property name="name" value="湖中医" />
<property name="address" value="湖北" />
</bean>
<!--学生-->
<bean id="student03" class="com.yky.domain.Student" autowire="byName">
<property name="name" value="王五" />
<property name="age" value="20" />
</bean>
1、每个文件的大小比一个文件要小得多,效率高
2、避免多人竞争冲突
如果项目有多个模块(相关功能在一起),一个模块一个配置文件
多个文件的分配方式:
1、按功能模块,一个模块一个配置文件
2、按类的功能,数据库相关的配置一个配置文件,做事务的功能一个配置文件…
包含关系的配置文件:
主配置文件:包含其他区配置文件的,主配置文件一般不定义对象
语法:
关键字:"classpath:"表示类路径(class文件所在的目录)
在spring的配置文件中要指定其他文件的位置,需要classpath,告诉spring到哪里去加载读取文件
在包含关系的配置文件中,可以使用通配符(*:表示任意字符),可以把某些符合条件的文件一次加载进来
总配置文件:
<!--主配置文件负责把各模块连接起来-->
<import resource="classpath:di01/spring-student.xml" />
<import resource="classpath:di01/sprinh-school.xml" />
各模块配置文件的写法:
<bean id="studentdi01" class="com.yky.domain.Student" autowire="byType">
<property name="name" value="赵六" />
<property name="age" value="19" />
</bean>
<bean id="school" class="com.yky.domain.School" >
<property name="name" value="湖中医" />
<property name="address" value="武汉" />
</bean>
学习的注解:
@Component:放在类上面生成对象,或给对象赋值
@Respotory:
@Service
@Controller
@Value:给对象赋值,set方法上面,也可以放在属性上面
@Autowired:自动注入,默认byType,spring框架自带的 ,requied = true,如果要使用byName@Q…(value="")
@Resource:自动注入的,默认byName,当byName不能成功赋值时,会使用byType
步骤:
xml文件中添加组件扫描器
<!--
添加组件扫描器
<context:component-scan base-package="com.springdemo.di01" />
添加组件扫描器以后:xml文件会增加spring-context.xsd约束文件
context:表示的是哪个约束文件约束的标签
component-scan :组件扫描器标签
base-package:指定包,组件扫描器就会扫描包下以及子包下的所有类,
如果有注解就会生成相应的对象或给属性赋值,放入到容器中
-->
<context:component-scan base-package="com.yky.di02" />
给类添加注解,并赋值
@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使用语法一样,但是这三个还有额外的功能,给项目分层
指定多个包的方式:
<context:component-scan base-package="com.springdemo.di02" />
<context:component-scan base-package="com.springdemo.di01" />
<context:component-scan base-package="com.springdemo.di01,(或者“;”)com.springdemo.di02" />
<context:component-scan base-package="com.springdemo"/>
@value:value是String类型的,表示简单类型的属性值
位置:
@Component("di02school")
public class School {
@Value("湖中医")
private String name;
@Value("武汉")
private String address;
spring框架提供的注解,实现引用类型的赋值
spring中通过注解给引用类型赋值,使用的是自动注入原理,支持byType,byName
默认是byType
属性:
添加注解的位置:
byType:
@Component("myscholl")
public class School {
@Value("湖中医")
private String name;
@Value("武汉")
private String address;
@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;
来自jdk中的注解,spring框架提供了对这个注解的支持,可以使用它给引用类型赋值
使用的也是自动注入原理,支持byName,byType,默认是byName
默认先使用byName,byName失败再使用byType
只使用byName:增加一个属性name
位置:
)
@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;
添加依赖:
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.1</version>
</dependency>
<!--加载资源文件-->
<context:property-placeholder location="classpath:di02/test.properties" />
@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;
本站所有文章均为原创,欢迎转载,请注明文章出处:爱敲代码的小游子