1、Spring简介

Spring -> 春天

1.1 什么是Spring

Spring框架是一个开源的J2EE应用程序框架,是对Bean的生命周期进行管理的轻量级容器。它的主要作用是将其他框架进行整合,以一种统一的通用的方法进行管理。

1.2 什么是Bean

被Spring容器管理的对象称之为Bean。

1.3 Spring理念

使现有的技术更加容易使用,解决企业应用开发的复杂性,整合了现有的技术框架。

1.4 Spring官网地址

Spring官网 https://spring.io

1.5 Spring优点

  • Spring是一个开源免费的框架
  • Spring是一个轻量级的、非侵入式的框架
  • 控制反转(IOC),依赖注入(DI),面向切面编程(AOP)
  • 支持事务的处理,因为AOP的原因对事务的支持特别优秀
  • 对框架整合的支持

1.6 Spring与其它框架的整合

  • SSH : Struct2 + Spring + Hibernate(全自动的持久层框架)
  • SSM :SpringMvc(视图框架) + Spring + MyBatis(半自动的持久层框架,可定制性更高,Sql更加灵活)

1.7 Spring核心技术

  • IOC/DI
  • AOP

2、Spring核心技术之IOC

2.1 什么是IOC

控制反转(Inversion of Control,缩写为IoC)它是Spring框架的核心内容,通常我们创建和管理装配对象的主动权是在我们程序猿自己的手里。通过控制反转,我们不再有创建管理装配对象的主动性,而是变为被动的接收这种控制权的转换,我们称为控制反转,它是一种设计思想。DI(Dependency Injection 依赖注入)是实现IOC的一种方式,或者说我们是通过依赖注入的方式去实现我们的控制反转。

概念: 将对象创建的权利交给Spring容器管理,由Spring容器控制对象的生命周期(创建/初始化/使用/销毁)。
作用:降低了代码之间的耦合性。

2.2 Spring入门案例

创建项目

  • 在IdeaProjets中创建一个空文件夹 jsd2103projects
  • 通过IDEA打开这个文件夹
  • 打开后目录结构如下
  • 创建模块module --> spring_1_demo_ioc

2.2.1 通过maven项目中的pom.xml的方式引入jar包

<!-- 引入spring-context包 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.11.RELEASE</version>
</dependency>

2.2.2 创建pojo类

  • 在项目中创建pojo包,在保重创建User类,项目中目录结构如下
public class User {
    public void say(){
        System.out.println("您好,Spring框架");
    }
}

2.2.3 在resources下创建application.xml配置文件

Spring中XML模板
<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    
</beans>
XML的基本配置
<?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">

    <!-- Spring容器管理对象
        id: Spring容器中对象的唯一标识符 不能重复 一般类名首字母小写
        class:类的全路径名 包名.类名 -->
    <bean id="user" class="com.jt.pojo.User"></bean>
</beans>

2.2.4 测试是否能获取创建好的User对象

通过maven项目中的pom.xml的方式引入jar包
<!--引入测试包-->
 <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
 </dependency>       
创建测试类并测试
public class TestUser {
    //测试方法返回值必须为void, 方法名不能是类名
    @Test
    public void testSpring01(){
        //1. 通过加载配置文件,创建Spring容器对象  容器创建则对象创建
        ApplicationContext context =
                new ClassPathXmlApplicationContext("application.xml");
        //2. 从容器中获取对象
        // 1)通过bean的id获取对象
        User user = (User) context.getBean("user");
        // 2)通过bean的class获取对象
        User user1 = context.getBean(User.class);
        // 3)通过bean的id和class获取对象
        User user2 = context.getBean("user", User.class);
        // 测试是否是统一个对象
        System.out.println(user == user1);
        System.out.println(user == user2);
        System.out.println(user1 == user2);
        //3. 执行方法
        user.say();
    }
}

3、 Spring创建对象的方式

3.1 反射机制

我们可以通过反射机制去创建对象,但是反射机制创建对象需要用到无参的构造方法,一下是测试案例:

测试:

在User类中添加一个无参构造
public class User {

    /*
     * 反射机制调用时,必然调用对象的无参构造,所以写构造方法时必须先写无参构造方法
     * 如果类中没有无参构造,会报错
     */
    public User(){
        System.out.println("我是一个无参构造");
    }

//  public User(int i){
//      System.out.println("我是一个有参构造");
//  }

    public void say(){
        System.out.println("您好,Spring框架");
    }
}
在测试类中添加一个测试方法

当我们在User类中自己手动添加一个有参的构造方法时,类中的无参构造就被自动覆盖掉,我们执行以下测试方法时就会报错;

错误信息如下:

当我们手动添加一个无参的构造方法时,并在构造方法中添加一条输出语句,当我们执行以下的测试方法时,会正常执行并将输出语句打印到控制台上。

由此可以说明:我们在通过反射机制创建对象时,要创建的对象所属的类必须含有无参的构造方法。

@Test
public void demo() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
    /*
     * IOC
     * 实际我们Spring框架的底层就是通过反射机制获取类对象,并实例化对象,
     * 然后帮助我们将对象存储在Spring容器中,这里我们是通过Map<K,V>集合存储的
     * bean中的id当做map中的key,实例化好的对象当做Value
     * 然后我们想从容器中获取对象,就从Map集合中通过id(key)获取对象(value)即可
     */
    //1. 通过类的路径实例化类型...
    Class userClass = Class.forName("com.jt.pojo.User");
    //2. 实例化对象
    User user = (User) userClass.newInstance();
    user.say();
}

3.2 静态工厂模式

3.2.1 编辑静态工厂类

public class StaticFactory {
    /*
     * 通过静态工厂获取数据
     * Calendar是util包下的工具类 -- 日历类,它是一个抽象类;
     * 因为抽象类我们不能直接实例化,所以我们不能通过反射的机制去创建他的对象
     * 我们只能通过Calendar中提供的getInstance()的静态方法来获取他的对象
     */
    public static Calendar getCalendar(){
        return Calendar.getInstance();
    }
}

3.2.2 编辑静态工厂配置文件

<!-- 1.静态工厂实例化对象的写法 方法必须是static -->
<bean id="calendar1" class="com.jt.factory.StaticFactory" factory-method="getCalendar"/>

3.2.3 测试类

/**
 * 静态工厂模式测试类
 */
 @Test
 public void testStatic(){
    ApplicationContext context =
                new ClassPathXmlApplicationContext("application.xml");
    Calendar calendar1 = (Calendar) context.getBean("calendar1");
    System.out.println("获取当前时间:"+calendar1.getTime());
}    

3.2 实例工厂模式

...


李三岁
51 声望32 粉丝