Spring
文章目录
前言
简介:
- Spring:春天—>个体软件行业带来了春天!
- 2002首次出推出了spring的框架的雏形:interface21框架!
- Spring框架即以interface21框架为基础,结果重新设计并不断丰富其内含,于2001年3月24日,发布了1.0正式版。
- 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容器图示:
- 控制反转:将创建对象、属性值的方式进行了翻转,从new、setXxx()翻转
到了从springIOC容器getBean() - 依赖注入:将属性值注入给了属性,将属性注入给了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>
扩展: