SpringBean的注入方式

spring的IoC容器,容器中存放了很多的对象,这些对象都是由spring来创建的,spring会把对象缓存在HashMap集合当中,key就是Bean的Id名称,value就是对象,想要找到想要的对象的时候,可以使用Bean的Id名称去HashMap中根据key去查找到所对应的对象,就可以得到想要的对象。

SpringBean的管理方式

什么是bean的管理方式呢?

bean的管理方式有哪些呢?

1.spring帮我们创建对象(底层是使用反射技术实现的)

基于xml方式管理bean对象(新手使用)

基于注解的方式管理bean对象(spring boot)

2.spring对我们的对象注入属性

//定义一个属性userName
private String userName;

定义完成后需要注入属性的内容值,可以通过spring来实现。

首先需要创建一个bean对象的配置文件,需要在该配置文件中定义一个bean的标签

//在配置文件中定义一个bean标签
<bean id="userEntity" class="wut.jayson.entity.UserEntity"></bean>

Id:bean的名称,是不允许重复的,默认小驼峰格式

Class:当前该类完整路径地址(包名+类名)组合,使用class完整路径地址,因为spring底层是使用反射技术去初始化对象默认情况下是执行无参构造函数

    //一定要有无参构造函数
    public UserEntity() {
        System.out.println("使用反射初始化");
    }
import org.springframework.context.support.ClassPathXmlApplicationContext;
import wut.jayson.entity.UserEntity;

public class Test01 {
    public static void main(String[] args) {
//        new UserEntity().addUser();
        // 1.读取xml配置文件
        ClassPathXmlApplicationContext classPathXmlApplicationContext = 
new ClassPathXmlApplicationContext("spring.xml");
        // 2.根据bean的id获取bean对象
        UserEntity userEntity =
classPathXmlApplicationContext.getBean("userEntity", UserEntity.class);
        System.out.println(userEntity.toString());
        userEntity.addUser();
    }
}

没有无参构造函数会报错

实体类中的内容:

package wut.jayson.entity;

public class UserEntity {
    private String userName;
    //定义一个属性userName
    public void addUser(){
        System.out.println("添加用户");
    }
    //一定要有无参构造函数
    public UserEntity() {
        System.out.println("2.使用反射初始化");
    }

运行的结果为:


DI依赖注入:给对象的属性注入值 。(由spring来完成的)

第一种实现方式:基于对象属性set方法实现

//在实体类中添加对应属性的set方法
    public void setUserName(String userName) {
        this.userName = userName;
    }

在spring.xml文件中进行编码,在bean标签下,定义一个属性property标签

name对应的是类中的属性名称,value对应的是需要注入的属性值

<bean id="userEntity" class="wut.jayson.entity.UserEntity">
        <property name="userName" value="jayson"></property>
    </bean>

//在底层使用反射技术,调用setUserName进行赋值

也就是说把标签中的内容变成 setUserName(value="jayson")

    public void setUserName(String userName) {
        this.userName = userName;
    }

第二种实现方式:基于有参构造函数去实现

首先创建一个有参构造函数(注意创建了有参的构造函数,不要忘记了无参构造函数)

public UserEntity(String userName) {
        this.userName = userName;
    }

在到spring.xml文件中对bean进行编辑

<!-- 基于有参构造函数初始化对象 同时注入属性值 -->
<bean id="userEntity" class="wut.jayson.entity.UserEntity">
        <property name="userName" value="jayson"></property>
    </bean>

还可以把name 换成 index 进行选择 注入属性

<bean id="userEntity" class="wut.jayson.entity.UserEntity">
        <constructor-arg index="0" value="yc_jayson"></constructor-arg>
    </bean>

第三种实现方式:基于P名称的空间的注入值(实际开发用的比较少)

同样是在spring.xml配置文件中进行操作

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       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">
    <!-- 配置注入spring bean对象 bean的id是不允许重复的-->
    
    <bean id="userEntity" class="wut.jayson.entity.UserEntity" p:userName="p_jayson">
    </bean>
    <!--class 完整路径的组合  底层使用反射技术初始化对象    默认执行无参构造函数-->

</beans>

在 beans 标签中 插入属性xmlns:p="http://www.springframework.org/schema/p"

在bean标签写入p标签属性就可以实现 注入属性

注入空值和特殊符号

在配置文件中编写注入空值

<bean id="userEntity" class="wut.jayson.entity.UserEntity">
        <property name="userName" value="null"></property>
    </bean>

如果在配置文件中,给value值注入一个null。实际上就是一个字符串null值

<property name="userName"> <null></null></property>

使用null标签进行注入的值,才是真正意义上的空值

在配置文件中编写注入特殊符号 

转移注入方式

&lt; 代表<   &gt; 代表>

<property name="userName" value="&lt;&lt;湖北武汉&gt;&gt;"></property>

