Spring配置和依赖注入

Spring配置

别名

<!--    如果添加了别名,我们也可以使用其获取到这个对象-->
    <alias name="user" alias="gg"/>

Bean的配置

<!--    name也是别名,可以取多个-->
    <bean id="userT" class="com.kuang.pojo.UserT" name="userT2 u,u1;u2" >
        <property name="name" value="sanni"/>
    </bean>

import

一般用于团队开发使用,它可以将多个配置文件导入合并为一个
假设现在项目中有多个人开发,这三人复制不同的类开发,不同的类需要注册在不同的bean中,我们可以利用import将所有人的beans.xml合并为一个总的!(当导入时出现id相同状况时,相同id相同内容合并,相同id不同内容后来居上覆盖)

  • applicationContext.xml
<import resource="beans.xml"/>
<import resource="beans2.xml"/>
<import resource="beans3.xml"/>

依赖注入

构造器注入

Set方法注入

  • 依赖注入本质是Set注入
    • 依赖:bean对象的创建依赖于容器
    • 注入:bean对象中的所有属性,由容器来注入
  • 环境搭建
    1.复杂类型
    public class Address {
        private String address;
    
        public String getAddress(){
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    }
    
    2.真实测试对象
    public class Student {
        private String name;
        private Address address;
        private String[] books;
        private List<String> hobbies;
        private Map<String,String> card;
        private Set<String> games;
        private String wife;
        private Properties info;
    }
    
    3.beans.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">
    <!--使用spring来创建对象,在spring这些都称为bean-->
    <!--  1,下标赋值 2参数类型string,不建议使用   -->
        <bean id="address" class="com.gy.pojo.Address">
            <property name="address" value="西安"/>
        </bean>
    
        <bean id="student" class="com.gy.pojo.Student">
    <!--        第一种,普通值注入,value-->
            <property name="name" value="alice"/>
            <!--第二种,Bean注入,ref-->
            <property name="address" ref="address"/>
            <!--数组注入-->
            <property name="books">
                <array>
                    <value>红楼梦</value>
                    <value>西游记</value>
                    <value>水浒传</value>
                    <value>三国演义</value>
                </array>
            </property>
            <!--List-->
            <property name="hobbies">
                <list>
                    <value>听歌</value>
                    <value>敲代码</value>
                    <value>看电影</value>
                </list>
            </property>
            <!--MAP-->
            <property name="card">
                <map>
                    <entry key="身份证" value="111111200011111111"/>
                    <entry key="银行卡" value="1111111111111111111"/>
                </map>
            </property>
            <!--set-->
            <property name="games">
                <set>
                    <value>LOL</value>
                    <value>CS</value>
                </set>
            </property>
            <!--NULL-->
            <property name="wife">
                <null/>
            </property>
            <!--properties-->
            <property name="info">
                <props>
                    <prop key="学号">18100101120</prop>
                    <prop key="性别">女</prop>
                    <prop key="姓名">耿耿</prop>
                </props>
            </property>
        </bean>
    </beans>
    
    4.测试类
    public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        Student student = (Student) context.getBean("student");
        System.out.println(student.toString());
    //        Student{
    //        name='alice',
    //        address=Address{address='西安'},
    //        books=[红楼梦, 西游记, 水浒传, 三国演义],
    //        hobbies=[听歌, 敲代码, 看电影],
    //        card={身份证=111111200011111111,
    //        银行卡=1111111111111111111},
    //        games=[LOL, CS], wife='null',
    //        info={学号=18100101120, 性别=女, 姓名=耿耿}}
        }
    }
    

扩展方式注入

我们可以使用p命令空间和c命令空间进行注入,需要导入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
        http://www.springframework.org/schema/beans/spring-beans.xsd">
   <!--使用spring来创建对象,在spring这些都称为bean-->
    <!--p命名空间注入,可以直接注入属性的值:properties-->
    <!--p命名就是set方式注入,需要无参构造和set方法,c命名就是构造器注入,需要有参构造-->
    <bean id="user" class="com.gy.pojo.User" p:name="alice" p:age="22"/>
    <bean id="user2" class="com.gy.pojo.User" c:age="18" c:name="gy"/>
</beans>

Bean的作用域

1.单例模式(SPRING默认机制)

<bean id="user2" class="com.gy.pojo.User" c:age="18" c:name="gy" scope="singleton"/>

2.原型模式(prototype):每次从容器中get的时候,都会产生一个新对象。有些情况下所有线程要共享一个对象,对这个对象进行修改,那另一个线程过来也要修改,有两种方式,加锁和原型模式
3.其余的request、session、application只能在web开发使用

posted @ 2023-04-08 18:42  gyViolet  阅读(27)  评论(0编辑  收藏  举报