Spring框架(二)IOC控制反转

“现阶段里随着框架的深入式学习,环境的编写越来越多,相反程序码却逐步缩减”

Spring从环境搭建到项目成型

导入核心容器的四个Jar包外加一个日志Jar

XML映射环境雏形

到了Spring这里嘞,依然躲不过 xml 的映射,相比于mybatis环境的 DTD,Spring则是改换成了DTD升级版的 schma,从而更具扩展性。

就像下面的一段xml就是搭建环境的雏形。如果需要引入其他功能,可以在 beans 下添加 xmlns 属性(即引入xsd文件)。

<?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="peo" class="com.yang.pojo.People"></bean>
</beans>

beans 下的 bean 就是对对象的管理,id 属性是对象的唯一标识,class 则要放入全类名。一般情况 id 都需要写明,不过有些 bean 不参与引用,可以不写id

写到这里就可以简单编写一个实现类去测试,看能不能拿到一个People对象

import com.yang.pojo.People;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
        ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
        //转class
        People people=ac.getBean("peo", People.class);
        System.out.println(people);
    }
}

 

Spring创建对象的三种方式

一、构造方法

在 bean 里可以编写一些参数用于对象的构造,不过我们需要在类中事先声明其对应的构造方法。

属性上有这样几个供使用:

index:构造方法里参数的位置从0开始。    name:类属性的名字   

value:直译 值 的意思    ref:引用另一个类即引用其他 bean

<bean id="peo" class="com.yang.pojo.People">

        <!-- ref引用另一个bean value是基本数据类型或String等
    	多属性可控制构造的优先级 -->
         <constructor-arg index="0" name="id" value="123"></constructor-arg>
        <constructor-arg index="1" name="name" value="yang"></constructor-arg> 

</bean>

二、实例工厂

工厂设计模式:帮助创建类对象,一个工厂可以生产多个对象。首先你要建造一间生产车间,才能生产对象。而转观XML这里,也需要同步更新,保证映射具体到哪一间工厂里的哪一个方法。运行结果不出意外 People [ id=1 name=测试实例工厂 ]

public class PeopleFactory {
	public People newInstance() {
		return new People(1, "测试实例工厂");
	}
}

/吴迪的分界线/下面是XML工厂映射
<bean id="factory" class="com.yang.pojo.PeopleFactory"></bean>
<bean id="peo1" factory-bean="factory" factory-method="newInstance"></bean>

三、静态工厂

提到静态,一般情况下事情处理起来就没那么麻烦了。静态工厂不需要创建工厂,对象张口就来。处理方法可以在 newInstance() 方法添加 static 关键字。 xml文件重新编写映射,就像这样。(可以看出没有创建工厂的bean)

public class PeopleFactory {
	//加static关键字变为静态工厂
	public static People newInstance() {
		return new People(1, "测试静态工厂");
	}
}
//同样是吴迪的分界线/
<bean id="peo2" class="com.yang.pojo.PeopleFactory" factory-method="newInstance"></bean>

 

设置注入

所谓设置注入可理解为通过对对象set方法的映射,从而取而代之的过程。这种映射方式可以在XML中 <bean> 里编写<property>实现。实际上就是给类成员赋值额,这一过程如果尝试在 set 方法里输出一句话,程序运行的结果中,可以在控制台看到。

  • Java基本数据类型及String类型可以直接赋值
<property name="id" value="123"> </property>
<property name="name" value="yangyang"> </property>
  • set 容器,在 property 下可选择 <set> 从而为 set 赋多个值。对于其他容器 像 List 这一类单值容器都可以类似方式实现。
<property name="sets">
        <set>
            <value>1</value>
            <value>2</value>
            <value>3</value>
            <value>4</value>
        </set>
</property>
  • map容器,考虑到这类数据含有键值对,操作上也有少许不同
<property name="map">
        <map>
            <entry key="a" value="b" > </entry>
            <entry key="c" value="d" > </entry>
        </map>
</property>

运行结果:People{id=123, name='yangyang', sets=[1, 2, 3, 4], map={a=b, c=d}}

 

DI(依赖注入)

注入依然和设值注入同一个意思,这里的依赖的意思是一个类需要依赖另一个类,把一个类赋值给另一个类的过程就是依赖注入。

这里为了测试先在 com.yang.pojo 包下创建一个 Cat 类添加属性 id 和 voice ,生成setter、getter、重写 toString() 方法。然后再在原先的People 类中添加Cat属性(private Cat cat;

前面我提到了 property 下的 ref 属性,在这里就能用到了。XML映射怎么写呢

首先要拿到这个完整的Cat对象,放在XML就是编写一个管理 Cat 对象的 bean,就像这样

<bean id="cat" class="com.yang.pojo.Cat">
        <property name="id" value="1"> </property>
        <property name="voice" value="miaomiaomiao"> </property>
</bean>

随后在管理 People 对象的 bean 下 添加 property 去引入这一成员

  • <property name="cat" ref="cat"> </property>

运行查看控制台:People{id=123, cat=cat{id=1, voice='miaomiaomiao'}, name='yangyang', sets=[1, 2, 3, 4], map={a=b, c=d}}

 

(2020.05.12添加)

自动注入

在Spring中的注入中不单只局限于依赖类的 set() 方法,我们可以通过改变 bean 中的 autowire 属性来控制使用其他注入方式

byName:通过类和bean的id名字去自动扫描完成注入。  
constructor:通过构造器,这里根据类构造器的传参名和bean名对应,其实类似byName方式
byType:根据 bean 的对象类型去匹配完成注入
还有两个可选项为no和default,字面意思就是

需要注意的是:在Spring中自动注入的执行优先等级特别高,使用之前要检查设计是否有故障

 

这里是一个小总结

到这里就可以明显感受到,几乎一直在编写环境,而程序的编写基本上没变过,后面会怎么样我还不知道,饭要一口一口吃,路要一步一步走。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值