Spring详解

Spring超详细讲解


一、Spring是什么?

Spring简单来说就是容器框架。

  • Spring的核心概念(Application和Bean)
    ApplicationContext(应用程序上下文)和Bean(Bean其实就是对象,Spring把对象称为Bean)。ApplicationContext是容器,用来容纳Bean,
    Bean是可以被Spring管理的对象。
  • Spring的核心功能
    对象的发现,创建,配置,管理。
    -Spring的功能
    此功能非彼功能,这里的功能是指Spring主要干什么。Spring的特点就是IOC(控制反转)和AOP(面向切面编程)。

二、IOC(控制反转)

IOC反转的是对象的控制权,IOC是概念非技术。在之前的程序中,我们一般用两种方式创建对象:new和newInstance(),这样创建的对象属于强引用对象,jvm垃圾回收机制永远不会回收这类对象,这时候需要手动移除引用。如果没有移除,这个对象将一直存在,久而久之,会引起内存泄露问题。

Spring创建的对象可以避免此问题,而且,还可以指定对象的生命周期和对象之间的关系。IOC思想把对象的控制权拿了回来,实现了松散耦合。

1.ApplicationContext(应用程序上下文)

大概知道了IOC是什么意思,现在对程序实现IOC。反转对象的控制权,Application就是用来存放,管理spring注入的Bean的容器。

Application大致分为三类:xmlApplicationContext,AnnotationConfigApplicationContext,WebApplicationContext。

今天先讲xmlApplicationContext,xmlApplicationContext字面意思就是用xml配置应用程序上下文。xmlApplicationContext又分为ClassPathXmlApplicationContext和FileSystemXmlApplicationContext。用ClassPathXmlApplicationContext的比较多,演示ClassPathXmlApplicationContext。

(PS:项目使用的是maven)

第一:创建 ClassPathXmlApplicationContext 对象,把注入对象的xml文件写入对象里。

复制代码
 ClassPathXmlApplicationContext context=
        new ClassPathXmlApplicationContext("beans.xml");

第二:创建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">
    <bean id="linghuchong" class="springdemo.Student"><!--class 是实体类地址-->
        <property name="id" value="1001"/><!---property 属性,表示对象的属性 name表示参数名 value 表示参数值-->
        <property name="name" value="令狐冲"/>
        <property name="gender" value="男"/>
        <property name="studentClass" ref="class01"/><!--ref 引入其他对象 -->
    </bean>
    <bean id="yuelingshan" class="springdemo.Student" scope="prototype"><!--scope 表示生命周期 一般默认为 siglenton-->
        <constructor-arg value="1002"/>
        <constructor-arg value="岳灵珊"/>
        <constructor-arg value="女"/>
        <constructor-arg ref="class01"/>
    </bean>
    <bean id="class01" class="springdemo.StudentClass">
        <property name="id" value="01"/>
        <property name="name" value="高软一班"/>
        <property name="department" value="信息工程系"/>
    </bean>
    <bean id="renyingying" class="springdemo.Students"
          factory-method="createStudent"/>
</beans>

scope表示对象的生命周期,siglenton是默认的,可以不用设置。prototype表示Bean被调用一次,就会创建一个对象,可以创建多个对象

第三:创建实体类

复制代码
package springdemo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import springdemo.StudentClass;

public class Student {
    private String id;
    private String name;
    private char gender;
    @Autowired
    private StudentClass studentClass;

    public Student() {
    }

    public Student(String id, String name, char gender, StudentClass studentClass) {
        this.id = id;
        this.name = name;
        this.gender = gender;
        this.studentClass = studentClass;
    }

    public String getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    public StudentClass getStudentClass() {
        return studentClass;
    }

    public void setStudentClass(StudentClass studentClass) {
        this.studentClass = studentClass;
    }
}



package springdemo;

import org.springframework.stereotype.Component;

public class StudentClass {
    private String id;
    private String name;
    private String department;

    public String getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }
}

第四:实现对象的调用

复制代码
    @Test
    public void student() {
        Student s1 = (Student)context.getBean("linghuchong");/*getBean("Bean的id")返回object类型*/
        s1.setId("1001");
        Assert.assertEquals("1001", s1.getId());
        Student s2 = (Student)context.getBean("yuelingshan");
        s2.setId("1002");
        Assert.assertEquals("1002", s2.getId());
    }
    @Test
    public void getBeanByClass() {
        StudentClass studentClass = context.getBean(StudentClass.class);/*getBean(StudentClass.class) 返回的是指定类型*/
        Assert.assertNotNull(studentClass);
        Assert.assertEquals("01", studentClass.getId());
    }

运行Test方法,即可

总结

以上就是今天要讲的内容,本文仅仅简单介绍了使用set方法注入属性的使用,set方法是较为常用的方法,除了set方法还有构造法和工厂方法注入属性。

相关推荐
晨曦中的暮雨3 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
喵了几个咪4 小时前
GoWind CMS 拆解:在 Go 里给 TipTap 搭一套 Yjs 协同后端
开发语言·后端·golang
Flynt4 小时前
我把微信运动的排行榜和定点推送复刻了一遍:100万次步数更新只要4秒,坑在别处
redis·后端·性能优化
文丑颜不良啊4 小时前
LeetCode876~900题目解析
java·leetcode
aloha_7895 小时前
Java 基础、集合、异常与 JUnit 5 速查
java·junit·sqlserver
CarIise5 小时前
SpringMVC 异常处理与拦截器
大数据·spring
知守观6 小时前
设计模式实战:从真实老项目中看标准模板方法与工厂的落地
java·spring·设计模式
独隅6 小时前
Claude API 实战教程:从入门到完整项目
android·java·数据库·claude·claude code
_孤傲_6 小时前
快速掌握 MySQL 语法
数据库·后端·mysql
Wang's Blog6 小时前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友