Spring

Spring



前言

简介:

  1. Spring:春天—>个体软件行业带来了春天!
  2. 2002首次出推出了spring的框架的雏形:interface21框架!
  3. Spring框架即以interface21框架为基础,结果重新设计并不断丰富其内含,于2001年3月24日,发布了1.0正式版。
  4. Spring理念:使现在的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架

SSH:struct2+Spring+Hibernate!
SSM:SpringMvc+Spring+Mybatis


什么是spring

	总结一句话Spring就是一个轻量级的控制反转(IOC)和面向切面编程的框架!

Spring框架参考文档(老官网):

https://docs.spring.io/spring-framework/docs/4.3.24.RELEASE/spring-framework-reference/html/

在这里插入图片描述

什么是IOC容器

	IOC(控制反转)也可以称之为DI(依赖注入):

Spring Ioc容器图示:
在这里插入图片描述

  1. 控制反转:将创建对象、属性值的方式进行了翻转,从new、setXxx()翻转
    到了从springIOC容器getBean()
  2. 依赖注入:将属性值注入给了属性,将属性注入给了bean,将bean注入给了ioc容器

  我们之前创建对象给对象赋值都是通过new/set进行的。那么现在我们只需要在ioc容器中进行配置就可以通过spring 的ioc容器帮我们处理这些操作,而不需要我们自己去处理。

现在了解完了什么是Spring Ioc后进入正题

1.基于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 = “ ...”  class = “ ...” > 
        <!-此bean的协作者和配置在这里-> 
    </ bean>

    <bean  id = “ ...”  class = “ ...” > 
        <!-此bean的协作者和配置在这里-> 
    </ bean>

    <!-更多的bean定义在这里->

</ beans>

说明:该id属性是用于标识单个bean定义的字符串。该class属性定义Bean的类型,并使用完全限定的类名。id属性的值引用协作对象。在此示例中未显示用于引用协作对象的XML。

2.实例化容器

ApplicationContext context = new ClassPathXmlApplicationContext(“配置文件“);

  说明:实例化Spring IoC容器很简单。提供给ApplicationContext构造函数的一个或多个位置路径实际上是资源字符串,它允许容器从各种外部资源(例如本地文件系统,Java等)加载配置元数据CLASSPATH。

第一个Spring程序

测试

1.通过idea新建一个maven新项目,删除src并创建maven的副项目,并在maven项目的pom中通过maven远程仓库添加spring-webmvc、junit、lombok

	lombok:Lombok项目是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,
	用来消除Java类中的大量样板代码。仅五个字符(@Data)就可以替换数百行代码从而产生干净,简洁且易
	于维护的Java类。

项目结构:
在这里插入图片描述

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>Springstudy2</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>demo01-ioc</module>
    </modules>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.4</version>
        </dependency>


        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

		<!--lombok可以给实体类生成各种方法,偷懒用,不建议使用,大家还是老老实实打构造方法-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>

    </dependencies>



</project>

2.创建一个Student的实体类(pojo),导入lombok注释开发构建有参、无参、set/get,tostring等方法。

package com.hwd.entity;

//生成有参构造方法
import lombok.AllArgsConstructor;
//生成get/set/tostring等方法
import lombok.Data;
//生成无参构造
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    private int id;
    private String name;
    private int age;

}

3.编写配置文件:applicationContext.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 id="Student" class="com.hwd.pojo.Student">
        <!--set注入-->
        <property name="id" value="1"/>
        <property name="name" value="张三"/>
        <property name="age" value="18"/>
    </bean>

</beans>

说明:
id:标识符
class:实体类的路径
property:中的name属性中的值必须与实体类定义的属性一致
value:给实体类的该属性赋值

4.编写测试类cs.java

package com.hwd.cs;

import com.hwd.pojo.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test02 {
    @Test
    public void test02(){
       ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
       Student student  = context.getBean("Student", Student.class);
       System.out.println(student);
    }
}

结果演示:
在这里插入图片描述

总结:
IOC容器/DI依赖注入,现在无论要什么对象,使用Spring框架都可以直接去springioc容器中获取,而不需要自己操作(new/set),因此之后的ioc分为两步:
1.先给springioc容器中存放对象并赋值
2.通过getBean拿到该对象

IOC创建对象的方式(三种依赖注入)

1.set注入:通过setXxx() 赋值

1.创建一个名为Course(课程)的实体类

package com.hwd.pojo;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Course {
    //课程名
    private String courseName;
    //课时
    private int courseHour;
    //该课程的学生信息
    private  Student student;
    //授课老师
    private Teacher teacher;

}

2.编写配置文件applicationContext.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 id="Student" class="com.hwd.pojo.Student">
        <!--set注入-->
        <property name="id" value="1"/>
        <property name="name" value="张三"/>
        <property name="age" value="18"/>
    </bean>

    <bean id="Course" class="com.hwd.pojo.Course">
        <property name="courseName" value="Java"/>
        <property name="courseHour" value="5"/>
        <!--ref:需要引用的id值,将student的对象注入到course对象中-->
        <property name="student" ref="Student"/>
    </bean>

