Spring网课第三天

本文深入探讨Spring框架的创建对象时机、如何获取容器对象信息以及DI(依赖注入)的实现,包括基于XML和注解的方式。讲解了IoC(控制反转)在Bean管理中的应用,详细阐述了Set注入和构造注入的原理与实践。同时,介绍了如何在Junit测试中创建和管理Spring对象,以及如何处理特殊属性值、注入外部和内部Bean的情况,最后讨论了XML配置中集合属性的注入方法。

Spring创建对象的时机

	String config = "beans.xml";
	ApplicationContext ac = new ClassPathXmlApplicationContext(config);
		读到这一行的时候,Spring跳转到配置文件去获取类信息
	<bean id= "someService" class = "类路径"/>
	//id一般是开头小写的类名,对应类名开头大写
	//<bean id ="someService" class = "上面的类路径">
	//这样的语法可以从同一个类中简单地创建多个对象
		读取这个<Bean>的时候,对象就被生成了,之后就可以用getBean来获取生成的对象了。

spring默认创建对象的时机:在创建Spring的容器时,会创建配置文件中所有的对象。


获取容器中Spring对象的信息

package course01;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class prepareForTest {

    public  static void  test01() {
        String config = "beans.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);
        //使用Spring提供的方法,来获取容器中定义的对象数量
        int nums  = ac.getBeanDefinitionCount();
        System.out.println("容器中定义对象的数量"+nums);
        //容器中每个定义的对象名称
        String names[] = ac.getBeanDefinitionNames();
        for (String str: names
             ) {
            System.out.println(str);

        }
    }


}

上面展示了获取对象数量和对象名称(字符串数组类型)的api


Spring创建非自定义类的对象?

可以在bean里面配置非自定义类的对象,同样是识别id加上全类名

di实现

DI的实现有两种:
1在Spring的配置文件中,使用标签和属性完成,叫做基于xml的di实现
2使用Spring的注解完成属性赋值,叫做基于注解的di实现

DI:依赖注入

bean实例在调用无参构造器创建对象后,就要对bean对象的属性进行初始化。初始化是由容器自动完成的,称为注入。


IoC操作Bean管理

1)Spring对象创建
2)Spring注入属性


语法分类

根据注入方式的不同,常用的有两类:Set注入,构造注入

set注入(需掌握):
set注入也叫作设值注入,是指,通过setter方法传入被调用者的实例,这种注入方式简单,至关,因而在Spring的依赖注入中大量使用。

构造注入: Spring调用类的有参构造方法,构造对象。在方法中完成赋值


创建Junit测试类的方法

先导入Junit包,一般习惯在src同级目录下加test目录,在需要的方法前加@Test


用无参构造创建基础对象,如果创建了构造函数,需要重新声明无参构造,不然就无法使用

set注入

通过setter方法进行属性注入

 <bean id="book" class="com.study.lele.Bean.BookSetTesting">
        <!--
        做法:在bean标签里面使用Property标签完成属性注入
            name:类里面的属性名称
            value:注入的属性值
        -->
        <property name="bauthor" value="小蕾是天使"></property>
        <property name="bname" value="平平"></property>
    </bean>

测试

@Test
    public void test01(){
        String config = "bean.xml";
        ApplicationContext context = new ClassPathXmlApplicationContext(config);
        BookSetTesting book = (BookSetTesting) context.getBean("book");
        System.out.println(book);

    }

简化:p名称空间注入

1在beans里加上属性: xmlns:p(xml约束,命名空间)		
	="..../(前面的beans改成p{为了区分})"
2 <bean id="book" class="com.study.lele.Bean.BookSetTesting"
p:bname="值1" p:bauthor="值2">
		相当于简化后的Property(一般没谁这么做)
    </bean>

构造注入

通过有参构造函数进行属性注入

<bean id = "order1" class="com.study.lele.Bean.TOrder">
        <!-- 使用constructor-arg标签-->
        <constructor-arg name="oname" value="abc"></constructor-arg>
        <constructor-arg name="address" value="GDOU"></constructor-arg>
   </bean>
注入的是构造函数的每个参数。

向属性里面设置特殊值

一般

  1. null值
<property><null></property>
  1. 属性值包含特殊符号
假如是<>
1 转义符号 &lt;&gt;
2 不想转义
	把带特殊符号内容写进CDATA【xml里面的自带空间】
<value><![CDATA[<<尖括号>]]></value>
包含在CDATA里面的部分被告知原样输出。

注入外部bean

