spring学习记录(三)——各种数据类型的依赖注入(DI)

3、Spring创建对象方式

1、通过构造方法来创建 (必须要有有参构造方法)
2、通过set方法来创建(必须要有无参构造方法)

3.1、通过构造方法来创建

通过构造方式有三种方式

  • 通过字段名
  • 通过下标
  • 通过字段类型

创建实体类

package com.zhangjiangbo.cn.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private Integer id;

    private String usrename;

    private String passwrod;

}

创建spring配置文件

第一种方式:通过字段名来创建

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="user" class="com.zhangjiangbo.cn.bean.User">
        <constructor-arg name="id" value="1"/>
        <constructor-arg name="usrename" value="张江博"/>
        <constructor-arg name="passwrod" value="xiaomini"/>
    </bean>
</beans>

第二种方式:通过下标创建(要保证下标和实体类中字段定义的顺序保持一致)

    <bean id="user" class="com.zhangjiangbo.cn.bean.User">
        <constructor-arg index="0" value="1"/>
        <constructor-arg index="1" value="张江博"/>
        <constructor-arg index="2" value="xiaomini"/>
    </bean>

第三种方式:通过字段类型创建(按照实体类中定义的顺序,定义的类型必须要与实体类中保持一致,否则会报错)

    <bean id="user" class="com.zhangjiangbo.cn.bean.User">
        <constructor-arg type="java.lang.Integer" value="1"/>
        <constructor-arg type="java.lang.String" value="张江博"/>
        <constructor-arg type="java.lang.String" value="xiaomini"/>
    </bean>

测试类

package com.zhangjiangbo.cn;

import com.zhangjiangbo.cn.bean.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

    @org.junit.Test
    public void test01(){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        User user = context.getBean("user", User.class);
        System.out.println(user.toString());
    }
}

3.2 通过set方法创建对象(基础注入)

实体类中必须要有 set方法和无参构造方法

    <bean id="user" class="com.zhangjiangbo.cn.bean.User">
        <property name="id" value="1"/>
        <property name="usrename" value="张江博"/>
        <property name="passwrod" value="xiaomini"/>
    </bean>

输出

在这里插入图片描述

小结:在诶之文件加载的时候,其中管理的对象都已经被初始化了

4、别名

4.1 alias标签

使用标签来设置别名,也可以设置多个别名

    <!--设置别名,在获取bean的时候可以使用别名获取-->
    <alias name="user" alias="testAlias"/>

    <bean id="user" class="com.zhangjiangbo.cn.bean.User">
    <property name="id" value="1"/>
    <property name="usrename" value="张江博"/>
    <property name="passwrod" value="xiaomini"/>
</bean>

也可以在bean标签内使用name属性来定义别名,可定义多个

    <bean id="user" class="com.zhangjiangbo.cn.bean.User" name="user2,user3,user4">
    <property name="id" value="1"/>
    <property name="usrename" value="张江博"/>
    <property name="passwrod" value="xiaomini"/>

测试类修改

	@org.junit.Test
	public void test01(){
	    ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
		// 可以使用别名,也可以使用之前的名称id获取
	    User user = context.getBean("testAlias", User.class);
	    System.out.println(user.toString());
	}

4.2、import标签

一个项目中可能会有很多个bean配置文件,一般来用使用applicationContext.xml作为主配置文件,在这个文件内导入其余的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <import resource="spring.xml"/>

</beans>

测试类修改

    @org.junit.Test
    public void test01(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = context.getBean("testAlias", User.class);
        System.out.println(user.toString());
    }

5、各种数据类型的依赖注入(DI)

  • 依赖注入
  • 依赖:指bean对象的创建依赖于容器,Bean对象的依赖资源
  • 注入:指bean对象所依赖的资源,由容器来设置和装配

5.1 构造器注入

见 3.1

5.2 set注入(重点)

学生类