 CDATA特殊符号注入

<property name="userName"><value><![CDATA[<<武汉>>]]></value></property>

一样的效果

如何注入属性外部bean对象

 如何注入属性内部bean对象

再数据库表中可能会涉及到一对多或一对一的关系

比如:有一个部门有N个员工。这属于一对多关系

站在员工的角度看,员工属于哪个部门

站在不们的角度看,部门下有N多个员工

员工实体类:

package wut.jayson.entity;

public class EmpEntity {
    private String name;
    private String address;


    private DeptEntity deptEntity;//告诉我们这个员工属于哪个部门

    public void setName(String name) {
        this.name = name;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public void setDeptEntity(DeptEntity deptEntity) {
        this.deptEntity = deptEntity;
    }

    public DeptEntity getDeptEntity() {
        return deptEntity;
    }

    @Override
    public String toString() {
        return "EmpEntity{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", deptEntity=" + deptEntity +
                '}';
    }
}

部门实体类: 

package wut.jayson.entity;

public class DeptEntity {
    private String departmentName;

    public void setDepartmentName(String departmentName) {
        this.departmentName = departmentName;
    }

    @Override
    public String toString() {
        return "DeptEntity{" +
                "departmentName='" + departmentName + '\'' +
                '}';
    }
}

spring3.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">
<!--    注入内部的bean对象     -->
<bean id="empEntity" class="wut.jayson.entity.EmpEntity">
    <property name="name" value="jayson"></property>
    <property name="address" value="湖北武汉"></property>
    <property name="deptEntity" >
        <bean id="deptEntity" class="wut.jayson.entity.DeptEntity">
            <property name="departmentName" value="java开发"></property>
        </bean>
    </property>
</bean>
</beans>

Test:

public static void main(String[] args) {
    ClassPathXmlApplicationContext classApp = new ClassPathXmlApplicationContext("spring3.xml");
    EmpEntity empEntity = (EmpEntity) classApp.getBean("empEntity");
    System.out.println(empEntity.toString());
}

运行结果:EmpEntity{name='jayson', address='湖北武汉', deptEntity=DeptEntity{departmentName='java开发'}}

级联赋值:

<?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="empEntity" class="wut.jayson.entity.EmpEntity">
        <!--    两个属性     -->
        <property name="name" value="jayson"></property>
        <property name="address" value="湖北武汉"></property>
        <property name="deptEntity" ref="deptEntity"></property>
        <!--    在EmpEntity中需要创建一个 deptEntity的get方法才可以进行赋值操作     -->
        <property name="deptEntity.departmentName" value="jayson02"></property>
    </bean>
<bean id="deptEntity" class="wut.jayson.entity.DeptEntity">
</bean>
</beans>

注入集合类型属性

1.注入数组类型

2.注入list集合类型

3.注入Map集合属性 

4.注入set集合属性

定义一个StuEntity类

package wut.jayson.entity;

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

public class StuEntity {
    private String[] arrays;//注入数组类型
    private List<String> list;//注入list集合类型
    private Map<String,String> map;//注入map集合类型属性
    private Set<String> set;//注入set集合类型属性

    public void setArrays(String[] arrays) {
        this.arrays = arrays;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    public void setSet(Set<String> set) {
        this.set = set;
    }

    @Override
    public String toString() {
        return "StuEntity{" +
                "arrays=" + Arrays.toString(arrays) +
                ", list=" + list +
                ", map=" + map +
                ", set=" + set +
                '}';
    }
}

编写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">
    <bean id="stuEntity" class="wut.jayson.entity.StuEntity">
        <property name="arrays">
            <!--数组的方式-->
            <array>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </array>
        </property>
        <property name="list">
            <!--list集合的方式-->
            <list>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </list>
        </property>
        <property name="map">
            <!--map集合的方式-->
            <map>
                <entry key="1" value="1"></entry>
                <entry key="2" value="2"></entry>
                <entry key="3" value="3"></entry>
            </map>
        </property>
        <property name="set">
            <!--set集合的方式-->
            <set>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </set>
        </property>
    </bean>
</beans>

还有一种在list中嵌套一个bean

<property name="course">
            <list>
                <ref bean="courseEntity_java"></ref>
                <ref bean="courseEntity_BigData"></ref>
            </list>
        </property>
    </bean>
    <bean id="courseEntity_java" class="wut.jayson.entity.CourseEntity">
        <property name="courseName" value="java"></property>
    </bean>
    <bean id="courseEntity_BigData" class="wut.jayson.entity.CourseEntity">
        <property name="courseName" value="java"></property>
    </bean>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值