三层架构先来两层——>service 调用dao
  • 1 创建两个类service和dao类
  • 2 在service里面调用dao的方法
  • 3 在Spring配置文件中进行配置。
  • 4 将dao注入到service
    (上面说明注入的类型不仅仅是内置类型)
 <bean id="userService" class="com.study.lele.serviceTest1.UserService01">
        <!--
            注入userDao对象
            name属性值:类里面的属性名称
            ref属性:创建userDao对象bean标签里面的id值,通过id值找到这个对象并且注入进来
        -->
        <property name="userDao" ref="userDaoImpl"></property>
    </bean>
    <!--2userDao是一个街口,要创建对象实际上是创建接口的实现类-->
    <bean id="userDaoImpl" class="com.study.lele.daoTest1.impl.UserDaoImpl">
    </bean>

注入内部bean和级联赋值

(1)一对多关系:部门和员工
一个部门里面可以有多个员工,一个员工属于某一个部门

(2)在实体类之间表示一对多关系,将所属部门作为员工实例的一个属性。
(3)在Spring文件中进行配置

  <bean id="emp" class="com.study.lele.Bean.beanTest2.Emp">
<!--    设置两个普通属性    -->
        <property name="eName" value="lele"></property>
        <property name="eEnder" value="男"></property>
<!--    设置对象类型属性    -->
        <property name="dept" >
            <bean id ="dept" class="com.study.lele.Bean.beanTest2.Dept">
                <property name="dname" value="实践部"></property>
            </bean>
        </property>
    </bean>

使用如上方法,可以在bean的内部声明一个要创建的bean作为属性,不用声明以后再引入。

级联赋值

写法
1   <bean id="emp" class="com.study.lele.Bean.beanTest2.Emp">
<!--    设置两个普通属性    -->
        <property name="eName" value="lele"></property>
        <property name="eEnder" value="男"></property>
<!--    设置对象类型属性    -->
        <property name="dept"  ref="dept">
         </property>
         <property name="dept.dname" value="技术部">
         </property>
    这里要求dept对象有getter()
    可以在引入dept对象的同时对该对象的属性进行赋值。
         
    </bean>
 <bean id ="dept" 
 class="com.study.lele.Bean.beanTest2.Dept">
 <property name ="dname" value ="财务部"></property>

xml注入集合属性

  1. 注入数组类型属性
  2. 注入List集合类型属性
  3. 注入Map集合类型属性
package com.study.lele;

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

public class Stu {
    //1 数组类型的属性
    private  String [] course;

    //2 list集合类型的属性
    private List<String> list;
    
    //3 Map集合类型的属性
    private Map<String,String> maps;

    //4 set集合类型的属性
    private Set<String> sets;

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

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

    public void setMaps(Map<String, String> maps) {
        this.maps = maps;
    }

    public void setCourse(String[] course) {
        this.course = course;
    }
    
}

1 创建类,定义数组,list,map,set类型属性,设置对应setter()
<?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">
<!--1集合类型属性注入-->
        <bean id="stu" class="com.study.lele.Stu">
<!--数组类型属性注入            -->
            <property name="course" >
                <array>
                    <value>java</value>
                    <value>C++</value>
                    <value>C</value>
                    <value>Python</value>
                </array>
            </property>
<!--list类型属性注入            -->
            <property name="list">
                <list>
                    <value>li1</value>
                    <value>li2</value>
                    <value>li3</value>
                    <value>li4</value>
                </list>
            </property>
<!--map类型属性注入            -->
            <property name="maps">
                <map>
                    <entry key="java" value="1"></entry>
                    <entry key="C++" value="2"></entry>
                    <entry key="Python" value="0"></entry>

                </map>
            </property>
<!-- set类型属性注入           -->
            <property name="set">
                <set>
                    <value>MySQL</value>
                    <value>Redis</value>
                    <value>SQLServer</value>
                </set>
            </property>
        </bean>
</beans>

如图,Spring配置文件提供了多种集合标签用于给集合属性进行赋值。

那要是在集合里设置对象类型值呢?

package com.study.lele;

public class Course {
    private String cname;

    public void setCname(String cname) {
        this.cname = cname;
    }

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

使用如下方法给一个course的List赋值

          <property name="courseList">
                <list>
                    <ref bean = "course1"></ref>
                    <ref bean = "course2"></ref>
                </list>
            </property>
        </bean>
    <bean id="course1" class="com.study.lele.Course"><property name="cname" value="Spring5"></property></bean>
    <bean id="course2" class="com.study.lele.Course"><property name="cname" value="MyBatis"></property></bean>
  • 将集合注入部分提取出来
    1 在Spring配置文件中引入名称空间util
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util" 
       xsi:schemaLocation="http://www.springframework.org/schema/util  http://www.springframework.org/schema/util/spring-util.xsd">

2 在里面使用util标签完成list集合注入抽取

<!--提取list集合类型属性注入    -->
    <util:list id="bookList">
        <value>1</value>
        <value>2</value>
        <value>3</value>
    </util:list>
<!--使用    -->
    <bean id="book" class="com.study.lele.Book">
        <property name="list" ref="bookList"></property>
    </bean>

相当于定义了一个公用命名空间里的常量,所有的bean都可以用它来赋值自己的集合呢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值