Spring框架第二谈(IOC实现,xml配置文件给属性赋值,注解实现赋值)

在这里插入图片描述

在前面:
本人是一名物联网工程专业大二的学生,是互联网浪潮中一朵小小的浪花,写博客即是为了记录自己的学习历程,又希望能够帮助到很多和自己一样处于起步阶段的萌新。临渊羡鱼,不如退而结网。与其羡慕别人有顶尖的技术,还不如自己慢慢摸索学习。终有一天,你也能称为别人“羡慕”的人
博客主页:https://blog.csdn.net/qq_44895397

在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方法中完成属性的赋值

  1. 简单类型的set注入:
<bean id=“这个对象的唯一标识,通过id找到对象” class= "创建对象的类的全限定名称">
<property name="属性名" value="赋的值"></property>
</bean>

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

  1. 引用类型的设值注入
<bean id=“这个对象的唯一标识,通过id找到对象” class= "创建对象的类的全限定名称">
<property name="属性名" ref="bean的id(对象的名称)" />
        一个property只能给一个属性赋值
</bean>

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

<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>

2、构造注入

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

  1. <constructor-arg> 标签:一个表示构造方法一个参数

  2. <constructor-arg>属性:

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

代码(<constructor-arg>中的name-value的格式使用)

<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>

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

 <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>

3、引用类型的自动注入

    spring框架根据某些规则可以给引用类型赋值,不用你再给引用类型赋值了
    常用规则:byName,byType

1. byType自动注入(按类型自动注入)

  1. Java类中引用类型的数据类型和bean的class值是一样的
  2. Java类中引用类型的数据类型和bean的class的值是父子关系
  3. Java类中引用类型的数据类型和bean的class的值接口和实现类的关系

语法:

<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>

2. byName自动注入(按名称自动注入)

Java类中 引用用类型的属性名和spring容器中(配置文件)<bean>的id一样,且数据类型是一致的,这样的容器中的bean,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>

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

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

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

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

包含关系的配置文件:

    主配置文件:包含其他区配置文件的,主配置文件一般不定义对象
    语法:<import resource ="classpath:其他配置文件的路径" />
    关键字:"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>

基于注解的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文件中添加组件扫描器

<!--
添加组件扫描器
<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 = "<bean>的id")
     */
    @Autowired
    @Qualifier(value = "myschool")
    private School school;
@Component(value = "myschool")
public class School {
    @Value("湖中医")
    private String name;
    @Value("武汉")
    private String address;
  1. @Component注解:调用无参构造方法

    当只有一个参数的时候value可以省略
    也可以不指定value的值,使用spring的默认名称(默认的名称就是类名的首字母小写)
    spring中和Component功能一致,创建对象的还有
    
  2. @Respotory:(持久层注解)放在Dao的实现类上面,表示创建dao对象,dao对象是能够访问数据库的

  3. @Service:(业务层类)放在service的实现类上面,创建service对象,service对象是业务处理,可以有事务功能的

  4. @Controller:(控制器)放在控制器(处理器)类上面的,创建控制器对象的,控制器对象,能够接受用户提交的处理参数,显示请求的处理结果
    三个注解使用和@Component使用语法一样,但是这三个还有额外的功能,给项目分层

指定多个包的方式:

  1. 使用多次组件扫描器,指定不同的包
<context:component-scan base-package="com.springdemo.di02" />
<context:component-scan base-package="com.springdemo.di01" />
  1. 使用分隔符(";“或”,")分隔多个包名
<context:component-scan base-package="com.springdemo.di01,(或者“;”)com.springdemo.di02" />
  1. 指定父包(不建议使用顶级父包,会扫描无用的包)
<context:component-scan base-package="com.springdemo"/>

1、简单类型的赋值:

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

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

2、引用类型赋值:

1、@Autowired

spring框架提供的注解,实现引用类型的赋值
spring中通过注解给引用类型赋值,使用的是自动注入原理,支持byType,byName
默认是byType
属性:

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

添加注解的位置:

  1. 在属性定义的上面,无需set方法(推荐)
  2. 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;

2、@Resource

来自jdk中的注解,spring框架提供了对这个注解的支持,可以使用它给引用类型赋值
使用的也是自动注入原理,支持byName,byType,默认是byName
默认先使用byName,byName失败再使用byType
只使用byName:增加一个属性name
位置:

  1. set方法上面
  2. 属性上面,无需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;

添加依赖:

<dependency>
	<groupId>javax.annotation</groupId>
	<artifactId>javax.annotation-api</artifactId>
	<version>1.3.1</version>
</dependency>

配置文件和${}结合

  1. 建立资源文件:

在这里插入图片描述

  1. 在配置文件中,添加资源文件加载的标签
<!--加载资源文件-->
<context:property-placeholder location="classpath:di02/test.properties" />
  1. 用注解给属性赋值@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;

本站所有文章均为原创,欢迎转载,请注明文章出处:爱敲代码的小游子

猜你喜欢

转载自blog.csdn.net/qq_44895397/article/details/106630288