自学内容网 自学内容网

spring(一)

一、spring特点

        1.非侵入式:使用 Spring Framework 开发应用程序时,Spring 对应用程序本身的结构影响非常小。对领域模型可以做到零污染;对功能性组件也只需要使用几个简单的注解进行标记,完全不会破坏原有结构,反而能将组件结构进一步简化。这就使得基于 Spring Framework 开发应用程序时结构清晰、简洁优雅。

        2.控制反转:IoC——Inversion of Control,翻转资源获取方向。把自己创建资源、向环境索取资源变成环境将资源准备好,我们享受资源注入。

        3.面向切面编程:AOP——Aspect Oriented Programming,在不修改源代码的基础上增强代码功能。

        4.容器:Spring IoC 是一个容器,因为它包含并且管理组件对象的生命周期。组件享受到了容器化的管理,替程序员屏蔽了组件创建过程中的大量细节,极大的降低了使用门槛,大幅度提高了开发效率。

        5.组件化:Spring 实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用 XML 和 Java 注解组合这些对象。这使得我们可以基于一个个功能明确、边界清晰的组件有条不紊的搭建超大型复杂应用系统。

        6. 一站式:在 IoC 和 AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库。而且 Spring 旗下的项目已经覆盖了广泛领域,很多方面的功能性需求可以在 Spring Framework 的基础上全部使用 Spring 来实现。

二、程序开发

        1.添加依赖

<dependencies>
    <dependency>
        <!--spring context依赖-->
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>6.0.2</version>
    </dependency>

    <!--junit5测试-->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.3.1</version>
    </dependency>
</dependencies>

        2.创建程序

package com.spring.bean;
public class HelloWorld {
    
    public void Hello(){
        System.out.println("hello world");
    }
}

        3.创建配置文件

<!--在resources目录创建一个spring配置文件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">

    <!--
    通过bean标签配置IOC容器所管理的bean,将HelloWorld的对象交给Spring的IOC容器管理
    属性:
        id:设置bean的唯一标识
        class:设置bean所对应类型的全类名
-->
    <bean id="helloWorld" class="com.spring.bean.HelloWorld"></bean>
</beans>

        4.创建测试类测试

package com.spring.bean;

import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class HelloWorldTest {

    @Test
    public void testHelloWorld(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
        HelloWorld helloworld = (HelloWorld) ac.getBean("helloWorld");
        helloworld.sayHello();
    }
}

        5.原理:

spring创建对象原理:
//dom4j解析bean.xml文件,从中获取class属性值,类的全类名
//通过反射机制调用无参数构造方法创建对象
Class clazz=Class.forName("com.spring.bean.HelloWorld");
//Object obj=clazz.newInstance();
Object object=clazz.getDeclaredConstructor().newInstance;

//bean对象最终存储在spring1容器中,在spring源码底层是一个map集合
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
//spring容器加载到Bean类时,会把这个类的描述信息以包名加类名的方式存到beanDefinitionMap中

三、IOC容器

        1.控制反转(IOC)

  • 控制反转是一种思想
  • 控制反转是为了降低耦合程度,提高程序扩展力
  • 将对象的创建权力交出去,交给第三方容器负责
  • 将对象与对象之间的维护全交出去,交给第三方容器负责

        2.依赖注入

DI:依赖注入实现了控制反转的思想

依赖注入常见的实现方式包括两种:

        set注入

        构造注入

IOC是一种控制反转的思想,DI是对IOC的一种具体实现。

四、spring中ioc的实现

        Spring 的 IoC 容器就是 IoC思想的一个落地的产品实现。IoC容器中管理的组件也叫做 bean。在创建 bean 之前,首先需要创建IoC 容器。Spring 提供了IoC 容器的两种实现方式:

        1.BeanFactory

        这是 IoC 容器的基本实现,是 Spring 内部使用的接口。面向 Spring 本身,不提供给开发人员使用。

        2.ApplicationContext

        BeanFactory 的子接口,提供了更多高级特性。面向 Spring 的使用者,几乎所有场合都使用 ApplicationContext 而不是底层的 BeanFactory。

        3.ApplicationContext的主要实现类

| 类型名                          

简介
ClassPathXmlApplicationContext通过读取类路径下的 XML 格式的配置文件创建 IOC 容器对象
FileSystemXmlApplicationContext通过文件系统路径读取 XML 格式的配置文件创建 IOC 容器对象
ConfigurableApplicationContextApplicationContext 的子接口,包含一些扩展方法 refresh() 和 close() ,让 ApplicationContext 具有启动、关闭和刷新上下文的能力。
WebApplicationContext专门为 Web 应用准备,基于 Web 环境创建 IOC 容器对象,并将对象引入存入 ServletContext 域中。

五、基于xml管理bean

获取bean:

        1.方式一:根据id获取bean

        id属性指定了bean的唯一标识,所以根据bean标签的id属性可以精确获取到一个组件对象。刚才的代码就是用的这种方式。

        2.方式二:根据类型获取

@Test

public void testHelloWorld1(){

    ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
    HelloWorld bean = ac.getBean(HelloWorld.class);
    bean.sayHello();
}

        3.方式三:根据id和类型

@Test

public void testHelloWorld2(){

    ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
    HelloWorld bean = ac.getBean("helloworld", HelloWorld.class);
    bean.sayHello();
}

        4.注意:

        当根据类型获取bean时,要求IOC容器中指定类型的bean有且只能有一个。

六、依赖注入之setter注入

        1.创建学生类

package com.spring.bean;

public class Student {

    private Integer id;

    private String name;

    private Integer age;

    private String sex;

    public Student() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }

}

        2.配置bean时为属性赋值

<!--spring-di.xml-->
<bean id="studentOne" class="com.spring.bean.Student">
    <!-- property标签:通过组件类的setXxx()方法给组件对象设置属性 -->
    <!-- name属性:指定属性名(这个属性名是getXxx()、setXxx()方法定义的,和成员变量无关) -->
    <!-- value属性:指定属性值 -->
    <property name="id" value="1001"></property>
    <property name="name" value="张三"></property>
    <property name="age" value="20"></property>
    <property name="sex" value="男"></property>
</bean>

        3.测试

@Test
public void testDIBySet(){
    ApplicationContext ac = new ClassPathXmlApplicationContext("spring-di.xml");
    Student studentOne = ac.getBean("studentOne", Student.class);
    System.out.println(studentOne);
}

七、依赖注入之构造器注入

        1.在Student类中添加有参构造

public Student(Integer id, String name, Integer age, String sex) {
    this.id = id;
    this.name = name;
    this.age = age;
    this.sex = sex;
}

        2.配置bean

<!--spring-di.xml-->
<bean id="studentTwo" class="com.spring.bean.Student">
    <constructor-arg value="1002"></constructor-arg>
    <constructor-arg value="李四"></constructor-arg>
    <constructor-arg value="33"></constructor-arg>
    <constructor-arg value="女"></constructor-arg>
</bean>

        3.测试

@Test
public void testDIByConstructor(){
    ApplicationContext ac = new ClassPathXmlApplicationContext("spring-di.xml");
    Student studentOne = ac.getBean("studentTwo", Student.class);
    System.out.println(studentOne);
}

原文地址:https://blog.csdn.net/weixin_73975059/article/details/140601833

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!