package com.zhangjiangbo.cn.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {

    private String name;

    private Address address;

    private String[] books;

    private List<String> hobby;

    private Map<String,Object> card;

    private Set<String> games;

    private String girlFriend;

    private Properties info;
}

地址类

package com.zhangjiangbo.cn.bean;

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class Address {

    private String address;
}

5.2.1 常量注入

    <bean id="student" class="com.zhangjiangbo.cn.bean.Student">
        <property name="name" value="张江博"/>
    </bean>

5.2.2 引用类型注入

使用ref来引用其他bean注入到该对象中

    <bean id="student" class="com.zhangjiangbo.cn.bean.Student">
        <!--引用类型,使用ref属性来引入其他bean-->
        <property name="address" ref="address"/>
    </bean>

    <bean id="address" class="com.zhangjiangbo.cn.bean.Address">
        <property name="address" value="北京市昌平区"/>
    </bean>

5.2.3 数组注入

使用property标签下的array标签

    <bean id="student" class="com.zhangjiangbo.cn.bean.Student">
        <!--数组类型-->
        <property name="books">
            <array>
                <value>Java程序设计</value>
                <value>Java编程思想</value>
                <value>Java核心进阶</value>
            </array>
        </property>
    </bean>

5.2.4 List注入

    <bean id="student" class="com.zhangjiangbo.cn.bean.Student">
        <!--List类型-->
        <property name="hobby">
            <list>
                <value>听音乐</value> 
                <value>看电影</value> 
                <value>学习</value> 
            </list>
        </property>
    </bean>

5.2.5 map注入

        <property name="card">
            <map>
                <entry key="身份证" value="130XXXXXXXXXXXXXXX"/>
                <entry key="手机卡" value="157XXXXXXXXX"/>
            </map>
        </property>

5.2.6 set注入

        <property name="games">
            <set>
                <value>王者荣耀</value>
                <value>和平精英</value>
                <value>骑马与砍杀</value>
            </set>
        </property>

5.2.7 Null注入

		<!--方式一-->
        <property name="girlFriend">
            <value>null</value>
        </property>
        <!--方式二-->
        <property name="girlFriend">
        	<null></null>
        </property>

5.2.8 Properties注入

       <property name="info">
           <props>
               <prop key="学号">11111</prop>
               <prop key="姓名">张江博</prop>
               <prop key="性别"></prop>
           </props>
       </property>

测试类

    @org.junit.Test
    public void test02(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Student student = context.getBean("student", Student.class);
        System.out.println(student.toString());
    }

输出

Student(name=张江博, address=Address(address=北京市昌平区), books=[Java程序设计, Java编程思想, Java核心进阶], hobby=[听音乐, 看电影, 学习], card={身份证=130XXXXXXXXXXXXXXX, 手机卡=157XXXXXXXXX}, games=[王者荣耀, 和平精英, 骑马与砍杀], girlFriend=null, info={学号=11111, 性别=, 姓名=张江博})

拓展注入方式

1、p命名空间注入
2、c命名空间注入

p命名空间(通过set方式注入)

1、导入p标签命名空间

package com.zhangjiangbo.cn.bean;

import lombok.Data;

@Data
public class Person {

    private String name;

    private String sex;
}
xmlns:p="http://www.springframework.org/schema/p"
<bean id="person" class="com.zhangjiangbo.cn.bean.Person" p:name="张江博" p:sex=""/>

测试类

    @org.junit.Test
    public void test03(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Person person = context.getBean("person", Person.class);
        System.out.println(person.toString());
    }

注意:通过set方式注入,实体类中必须要有无参构造方法

c命名空间(通过构造器注入)

导入c标签命名空间

 xmlns:c="http://www.springframework.org/schema/c"
<bean id="person" class="com.zhangjiangbo.cn.bean.Person" c:name="张江博" c:sex=""></bean>

测试类同上
注意:使用构造器注入,实体类中必须要有有参构造方法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值