</beans>

3.测试类

package com.hwd.cs;

import com.hwd.pojo.Course;
import com.hwd.pojo.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test02 {
    @Test
    public void test02(){
       ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
       Student student  = context.getBean("Student", Student.class);
       System.out.println(student);

        Course course = context.getBean("Course",Course.class);
        System.out.println(course);
    }
}	

结果演示:
在这里插入图片描述

注意:

IOC容器赋值
如果是简单类型(8种数据类型+String):使用value属性赋值
如果是对象类型:使用 ref属性赋值,ref=“需要引用的id值” ,因此实现了对象与对象之间的依赖关系(注意:必须在该bean的实体类中定义被引用的实体类)

2.构造器注入:通过构造方法赋值

1.定义一个Teacher的实体类

package com.hwd.pojo;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {

    private String name;
    private int age;

}

2.配置文件

	<bean id="Teacher" class="com.hwd.pojo.Teacher">
    <!--构造器注入-->
        <constructor-arg value="王老师" name="name" index="0" type="java.lang.String"/>
        <constructor-arg value="24" name="age" index="1" type="int"/>
    </bean>

	<bean id="Course" class="com.hwd.pojo.Course">
        <constructor-arg value="Java"/>
        <constructor-arg value="5"/>
        <constructor-arg ref="Student"/>
        <constructor-arg ref="Teacher"/>
    </bean>

3.测试类

package com.hwd.cs;

import com.hwd.pojo.Course;
import com.hwd.pojo.Student;
import com.hwd.pojo.Teacher;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test02 {
    @Test
    public void test02(){
       ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
       Student student  = context.getBean("Student", Student.class);
       System.out.println(student);

        Course course = context.getBean("Course",Course.class);
        System.out.println(course);

        Teacher teacher = context.getBean("Teacher",Teacher.class);
        System.out.println(teacher);
    }
}

结果演示:
在这里插入图片描述

constructor-arg
注意:

如果constructor-arg的顺序与构造方法的参数顺序不一致则需要通过name、index、type指定顺序

3.p/c命名空间注入

注意点:p和c命名空间不能直接使用,需要在配置文件中导入xml约束
p命名空间: xmlns:p=“http://www.springframework.org/schema/p”
c命名空间: xmlns:c=“http://www.springframework.org/schema/c”

1.p命名空间(set注入)

在这里插入图片描述

在这里插入图片描述

测试:

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
">


    <!--p命名空间注入-->
    <bean id="Student" class="com.hwd.pojo.Student" p:age="18" p:name="李四">
    </bean>

    <bean id="Course" class="com.hwd.pojo.Course" p:courseHour="5" p:courseName="数学" p:student-ref="Student" p:teacher-ref="Teacher">
    </bean>

    <bean id="Teacher" class="com.hwd.pojo.Teacher" p:name="黄老师" p:age="22">
    </bean>
</beans>

测试类

package com.hwd.cs;

import com.hwd.pojo.Course;
import com.hwd.pojo.Student;
import com.hwd.pojo.Teacher;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test02 {
    @Test
    public void test02(){
       ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
       Student student  = context.getBean("Student", Student.class);
       System.out.println(student);

        Course course = context.getBean("Course",Course.class);
        System.out.println(course);

        Teacher teacher = context.getBean("Teacher",Teacher.class);
        System.out.println(teacher);
    }
}

总结

简单类型:
   p:属性名=“属性值”
引用类型(除了String外):
   p:属性名-ref=“引用的id”
注意:1.顺序无所谓没有影响
    2.多个p赋值的时候要有空格

2.c命名空间(构造器注入)

1.添加约束
在这里插入图片描述
2.c命名空间的方法
在这里插入图片描述

给各种类型的属性赋值

<bean id="student" class="com.hwd.demo01.Student">
        <!--第一种:普通值注入,value-->
        <property name="name" value="hwd"/>

        <!--第二种:bean注入,ref-->
        <property name="address" ref="address"/>

        <!--数组注入,ref-->
        <property name="books">
            <array>
                <value>红楼梦</value>
                <value>水浒传</value>
                <value>西游记</value>
            </array>
        </property>

        <!-- List-->
        <property name="hobbys">
            <list>
                <value>听歌</value>
                <value>打游戏</value>
                <value>打代码</value>
            </list>
        </property>


        <!--Map-->
        <property name="card">
            <map>
                <entry key="身份证" value="132113131321"/>
                <entry key="银行卡" value="12132132131"/>
            </map>
        </property>

        <!--set-->
        <property name="games">
            <set>
                <value>lol</value>
                <value>cf</value>
                <value>cs</value>
            </set>
        </property>

        <!--null-->
        <property name="wife">
            <null/>
        </property>


        <!--Properties-->
        <property name="info">
            <props>
                <prop key="driver">comsdaaadaa</prop>
                <prop key="url"></prop>
                <prop key="root">root</prop>
                <prop key="password">11212</prop>
            </props>
        </property>
    </bean>

扩展:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值