Spring 框架 的特点
它是一个开源的企业应用开发框架,AOP实现,灵活应变,Web集成,低耦合等 通过Java反射技术创建对象 通过配置文件(xml)组装对象
使用Spring 框架 #01 –通过配置文件获取对象
** 在这之前,我们先来了解一下 什么是 Spring IoC。 **
Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下:
●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
●为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
用图例说明一下,传统程序设计如图2-1,都是主动去创建相关对象然后再组合起来:
当有了IoC/DI的容器后,在客户端类中不再主动去创建这些对象了,如图2-2所示:
图1-2有IoC/DI容器后程序结构示意图
引用自 https://blog.csdn.net/qq_22654611/article/details/52606960
接下来我们将列举出IOC创建出的对象和传统方式的不同之处。
/**
* Phone类
* @author i_apples
*
*/
public class Phone {
private Card card;
public Phone(String num){
this,card.
}
public void setCard(Card card) {
this.card = card;
}
public void call(int num){
System.out.println(card.getNumber()+"正在拨号"+num);
}
}
/**
* Card类
* @author i_apples
*
*/
public class Card {
private int number;
public int getNum() {
return this.number;
}
}
我们打电话首先是需要一个手机
Phone phone = new Phone();
** 然后我们需要一张卡**
Card card = new Card(6677012);
** 接着我们需要把卡装入手机,并开始拨号 **
phone.setCard(card);
phone.call(110);
** 结果:6677012 正在拨号 110 **
我们的关注点都放在了手机和sim卡的创建上,如果我们每次都需要打电话,难道每次都需要新买手机然后设置手机卡吗?想想在现实生活中,2000我们小学生时代还没有手机,当时打电话给父母只能去小卖部租电话打,所以那时我们打电话并不需要关心用的是谁的手机号吗打出去的,我们的目的只是和父母能正常通话而已,
我们在抽象到java中,我们每次去打电话都是去的同一家小卖部【IOC容器池】,每次也都是向同一个老板要的手机(取出的对象地址都是一样的)
小卖部 就是 Spring 中的配置对象场所,通常是.xml文件,也是 IOC容器池
而小卖部老板的手机就是 JavaBean 对象,可以理解成设置好属性的对象
** 现在我们看看和之前的传统方式有什么不同**
1.创建配置对象池
2.往对象池里面创建对象
3.引用对象池
ApplicationContext context = new ClassPathXmlApplicationContext("applicationConfig.xml");
4.在对象池里面取出对象(这里的对象可以取无数个)
Phone phone = context.getBean("phone",Phone.class); //根据对象池Bean的ID进行引用,并指明引用对象的类型
Card card = context.getBean("card",Card.class);
完整代码
ApplicationContext context = new ClassPathXmlApplicationContext("applicationConfig.xml");
Card card = context.getBean("card",Card.class);
System.out.print(card.getNumber());
** 结果:13534675892 **
在这里,我们直接在对象池里获取了Card的一个实例,直接就带有了属性。这个属性配置是在对象池里完成的(Bean中的constructor-arg 中的 value),这种方式叫做构造注入
** 注:constructor-arg 是指有参构造的参数列表 **
除了构造注入,通常还可以使用setter注入(调用set方法)
**在此之前 我们把上面的Card类加入set方法。 **
/**
* Card类
* @author i_apples
*
*/
public class Card {
private int number;
public int getNum() {
return this.number;
}
public void setNumber(int number) {
this.number = number;
}
}
**加入完set方法之后,我们在对象池做以下改动: **
** 接下来我们获取这个实体 **
ApplicationContext context = new ClassPathXmlApplicationContext("applicationConfig.xml");
Card card = context.getBean("card",Card.class);
System.out.print(card.getNumber());
** 结果:123456789 **