spring
Spring架构图
此外,可以查看 Spring 5.3.3 API文档
开放源代码(开源)、轻量级、低侵入、代码污染低,独立于各种服务器,DI(IOC)降低了业务对象替换复杂性,Rod Johnson发起
优点
①. Spring是一个轻量级的IOC和AOP容器框架
②. Spring是非侵入式的,基于Spring开发的应用一般不依赖于Spring的类
③. Spring是个容器,因为它包含并且管理应用对象的生命周期和配置,比如对象的创建、销毁、回调等
④. Spring提供对事务的管理
⑤. Spring对主流的框架提供了很好的集成支持,比如和hibernate SpringMVC等框架的集成
轻量级:Spring 在大小和透明性方面绝对属于轻量级的。
控制反转(IOC):Spring 使用控制反转技术实现了松耦合,依赖被注入到对象,而不是创建或寻找依赖对象。
面向切面编程(AOP):Spring 支持面向切面编程,同时应用的业务逻辑与系统的服务分离开来。
容器:Spring 包含并管理应用程序对象的配置及生命周期。
MVC 框架:Spring 的web框架是一个设计优良的web MVC框架,很好的取代了一些web框架。
事务管理(Transaction):Spring对下至本地业务上至全局业务(JAT)提供了统一的事务管理接口。
核心容器
1.Core模块:
封装了框架依赖的最底层部分,包括资源访问、类型转换及一些常用工具类。
2.Beans模块:
提供了框架的基础部分,包括反转控制和依赖注入。其中Bean Factory是容器核心(工厂),本质是“工厂设计模式”的实现,而且无需编程实现“单例设计模式”,单例完全由容器控制,而且提倡面向接口编程,而非面向实现编程;所有应用程序对象及对象间关系由框架管理,从而真正把你从程序逻辑中把维护对象之间的依赖关系提取出来,所有这些依赖关系都由BeanFactory来维护。
3.Context模块:
以Core和Beans为基础,集成Beans模块功能并添加资源绑定、数据验证、国际化、Java EE支持、容器生命周期、事件传播等;核心接口是ApplicationContext。
4.EL模块:
提供强大的表达式语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从Spring 容器获取Bean,它也支持列表投影、选择和一般的列表聚合等。
5.AOP模块(相对不是核心):
Spring AOP模块提供了符合 AOP Alliance规范的面向方(切)面的编程(aspect-oriented programming)实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术(只是提供实现技术,而不是现成的系统),并且能动态的把这些功能添加到需要的代码中;这样各专其职,降低业务逻辑和通用功能的耦合。
6.DataACCESS模块:
Spring本身的 JDBC, 和其他的框架整合 ORM(Mybatis Hibernate)
7.WEB模块:
Web的部分(Spring MVC),和其他框架如:Struts2整合的部分;
*8.ORM模块:
spring管理其他数据访问框架模块的技术
核心类/接口
BeanFactory、Beanwrapper、ApplicationContext
SpringMVC类
DispatherServlet
开始
1.新建项目
新建javaProject/javaWeb工程
2. 下载jar包
点击下载Spring的jar包地址:
进入org->springframework->spring,这里可以下载各个版本,笔者这边使用5.1.11
解压后得到以下jar包
另外MVN官网搜索commons-logging.jar,下载(需要下载的原因是spring的核心容器必须依赖于common-logging的jar包)
3.导入jar包
为什么要导入一个不是spring的jar包?-> spring有用到这个jar包
总共是7个spring包+1个commons包
4.创建实体类
Girl.java和Blog.java实体类要实现序列化接口
Girl.java实体类
package com.ccp.entity;
import java.io.Serializable;
public class Girl implements Serializable{
/**
*
*/
private static final long serialVersionUID = -4206067945036107048L;
private String name;
private int tall;
private int age;
public Girl() {
System.out.println("girl无参构造");
}
public Girl(String name, int tall, int age) {
super();
this.name = name;
this.tall = tall;
this.age = age;
System.out.println("girl有参构造");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getTall() {
return tall;
}
public void setTall(int tall) {
this.tall = tall;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Girl [name=" + name + ", tall=" + tall + ", age=" + age + "]";
}
}
Blog .java
package com.ccp.entity;
import java.io.Serializable;
public class Blog implements Serializable{
/**
*
*/
private static final long serialVersionUID = -8144693488047625165L;
private int id;
private String title;
public Blog(int id, String title) {
super();
this.id = id;
this.title = title;
}
public Blog() {
// TODO Auto-generated constructor stub
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@Override
public String toString() {
return "Blog [id=" + id + ", title=" + title + "]";
}
}
5. Spring配置文件
新建里面输入spring,如果和我一样为空的话
则新建一个xml文件在src下,取名任意(这里取applicationContent)
给xml新增代码
<?xml version="1.0" encoding="UTF-8"?>
<!-- java对象的管理开始 -->
<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就是对象名 class就是类名,记得要包含完整的包名 -->
<!-- scope="prototype"中的prototype是懒加载,如果加上的话会不自动加载无参构造,等到使用(context.getBean)才加载 -->
<!-- 默认情况下/不写,scope="singleton" Spring容器就会自动初始化所有的单例-->
<!-- <bean id="girl" class="com.ccp.entity.Girl" scope="prototype"> -->
<!-- bean的约束(id和name除命名规则差异,使用效果无异) -->
<!-- 给实体类的属性赋值——字面值 -->
<bean class="com.ccp.entity.Girl" id="girl">
<property name="name" value="小t"></property>
<property name="tall" value="160"></property>
<property name="age" value="22"></property>
<property name="blog" ref="blog"></property>
</bean>
<!-- 给实体类的属性赋值——引用值 -->
<bean id="blog" class="com.ccp.entity.Blog">
<property name="id" value="12"></property>
<property name="title" value="小书本"></property>
</bean>
</beans>
6. 新增Test测试类
注意写ApplicationContext时,引入包要 org.springframework.context 下的
package com.ccp.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.ccp.entity.Girl;
public class Test {
public static void main(String[] args) {
// ApplicationContext获取bean对象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContent.xml");
// 这个对象管理bean,获取bean
//除以下两种写法,还有更多
//找spring容器拿对象-getBean("....") 这里面写的girl是xml中bean的id
// Girl girl = context.getBean("girl", Girl.class);
Girl girl = (Girl) context.getBean("girl");
Girl girl2 = (Girl) context.getBean("girl");
System.out.println(girl);
}
}
执行结果:会加载类的无参构造(且无论如何,只执行一次无参)
附录:
bean scope="" | 实例化时机 | 描述 |
---|---|---|
bean scope=”singleton” | Spring容器就会自动初始化所有的单例(默认) | 每次取出的bean都是同一个bean |
prototype | 不会自动初始化,而是等使用(context.getBean)的时候才实例化 | 每次取的bean时,都会重新创建一个新的bean ,是懒加载 |
request | 一次请求一个bean定义对应一个实例(web相关) | |
session | 一个session定义对应一个实例(web相关) | |
globalsession | 类似于session作用域,只是其用于portlet环境的web应用。如果在非portlet环境将视为session作用域(web相关) |