单体地狱:Servlet JDBC JSP …
替代JDBC的框架: MyBatis;
Spring:春天—>给软件行业带来春天
2002,Rod johnson 首次推出了Spring框架的前身 interface21框架
2003,Spring框架以interface21框架为基础,重新设计,发布1.0正式版。
Spring官网:https://spring.io/
Spring下载:https://spring.io/projects/spring-framework#learn
版本说明:
我们在下载软件会遇到诸如release,stable,alpha,beta,pre,current,eval,rc,snapshot等版本,程序猿下载插件时尤为常见,现在我说明以下版本的意思
1,snapshot(快照),也即开发版,我们创建maven项目时,编辑器会自动给我们填入 1.0-SNAPSHOT版本,也就是1.0开发版,这个版本不能使用,因为该版本处于开发的过程,所以运行时会不时地更新,导致功能变化,正式环境中不得使用snapshot版本的库;
2,alpha,内部测试版,来源于字母α,是比较早的版本,主要是给开发人员和测试人员测试和找BUG用的,不建议使用;
3,beta,公开测试版,来源于字母β,这是比alpha进一步的版本,面向公众测试,但是不建议使用
4,pre,这个和alpha版本类似,有时还会细分为M1,M2版本,不建议使用;
5,RC(Release Candidate) 顾名思义么 ! 用在软件上就是候选版本。系统平台上就是发行候选版本;
6,GA(General Availability)正式发布的版本,在国外都是用GA来说明release版本的;
7,release,发行版,这是release的中文意思,也就是官方推荐使用的版本;
8,stable,稳定版,这个版本相比于测试版更加稳定,去除了测试版许多的bug,完善了一些功能,建议使用;
9,current,最新版,但是不一定是稳定版本,需要看一下是否还有release或者stable等版本;
10,eval,评估版。可能会有一个月或者固定时间的使用期限;
SpringGithub地址:https://github.com/spring-projects/spring-framework
Spring官网下载地址:https://repo.spring.io/release/org/springframework/spring/
重要:一句话来概括:Spring是一个轻量级的控制反转【IOC】和面向切面【AOP】的(容器)框架。
OOP: 面向对象编程
Spring想做粘合剂。—> 发展出来一套自己的生态;
Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式。
组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:
BeanFactory
,它是工厂模式的实现。BeanFactory
使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。
Spring Boot :一款可以快速构建Spring应用的脚手架; 约定大于配置 , 承上启下。
Spring Cloud:基于SpringBoot实现的;他是一个生态圈;
◆目的:解决企业应用开发的复杂性
◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
◆范围:任何Java应用
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
我们使用原来的方式写一段代码测试:dao–service—前端
思考:现在前端传递或者调用不会变,所有操作都是我们程序猿来实现;
解决方案:前端操作,后台不变;留一个调用的接口
IOC的原型。
控制反转 (inversion of Control):IOC
他是一种设计思想。 根据这个思想有实现的方式,DI : 依赖注入。
本质就是设置接口 , set方法,是一种抽象思维
反转: 从被动到主动 , 程序猿主动控制 到 被动接受 , 由编写代码,编写接口,程序具有高度配置性和动态性;
让程序的耦合性大大降低。方便模块独立:----> 微服务。解耦 。
org.springframework
spring-webmvc
4.3.9.RELEASE
package com.kuang.pojo;
public class Hello {
private String name;
public Hello() {
}
public Hello(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void show(){
System.out.println("Hello,"+name);
}
@Override
public String toString() {
return "Hello{" +
"name='" + name + '\'' +
'}';
}
}
beans.xml
package com.kuang.pojo;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class HelloTest {
@Test
public void test(){
//解析beans.xml配置文件,生产管理相应的Bean对象;
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//通过Bean得到这个对象的实体
Hello hello = (Hello)context.getBean("hello2");
hello.show();
}
}
这个过程就叫控制反转:IOC
控制:谁来控制对象的创建? 原来 :程序猿来控制, 使用Spring后,Spring来创建对象的
反转:程序本身不创建对象了,变成被动接受对象。
依赖注入:DI ,本质就是利用set方式来注入的。
IOC是一种编程思想。由主动的编程到被动的接受;
使用spring完成之前 Oracle 和 Mysql 获取用户信息的小Demo;
4.0.0
com.kuang
spring-study
pom
1.0-SNAPSHOT
Spring01
Spring02
Spring03
Spring04
Spring05
Spring06
Spring07
junit
junit
4.11
org.springframework
spring-webmvc
4.3.9.RELEASE
pojo实体类:
package com.kuang.pojo;
public class Hello {
private String name;
public Hello() {
}
public Hello(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void show(){
System.out.println("Hello,"+name);
}
@Override
public String toString() {
return "Hello{" +
"name='" + name + '\'' +
'}';
}
}
resources资源包配置:
beans.xml:
Test测试类:
package com.kuang.pojo;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class HelloTest {
@Test
public void test(){
//解析beans.xml配置文件,生产管理相应的Bean对象;
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//通过Bean得到这个对象的实体
Hello hello = (Hello)context.getBean("hello2");
hello.show();
}
}
测试结果:
如果把测试类中hello2改为hello则输出结果为:对应得为bean.xml文件value值;
OK , 到了现在 , 我们彻底不用再程序中去改动了 , 要实现不同的操作 , 只需要在xml配置文件中进行修改 , 所谓的IoC,一句话搞定 : 对象由Spring 来创建 , 管理 , 装配 !
我们平时创建对象的方式:
有参构造 、无参构造
我们来看看在Spring中怎么处理这两种情况
** 创建实体类**
User:
package com.kuang.pojo;
public class User {
private String name;
private String sex;
private int age;
public User() {
System.out.println("User的无参构造");
}
public User(String name) {
System.out.println("User的有参构造");
this.name = name;
}
public User(String name, int age) {
System.out.println("User的有参构造2");
this.name = name;
this.age = age;
}
public User(String name, String sex, int age) {
System.out.println("User的有参构造3");
this.name = name;
this.sex = sex;
this.age = age;
}
public void setName(String name) {
System.out.println(name+":"+System.currentTimeMillis());
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
Spring配置文件
beans.xml文件:
测试类
package com.kuang.pojo;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class UserTest {
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user = (User)context.getBean("user");
/*
User user = new User();
user.setName("qinjiang");
*/
System.out.println(user.toString());
}
@Test
public void test2(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user = (User) context.getBean("user4");
System.out.println(user);
}
}
注意点:一定要有一个无参构造方法
想多了解一点的可以查查:通过工厂模式创建
bean
alias
import
import一般在团队项目中会使用,每个人开发各自的beans.xml,最后用一个总的文件拼装起来。
DI (Dependency Injection)
依赖:指bean对象的创建依赖于Spring容器。bean对象依赖的资源
注入:指Bean对象所依赖的资源,由容器来设置和装配。
要求被注入的属性,必须有set方法。set方法的名字需要规范
set+属性名(属性名字母大写);
西游记
水浒传
红楼梦
三国演义
女孩
代码
电影
音乐
标签:entry
键:使用key
值: 使用value
王者荣耀
贪玩蓝月
绝地求生
LOL
props标签
键使用key
值,在标签中间;
201932301
男
小明
Spring就是一个粘合剂,托管所有的对象;
4.0.0
com.kuang
spring-study
pom
1.0-SNAPSHOT
Spring01
Spring02
Spring03
Spring04
Spring05
Spring06
Spring07
junit
junit
4.11
org.springframework
spring-webmvc
4.3.9.RELEASE
pojo 实体类:
Address:
package com.kuang.pojo;
public class Address {
private String address;
//默认存在无参构造
public void setAddress(String address) {
this.address = address;
}
public String getAddress() {
return address;
}
}
Student:
package com.kuang.pojo;
import java.util.*;
public class Student {
private String name;
private Address address;
private String[] books;
private List hobbys;
private Map card;
private Set games;
private String girlFriend; //null
private Properties info;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public String[] getBooks() {
return books;
}
public void setBooks(String[] books) {
this.books = books;
}
public List getHobbys() {
return hobbys;
}
public void setHobbys(List hobbys) {
this.hobbys = hobbys;
}
public Map getCard() {
return card;
}
public void setCard(Map card) {
this.card = card;
}
public Set getGames() {
return games;
}
public void setGames(Set games) {
this.games = games;
}
public String getGirlFriend() {
return girlFriend;
}
public void setGirlFriend(String girlFriend) {
this.girlFriend = girlFriend;
}
public Properties getInfo() {
return info;
}
public void setInfo(Properties info) {
this.info = info;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", address=" + address.toString() +
", books=" + Arrays.toString(books) +
", hobbys=" + hobbys +
", card=" + card +
", games=" + games +
", girlFriend='" + girlFriend + '\'' +
", info=" + info +
'}';
}
}
User:
package com.kuang.pojo;
public class User {
private String name;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
applicationContext.xml配置文件:
西游记
水浒传
红楼梦
三国演义
女孩
代码
电影
音乐
王者荣耀
贪玩蓝月
绝地求生
LOL
201932301
男
小明
测试类:
package com.kuang.pojo;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpring {
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Student student = (Student) context.getBean("student");
System.out.println(student.toString());
}
@Test
public void test2(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user1");
User user1 = (User) context.getBean("user1");
User user2 = (User) context.getBean("user1");
User user3 = (User) context.getBean("user1");
System.out.println(user.hashCode());
System.out.println(user1.hashCode());
System.out.println(user2.hashCode());
System.out.println(user3.hashCode());
}
}
在Spring中,那些组成应用程序的主体及由SpringIOC容器所管理的对象,被称之为bean。简单地讲,bean就是由IOC容器初始化、装配及管理的对象。
配置文件中定义 Bean 时,我们不但可以配置 Bean 的属性值以及相互之间的依赖关系,还可以定义 Bean 的作用域 。作用域会对 Bean 的生命周期和创建方式产生影响 。
Bean 的作用域类型:
类型 | 说明 |
---|---|
singleton | 在 Spring 容器中仅存在一个 Bean 实例, Bean 以单例的形式存在,默认值。 |
prototype | 每次从容器中调用 Bean 时,都会返回一个新的实例,即相当于执行 new XxxBean() 的实例化操作。 |
request | 每次 http 请求都会创建一个新的 Bean , 仅用于 WebApplicationContext 环境。request.setAttribute("","") |
session | 同一个 http Session 共享一个 Bean ,不同的 http Session 使用不同的 Bean,仅用于 WebApplicationContext 环境。session.setAttribute("","") |
globalSession | 同一个全局 Session 共享一个 bean, 用于 Porlet, 仅用于 WebApplication 环境。application.setAttribute("","") |
Spring 以容器的方式,使得我们仅需配置,即可得到天然的单例模式。
在五种作用域中,request、session和globalSession三种作用域仅在web的应用中使用。
【核心:对象在内存中只有一份】
饿汉式,懒汉式。—> static
区别:加载时机不同.