1. Spring介绍
Spring是一个轻量级Java 开发框架,最早由Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。
它是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。Spring负责基础架构,因此Java开发者可以专注于应用程序的开发。
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP) 的容器框架
Spring的思想基础就是面向Bean的编程(BOP,Bean Oriented Programming)
特点:提供了以下内容
展现层 SpringMVC
持久层 Spring JDBC
可以整合开源世界众多著名的第三方框架和类库
业务层事务管理 AOP
方便解耦,简化开发的IOC
2. Spring体系架构
2. 1 Spring核心容器(Core Container)
Spring核心容器主要是由Beans、Core、Context、SpEL组成,就是用于装载就是用于装Java Bean对象。
1)Core模块:提供了框架的基本组成部分,包括控制反转(Inversion of Control,IoC)和依赖注入(Dependency Injection,DI)功能。
2)Beans模块:提供了BeanFactory,是工厂模式的一个经典实现,Spring将管理对象称为Bean。解决Bean的定义、Bean的创建、对Bean的解析。我们只需要关注Bean的创建,其他两个由Spring内部完成,对使用来说是 透明的。
3)Context 模块:建立在Core和Beans模块基础上,提供一个框架式的对象访问方式,是访问定义和配置的任何对象的媒介。ApplicationContext接口是Context模块的焦点。
4)SpEL(expression)模块:提供了强大的表达式语言去支持运行时查询和操作对象图。(类似于jsp上使用EL表达式,只不过这个表达式用在spring的配置文件里)
5)其中Core、Beans和Context构成了Spring的骨架,Context建立在Core模块和Beans模块的基础之上,提供了框架式访问对象的方式。
2.2 数据访问/集成(Data Access/Integration)
数据访问/集成层由JDBC、ORM、OXM、JMS和事务模块组成,用于访问操作我们的数据库。支持持久层的操作。自带jdbcTemplate对数据库操作,推荐使用mybatis。
1)Spring-jdbc模块:提供了一个JDBC 的抽象层,消除了繁琐的JDBC编码和数据库厂商特有的错误代码解析。
2)Spring-tx模块(事务模块):支持用于实现特殊接口和所有POJO(普通Java对象)类的编程和声明式事务管理。
3)Spring-orm模块:为流行的对象关系映射(Object-Relational Mapping )API提供集成层,包括JPA和Hibernate。使用Spring-orm模块,可以将这些O/R映射框架与Spring提供的所有其他功能结合使用,例如声明式事务管理功能。
4)Spring-oxm模块:提供了一个支持对象/XML映射的抽象层实现,如JAXB、Castor、JiBX和XStream。
5)Spring-jms模块(Java Messaging Service) :指Java消息传递服务,包含用于生产和使用消息的功能。自Spring 4.1后,提供了与Spring-messaging模块的集成。
6) Transactions:用于支持事物处理。用于解决业务层的事物处理问题。 编程式事务管理和声明式事务管理.
2.3 web
Web层由Spring-web、Spring-webmvc、Spring-websocket和Portlet模块组成。用于支持数据展示层,支持http请求。
1)Spring-web模块:提供了基本的Web开发集成功能。例如:多文件上传功能、使用Servlet监听器初始化一个IoC容器以及Web应用上下文。
2)Spring-webmvc模块:也称为Web-Servlet模块,包含用于Web应用程序的Spring MVC和REST Web Services实现。 Spring MVC框架提供了领域模型代码和Web表单之间的清晰分离,并与Spring Framework的所有其他功能集成。
3)Spring-websocket模块:Spring 4.0后新增的模块,它提供了WebSocket和SockJS的实现。
4)Portlet模块:类似于Servlet模块的功能,提供了在Portlet环境中使用MVC实现。
2.4 Test测试
Spring-test模块:支持使用JUnit或TestNG对Spring组件进行单元测试和集成测试。
(写一个测试类,加注解,运行的时候,自动的将配置文件加载起来,模拟服务器的运行,用于测试使用)
2.5 AOP和Aspects
AOP:切面编程编程【***】Aspects:提供了与AspectJ的集成
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">
<!-- 要让 spring容器给我创建一个person对象-->
<!-- 配置类名,用于反向创建对象-->
<!-- 同时给一个编号方便查找-->
<bean id="person" class="com.xgf.bean.Person" />
</beans>
3.1 bean标签
dao、service、controller、javabean都是bean对象。
<bean id="user" class="com.xgf.bean.User" >
</bean>
<bean id="person6" class="com.wzx.domain.Person"
init-method="init"
destroy-method="destory"
/>
调用bean的两种方式:
//getBean()方法就是调用配置文件bean的id来找
context.getBean("id值", 类型.class);//无需进行类型转换
context.getBean("id值");//需进行类型转换
3.2 property属性 - 给成员变量赋值(调用set方法注入)
property调用set方法赋值
<bean id="user" class="com.xgf.bean.User" >
<!-- 相当于user.setId(10) -->
<property name="id" value="10"/>
<!-- 相当于user.setName(rose) -->
<property name="name" value="rose"/>
<property name="age" value="20"/>
</bean>
property标签,找的是类的属性对应的set方法,在idea中,如果对应bean对应的set方法不存在,就会报红,提示找不到错误。(就是有对应的属性存在,但是没有对应属性的set方法,就不能通过property赋值)
3.3 constructor-arg给成员变量赋值(调用构造方法注入)
bean的constructor-arg 属性,调用bean对象的构造器进行赋值,赋值必须按照构造函数的参数赋值,不能少,用的地方很少。
<!-- 相当于User user = new User(1,"jack",20,new Date()); 调用构造器赋值-->
<bean id="date" class="java.util.Date"/>
<bean id="user" class="com.xgf.bean.User" >
<constructor-arg name="id" value="10"/>
<constructor-arg name="name" value="hello"/>
<constructor-arg name="age" value="20"/>
<constructor-arg name="birthday" ref="date"/>
</bean>
3.4 通过value可以对基本数据类型和String进行赋值,其他对象类型,需要用ref来赋值。
<!-- 相当于User user = new User(1,"jack",20,new Date()); 调用构造器赋值-->
<bean id="date" class="java.util.Date"/>
<bean id="user" class="com.xgf.bean.User" >
<constructor-arg name="id" value="10"/>
<constructor-arg name="name" value="hello"/>
<constructor-arg name="age" value="20"/>
<!-- Date数据类型通过ref来调用上面的java.util.Date的bean的id --?
<constructor-arg name="birthday" ref="date"/>
</bean>
4. Spring生命周期
4.1 生命周期的三个方法:
1)创建方法init()
2)销毁方法destory()
3)普通方法service()
4.2 两个属性:
1)init-method:当该对象初始化的时候该方法会自动执行
2)destroy-method: 当该对象即将销毁的时候会自动调用该方法
3)可以通过context.close()关闭容器,但是基本不需要进行容器的关闭。
<bean id="user" class="com.xgf.bean.User"
init-method="init"
destroy-method="destory"
/>
public class Person{
public void init(){
System.out.println("AAA...");
}
public void eat(){
System.out.println("BBB...");
}
public void destory(){
System.out.println("CCC...");
}
}