学习博客:【Spring】依赖注入

DI 依赖注入

1. 构造器注入

2. Set方式注入(重点)

  • 依赖注入:Set注入
    • 依赖:bean 对象的创建依赖于容器
    • 注入:bean 对象的所有属性由容器注入

搭建环境

  • 复杂类型

    public class Address {
        private String address;
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    }
    
  • 测试对象

    import java.util.*;
    public class Student {
        private String name;
        private Address address;
        private String[] books;
        private List<String> hobbys;
        private Map<String,String> card;
        private Set<String> games;
        private String wife;
        private Properties info;
    }
    
  • 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
            https://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="student" class="com.yl.pojo.Student">
            <!--基本类型注入  value-->
            <property name="name" value="杨杨"/>
        </bean>
    
    </beans>
    
  • 测试

    import com.yl.pojo.Student;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Test {
        public static void main(String[] args) {
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    
            Student student = (Student)context.getBean("student");
    
            System.out.println(student.getAddress());
    
        }
    

注入信息

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="address" class="com.yl.pojo.Address">
        <property name="address" value="北京"/>
    </bean>

    <bean id="student" class="com.yl.pojo.Student">
        <!--基本类型注入  value-->
        <property name="name" value="杨杨"/>

        <!--bean 注入   ref-->
        <property name="address" ref="address"/>

        <!--数组-->
        <property name="books">
            <array>
                <value>数学分析</value>
                <value>高等代数</value>
                <value>离散数学</value>
                <value>程序设计</value>
            </array>
        </property>

        <!--List-->
        <property name="hobbys">
            <list>
                <value>听歌</value>
                <value>看书</value>
                <value>打豆豆</value>
            </list>
        </property>

        <!--Map-->
        <property name="card">
            <map>
                <entry key="学生证" value="190101211"/>
                <entry key="身份证" value="65274824724724270"/>
            </map>
        </property>

        <!--Set-->
        <property name="games">
            <set>
                <value>英雄联盟</value>
                <value>飞车</value>
                <value>糖豆人</value>
            </set>
        </property>

        <!--null-->
        <property name="wife">
            <null/>
        </property>
<!--        <property name="wife" value=""/>-->

        <!--properties-->
        <property name="info">
            <props>
                <prop key="年龄">22</prop>
                <prop key="城市">南京</prop>
            </props>
        </property>

    </bean>

</beans>

3. 拓展方式注入

p命名空间与c命名空间

  • 导入 xml 约束

    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:c="http://www.springframework.org/schema/c"
    

userbeans.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"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--p命名空间注入 可直接注入属性的值  xmlns:p="http://www.springframework.org/schema/p"-->
    <bean id="user" class="com.yl.pojo.User" p:name="杨洋" p:age="31" p:admin="true"/>

    <!--c命名空间注入 xmlns:c="http://www.springframework.org/schema/c"-->
    <bean id="user2" class="com.yl.pojo.User" c:name="李丽" c:age="19" c:admin="true"/>

</beans>
@Test
public void test(){
    ApplicationContext context = new ClassPathXmlApplicationContext("userbeans.xml");
    User user = context.getBean("user2", User.class);
    System.out.println(user);
}

4. bean的作用域

ScopeDescription
singleton(默认)将单个 bean 定义限定为每个 Spring IoC 容器的单个对象实例。
prototype将单个 bean 定义限定为任意数量的对象实例。
request将单个 bean 定义限定为单个 HTTP 请求的生命周期。也就是说,每个 HTTP 请求都有自己的 bean 实例,该实例是在单个 bean 定义的后面创建的。仅在 Web 感知 Spring 的上下文中有效ApplicationContext
session将单个 bean 定义限定为 HTTP 的生命周期Session。仅在 Web 感知 Spring 的上下文中有效ApplicationContext
application将单个 bean 定义限定为ServletContext. 仅在 Web 感知 Spring 的上下文中有效ApplicationContext
websocket将单个 bean 定义限定为WebSocket. 仅在 Web 感知 Spring 的上下文中有效ApplicationContext
  1. 单例模式(Spring默认机制)

    <bean id="user2" class="com.yl.pojo.User" c:name="李丽" c:age="19" c:admin="true" scope="singleton"/>
    
    @Test
    public void test(){
        ApplicationContext context = new ClassPathXmlApplicationContext("userbeans.xml");
        User user = context.getBean("user2", User.class);
        User user2 = context.getBean("user2", User.class);
        System.out.println(user.hashCode());
        System.out.println(user2.hashCode());
        System.out.println(user==user2);
    
    }
    

在这里插入图片描述

  1. 原型模式(每次从容器获取时,都会产生一个新对象)

    <bean id="user2" class="com.yl.pojo.User" c:name="李丽" c:age="19" c:admin="true" scope="prototype"/>
    
    @Test
    public void test(){
        ApplicationContext context = new ClassPathXmlApplicationContext("userbeans.xml");
        User user = context.getBean("user2", User.class);
        User user2 = context.getBean("user2", User.class);
        System.out.println(user.hashCode());
        System.out.println(user2.hashCode());
        System.out.println(user==user2);
        
    }
    

在这里插入图片描述

  1. request、session、application,只在web开发中使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值