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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值