官网地址: 官网地址:https://spring.io/
Spring框架网址地址: https://spring.io/projects/spring-framework
Spring使Java编程对每个人来说都更快、更容易、更安全。Spring对速度、简单性和生产力的关注使其成为世界上最流行的Java框架。Spring 是轻量级的框架
Spring的7大模块
2.1 单例模式(Singleton):
单例是指在整个应用程序上下文中只创建一个实例,并且所有的请求都会返回同一个实例
默认情况下,Spring容器中的Bean都是单例的
单例模式适用于那些不需要维护状态的Bean,或者对资源消耗较大的Bean进行共享
缺点:使用单例会有变量污染,单例是根据spring上下文初始化;容器生对象生,容器死对象死
2.2 多例模式(Prototype):
多例是指每次请求时都会创建一个新的实例,每个实例都是独立的
每次从容器中获取该Bean时,都会创建一个新的实例
多例模式适用于那些需要维护状态的Bean,或者对资源消耗较小的Bean进行独立创建
缺点:使用多例及其消耗内存,多例使用时候才会创建,销毁跟着jvm走。
总结:IOC就是将Dao层要实现的方法传输到applicationContext.xml文件中,交给Spring容器统一存储,然后再想要实现方法的时候,直接以getBean的方式调用,实现了解耦的过程,也可以说是解决了迁一发而动全身的过程.
反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:反转了资源的获取方向——改由容器主动的将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本,提高了开发的效率。这种行为也称为查找的被动形式。
对象创建的权利交给Spring容器管理,由容器管理对象的生命周期,以后用户使用对象从容器中动态获取,从架构角度,降低了代码的耦合性!
创建对象的原理:反射机制, 反射必然调用无参构造
1.创建bean对象
2.添加依赖
3.创建applicationContext.xml
4.Test测试
如果说BeanFactory是Spring的心脏,那么ApplicationContext就是完整的身躯了。
ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。
1.通过API ClassPathXmlApplicationContext
2.容器加载指定的配置文件"applicationContext.xml"
3.容器逐行解析其中的bean标签
将bean中的id当做map中的key
根据反射机制 根据class创建对象, 当做Map中的value保存在内存中
4.通过getBean获取获取对象
5.调用对象中的方法
1.根据对象名.class的方式获取
2.根据bean对象的唯一标识符 id 获取对象 getBean("helloSpring"),需要强转
3.根据id和class取值 getBean("helloSpring",HelloSpring)
1.静态工厂
在定义使用静态工厂方法创建的bean时,使用class属性指定包含静态工厂方法的类,使用factory-method属性指定工厂方法本身的名称。您应该能够调用这个方法(带有可选参数,如后面所述)并返回一个活动对象,该对象随后被视为是通过构造函数创建的。这种bean定义的一个用途是在遗留代码中调用静态工厂。
下面的bean定义指定通过调用工厂方法来创建bean。定义不指定返回对象的类型(类),只指定包含工厂方法的类。在本例中,createInstance()方法必须是一个静态方法。下面的例子展示了如何指定一个工厂方法:
package com.factory;
import java.util.Calendar;
public class staticFactory {
public static Calendar getCalendar(){
return Calendar.getInstance();
}
}
@Test
public void testStaticFactory(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Calendar calendar = (Calendar) context.getBean("staticFactory");
System.out.println(calendar.getTime());
}
2.实例工厂
与通过静态工厂方法实例化类似,使用实例工厂方法实例化将从容器中调用现有bean的非静态方法来创建新bean。要使用这种机制,将class属性保留为空,并在factory-bean属性中指定当前(或父或父)容器中bean的名称,该容器包含要调用来创建对象的实例方法。使用factory-method属性设置工厂方法本身的名称。下面的例子展示了如何配置这样一个bean:
package com.factory;
public class instanceFactory {
public void factory(){
System.out.println("实例工厂");
}
}
@Test
public void testInstanceFactory(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Object factory1 = context.getBean("factory1");
System.out.println(factory1);
}
3.Spring工厂(重点!!!)
在加载类的时候,发现这个类实现了特定的接口,方法会自动调用,把获取的对象交给Spring容器管理,并且key是这个id="springFactory"
泛型使用Calendar是因为Calendar是一个抽象类,抽象类是不能直接new的
package com.factory;
import org.springframework.beans.factory.FactoryBean;
import java.util.Calendar;
public class MySpringFactory implements FactoryBean {
//获取对象
@Override
public Calendar getObject() throws Exception {
return Calendar.getInstance();
}
//获取类型
@Override
public Class> getObjectType() {
return Calendar.class;
}
//是否为单例对象: true 容器中独一份 Controller/Service/Dao
// 多例对象 false 容器中有多份对象 数据库连接
@Override
public boolean isSingleton() {
return true;
}
}
@Test
public void textSpringFactory(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Calendar calendar = (Calendar) context.getBean("springFactory");
Calendar calendar2 = (Calendar) context.getBean("springFactory");
System.out.println(calendar.getTime());
System.out.println(calendar == calendar2);
}
结果值为true 表明是单例模式,为false则是多例模式
小结:什么情况下使用工厂模式?
不方便直接new对象的时候使用,比如数据库连接.......