初识Spring

1.Spring介绍(外网,访问较慢)

官网地址: 官网地址:https://spring.io/
Spring框架网址地址: https://spring.io/projects/spring-framework

Spring使Java编程对每个人来说都更快、更容易、更安全。Spring对速度、简单性和生产力的关注使其成为世界上最流行的Java框架。Spring 是轻量级的框架

Spring的7大模块

初识Spring_第1张图片

2.Spring Framework特性(重要)

  • 控制反转:IOC——Inversion of Control,翻转资源获取方向。把自己创建资源、向环境索取资源变成环境将资源准备好,我们享受资源注入。
  • 面向切面编程:AOP——Aspect Oriented Programming,在不修改源代码的基础上增强代码功能。

初识Spring_第2张图片

Spring Bean的单例与多例的作用域


2.1 单例模式(Singleton):
单例是指在整个应用程序上下文中只创建一个实例,并且所有的请求都会返回同一个实例
默认情况下,Spring容器中的Bean都是单例的
单例模式适用于那些不需要维护状态的Bean,或者对资源消耗较大的Bean进行共享
缺点:使用单例会有变量污染,单例是根据spring上下文初始化;容器生对象生,容器死对象死

2.2 多例模式(Prototype):
多例是指每次请求时都会创建一个新的实例,每个实例都是独立的
每次从容器中获取该Bean时,都会创建一个新的实例
多例模式适用于那些需要维护状态的Bean,或者对资源消耗较小的Bean进行独立创建
缺点:使用多例及其消耗内存,多例使用时候才会创建,销毁跟着jvm走。
 

3.IOC容器介绍

总结:IOC就是将Dao层要实现的方法传输到applicationContext.xml文件中,交给Spring容器统一存储,然后再想要实现方法的时候,直接以getBean的方式调用,实现了解耦的过程,也可以说是解决了迁一发而动全身的过程.

反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:反转了资源的获取方向——改由容器主动的将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本,提高了开发的效率。这种行为也称为查找的被动形式。

对象创建的权利交给Spring容器管理,由容器管理对象的生命周期,以后用户使用对象从容器中动态获取,从架构角度,降低了代码的耦合性!

初识Spring_第3张图片

4.入门案例

创建对象的原理:反射机制, 反射必然调用无参构造

1.创建bean对象

初识Spring_第4张图片

2.添加依赖

初识Spring_第5张图片

3.创建applicationContext.xml

初识Spring_第6张图片

初识Spring_第7张图片

4.Test测试

初识Spring_第8张图片

ApplicationContext总结

如果说BeanFactory是Spring的心脏,那么ApplicationContext就是完整的身躯了。

ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。

5.Spring容器的运行步骤:

1.通过API ClassPathXmlApplicationContext

2.容器加载指定的配置文件"applicationContext.xml"

3.容器逐行解析其中的bean标签

   将bean中的id当做map中的key

  根据反射机制  根据class创建对象, 当做Map中的value保存在内存中

4.通过getBean获取获取对象

5.调用对象中的方法

6.获取对象的三种方法

1.根据对象名.class的方式获取

2.根据bean对象的唯一标识符 id 获取对象 getBean("helloSpring"),需要强转

3.根据id和class取值  getBean("helloSpring",HelloSpring)

7.工厂模式

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对象的时候使用,比如数据库连接.......

你可能感兴趣的:(spring,java,数据库)