Spring是什么?
Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。
然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。
◆目的:解决企业应用开发的复杂性
◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
◆范围:任何Java应用
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
为什么学习Spring?
1)方便解耦,简化开发
Spring就是一个容器,可以将所有对象创建和关系维护交给Spring管理
什么是耦合度?对象之间的关系,通常说当一个模块(对象)更改时也需要更改其他模块(对象),这就是耦合,耦合度过高会使代码的维护成本增加。要尽量解耦
2)AOP编程的支持
Spring提供面向切面编程,方便实现程序进行权限拦截,运行监控等功能。
3)声明式事务的支持
通过配置完成事务的管理,无需手动编程
4)方便测试,降低JavaEE API的使用
Spring对Junit4支持,可以使用注解测试
5)方便集成各种优秀框架
Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式如下图:
spring之IOC?
IoC容器,最主要的就是完成对象的创建以及维护对象的依赖关系等。
所谓控制反转,包括两部分:
一是控制,二是反转,就是把传统方式需要由代码来实现对象的创建、维护对象的依赖关系,反转给容器来帮忙管理和实现。
所以我们必须要创建一个容器,同时需要一种描述来让容器创建对象与对象的关系。
Spring 依赖注入(DI)
Spring如何使用依赖注入(DO)来管理对象的依赖关系。
- Spring依赖注入 (DI) - Spring如何通过应用
Setter
注入和构造器注入的依赖注入(DI)设计模式实例 - Spring通过setter方法注入 - 通过setter方法依赖注入Bean
- Spring通过构造方法注入 - 可以通过构造方法依赖注入Bean
- Spring构造方法注入类型歧义 - 构造函数注入参数类型歧义的问题总是发生在一个bean包含多个构造方法有多个参数。
Spring小案例:
步骤一:
导入依赖
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.1.5.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.5.RELEASE</version> </dependency> </dependencies>
步骤二:
创建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"> </beans>
步骤三:
创建实体类
package com.SpringMckz.entity;
public class Student {
//普通属性
private Integer stuid;
private String stuname;
//域属性
private Teacher teacher;
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
public Integer getStuid() {
return stuid;
}
public void setStuid(Integer stuid) {
this.stuid = stuid;
}
public String getStuname() {
return stuname;
}
public void setStuname(String stuname) {
this.stuname = stuname;
}
//普通方法
public void stu(){
System.out.println("stuid:"+stuid+" stuname:"+stuname);
}
}
package com.SpringMckz.entity; public class Teacher { //普通属性 private Integer tid; private String tname; public Integer getTid() { return tid; } public void setTid(Integer tid) { this.tid = tid; } public String getTname() { return tname; } public void setTname(String tname) { this.tname = tname; } }
步骤三:
在大配置文件中增加bean节点
<?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相当于当前bean唯一标识 class是bean 的全路径 property注入bean中的属性 必须封装 -->
<bean id="studentBean" class="cn.spring.entity.StudentBean">
<property name="stu_id" value="PG-12138"></property>
<property name="stu_name" value="王某"></property>
<property name="teacherBean" ref="teacherBean"></property>
</bean>
<bean id="teacherBean" class="cn.spring.entity.TeacherBean">
<property name="t_id" value="PG-9527"></property>
<property name="t_name" value="刘某"></property>
</bean>
</beans>
步骤四:
测试:
public class stutest { @Test public void teststu(){ ApplicationContext atc=new ClassPathXmlApplicationContext("applicationContext.xml"); Student student = (Student)atc.getBean("Student"); student.stu(); System.out.println(student.getTeacher().getTname()); } }