Spring框架
Spring框架
1、学习地址
学习文档
官方下载地址
Github
2、Spring基本介绍
起源
作者
Rod Johnson,为了解决企业应用开发的复杂性而创建的。
发展历程
2002年,首次推出了Spring框架的雏形,interface21
2004年3月24日,正式发布了1.0版
概念、模块组成
Spring是一个轻量级的、非入侵的控制反转(IOC)和面向切面(AOP)的容器(框架)
Spring是一个分层架构,由7个定义良好的模块组成
Spring AOP
通过配置管理特性,Spring AOP模块直接将面向切面的编程功能,集成到了Spring框架中,Spring AOP模块为基于Spring应用程序中的对象提供了事务管理服务,通过使用Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中。
Spring ORM
Spring插入了若干个ORM框架,从而提供了ORM的对象管理工具,其中包括JDO,hibernate,ibatis SQL Map,所有这些都遵从Spring的事务管理和DAO的异常层次结构。
Spring DAO
JDBC DAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商提供的错误信息,异常层次结构简化了错误处理,并且极大地降低了需要编写的异常处理代码数量(例如打开和关闭连接),Spring DAO面向JDBC的异常层次结构遵守了普通DAO的异常处理层次结构。
Spring Context
Spring上下文是一个配置文件,向Spring框架提供上下文信息,Spring上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。
Spring Web
Web上下文模块建立在应用程序上下文模块上,为基于Web应用程序提供可上下文,所以Spring框架支持与Jakarta Struts的集成 ,Web模块还简化了处理多部分请求和将请求参数绑定到域对象的工作。
Spring Web MVC
Spring MVC框架是一个全功能的构建Web应用程序的MVC实现,通过策略接口,MVC框架成为高度可配置的,MVC容纳了大量视图技术,其中包括jsp,Velocity,Tiles,iText和POI。
Spring Core
核心容器提供Spring框架的基本功能,核心容器的主要组件是Bean Factory,它是工厂模式的实现,BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用代码分开。
3、IOC(Inversion Of Control)
定义
一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。
IOC理解
控制:谁来控制对象的创建?
传统应用程序的对象是由程序本身创建的,使用Spring后,对象是由Spring创建的。
反转:程序本身不创建对象,而变成被动地接收对象。
示例
新建一个maven项目,在pom.xml中导入Spring依赖
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.4.RELEASE</version> </dependency></dependencies>
导入了spring-webmvc之后,项目中多了以下几个依赖
编写实体类
package com.hmx.pojo;?public class Hello {?}
传统方式创建对象
Hello hello = new Hello();
使用Spring创建对象
1、在resources目录下新建beans.xml文件
右键点击resources ---》 new ---》 XML Configuration File ---》Spring Config,可以创建spring的配置文件
<?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>
2、创建对象
<?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="new的对象所在的位置"></bean> --> <bean id="hello" class="com.hmx.pojo.Hello"></bean>?</beans>
3、测试注入是否成功
/* 语法: 获取Spring的上下文对象 ApplicationContext context = new ClassPathXmlApplicationContext("创建的Spring配置xml文件名"); 取对象 Hello hello = (Hello) context.getBean("xml文件中对应bean的id"); */ public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); Hello hello = (Hello) context.getBean("hello"); //输出结果:,说明创建对象成功。 System.out.println(hello); }
4、bean的作用域
singleton
单例模式(默认机制)
在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象
prototype
原型模式
在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象
以下4个只在Web开发中使用
request
session
application
websocket
5、DI( Dependency Injection )
依赖注入理解
依赖:对象的创建要依赖于spring容器
注入:对象中的属性由容器来注入
注入方式
1、构造器注入
1.1 、默认无参构造
实体类
package com.hmx.pojo;?public class User {? private String name; private int age;? @Override public String toString() { return "User{" + "name=‘" + name + ‘\‘‘ + ", age=" + age + ‘}‘; }}
注入
<?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="user" class="com.hmx.pojo.User"></bean></beans>
测试
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); User user = (User) context.getBean("user"); //输出结果:User{name=‘null‘, age=0} System.out.println(user.toString());?}
有参构造
实体类
package com.hmx.pojo;?public class User {? private String name; private int age;? public User(String name,int age) { this.name = name; this.age = age; }? @Override public String toString() { return "User{" + "name=‘" + name + ‘\‘‘ + ", age=" + age + ‘}‘; }}
1.2 、通过下标创建
<bean id="user" class="com.hmx.pojo.User"> <constructor-arg index="0" value="Andy"/> <constructor-arg index="1" value="12"/></bean>
1.3 、通过类型创建
<bean id="user" class="com.hmx.pojo.User"> <constructor-arg type="java.lang.String" value="Andy"/> <constructor-arg type="int" value="12"/></bean>
1.4 、有参构造方法通过参数名创建
<bean id="user" class="com.hmx.pojo.User"> <constructor-arg name="name" value="Andy"/> <constructor-arg name="age" value="12"/></bean>
2、setter注入
实体类
Address类
public class Address { private String address;? //此处省略setter和getter方法? //此处省略toString方法}
Student类
public class Student {? private String name; private Address address; private String[] books; private List<String> hobbys; private Map<String, String> cards; private Set<String> games; private String wife; private Properties info;? //此处省略setter和getter方法? //此处省略toString方法}
注入
<?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">? <!--Address类--> <bean id="address" class="com.hmx.Address" scope="prototype"> <property name="address" value="火星"/> </bean>? <!--Student类--> <bean id="student" class="com.hmx.Student"> <!--普通值注入--> <property name="name" value="Andy"/> <!--Bean对象注入--> <property name="address" ref="address"/> <!--数组注入--> <property name="books"> <array> <value>红楼梦</value> <value>三国演义</value> <value>西游记</value> <value>水浒传</value> </array> </property> <!--列表注入--> <property name="hobbys"> <list> <value>读书</value> <value>健身</value> </list> </property> <!--Map注入--> <property name="cards"> <map> <entry key="身份证号" value="111111222222223333"></entry> <entry key="银行卡号" value="11848979283974982748"></entry> </map> </property> <!--Set注入--> <property name="games"> <set> <value>英雄联盟</value> <value>和平精英</value> <value>王者荣耀</value> </set> </property>