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方法还有构造法和工厂方法注入属性。

相关推荐
zhengzizhe7 分钟前
ReBAC 与 Google Zanzibar:权限系统的未来
后端·架构
用户83562907805112 分钟前
使用 Python 自动创建 Excel 折线图
后端·python
梅兮昂21 分钟前
Cloudflare Tunnel 实践教程
后端
@杰克成24 分钟前
Java学习26
java·学习·idea
倒流时光三十年26 分钟前
PostgreSQL VACUUM 清理机制详解
后端
伏加特遇上西柚1 小时前
Loki+Alloy+Grafana日志采集部署
java·linux·服务器·spring boot·grafana·prometheus
阿丘Akiu1 小时前
Linux部署我的世界服务器
java
折哥的程序人生 · 物流技术专研1 小时前
《Java面试85题图解版(二)》进阶深化中篇:Spring核心 + 数据库进阶
java·后端·spring·面试
TeamDev1 小时前
在 Excel 加载项中嵌入 Web 视图
前端·后端·.net
Mr_愚人派1 小时前
redis_点评详解(02.短信登录-验证码登录注册)
后端