1.spring是什么:
Spring 的核心是控制反转(IOC)和面向切面(AOP)。简单来说,Spring 是一个分层的 JavaSE/EEfull-stack(一站式) 轻量级开源框架。
2.如何理解Spring是一个IOC和AOP的容器框架。
(1) IOC(控制反转) :
将对象创建的责任,以及对象之间关联由IOC容器来进行管理,这就是控制反转。之前需要一个对象,自己管理对象的生命周期,没有进行控制反转,如果对象的生命周期交给框架来管理:符合控制反转。
控制反转有两种方式来获取对象:
① 第一种:主动方式
ActionContext context = ActionContext.getContext();
Map session = context.getSession();
② 第二种:被动方式(依赖注入)
依赖注入(DI Dependency Injection):注入方式存在三种方式
a . Set方法注入:当前对象需要关联对象时,只需要提供关联对象的set方法,通过调用set方法将关联对象传递给当前对象使用。(重点)
b. 构造方法注入:当前对象需要提供带参数的构造方法,通过带参数的构造方法将关联对象传递给当前对象使用.(重点)
c. 接口注入:当前对象需要实现特定的接口,通过调用接口的实现方法将关联对象传给当前对象使用。(了解)
说明:Spring框架中支持的依赖注入有两种:Set方法注入和构造方法注入。
③ IOC的具体实现:
【1】 就通过DI来实现的。
【2】 除了DI还有Service Location(服务定位-JNDI-(Java Naming Directry Interface )).
JNDI是一种服务,可以由Tomc以将任何一个资源与一个名称进行绑定。如果需要这个资源时,可以通过远程方式根据名称来查找获取这个资源,利用JNDI来绑定数据源,如果需要获取数据源对象的话,可以通过JNDI来获取。
【3】 IOC就是管理系统中Bean对象的生命周期:
对象生命周期指的是对象的创建,初始化,使用,销毁过程。
【4】 对象到底是多例还是单例的?
a.单例:
无状态的Bean对象,需要单例管理。节省内存开销。
无状态的Bean对象,指的是,这个对象一般是没有属性的,对象中都是一些方法(行为)。
业务层类,DAO类都是无状态的。
Tomcat服务器提供了内部容器:可以管理Filter,Listener,Servlet,JSP对象的生命周期。
b.多例:
有状态的Bean对象,需要多例管理。解决安全性。
有状态的Bean对象,指的是,这个对象一般由多个属性,每一次封装的属性值都是变化的。
例如:action对象,POJO对象
(2) AOP(面向切面编程):
可以将业务代码和非业务代码进行解耦,实现低耦合开发。
一般用于做功能扩展:例如,完成事务,日志,异常,权限等功能扩展。
(3) 容器:
Spring框架底层提供工厂,解析XML配置文件,来管理配置文件中声明的Bean.
其实就是对象生命周期管理:工厂(BeanFactory) + XML + 反射
3.为什么要使用spring:
(1) 方便解耦,简化开发
Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理AOP编程的支持
(2) AOP 编程的支持
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能声明式事务的支持
(3) 申明式事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程
(4) 方便程序的测试
Spring对Junit4支持,可以通过注解方便的测试Spring程序
(5) 方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持,降低JavaEES API的使用难度
Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,是这些API应用难度大大降低
4. Spring 7大功能模块的作用
(1) 核心容器(Spring core)
核心容器提供Spring框架的基本功能。Spring以bean的方式组织和管理Java应用中的各个组件及其关系。Spring使用BeanFactory来产生和管理Bean,它是工厂模式的实现。BeanFactory使用控制反转(IoC)模式将应用的配置和依赖性规范与实际的应用程序代码分开。BeanFactory使用依赖注入的方式提供给组件依赖。
(2) Spring上下文(Spring context)
Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,如JNDI、EJB、电子邮件、国际化、校验和调度功能。
(3) Spring面向切面编程(Spring AOP)
通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能集成到了 Spring框架中。所以,可以很容易地使 Spring框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
(4) Spring DAO模块
DAO模式主要目的是将持久层相关问题与一般的的业务规则和工作流隔离开来。Spring 中的DAO提供一致的方式访问数据库,不管采用何种持久化技术,Spring都提供一直的编程模型。Spring还对不同的持久层技术提供一致的DAO方式的异常层次结构。
(5) Spring ORM模块
Spring 与所有的主要的ORM映射框架都集成的很好,包括Hibernate、JDO实现、TopLink和IBatis SQL Map等。Spring为所有的这些框架提供了模板之类的辅助类,达成了一致的编程风格。
(6) Spring Web模块
Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。Web层使用Web层框架,可选的,可以是Spring自己的MVC框架,或者提供的Web框架,如Struts、Webwork、tapestry和jsf。
(7) Spring MVC框架(Spring WebMVC)
MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可配置的。Spring的MVC框架提供清晰的角色划分:控制器、验证器、命令对象、表单对象和模型对象、分发器、处理器映射和视图解析器。Spring支持多种视图技术。
5.Spring的HelloWorld:
(1) 拷贝IOC相关jar包
commons-logging-1.1.3.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
(2) 创建实体类Student
public class Student {
private Integer studentId;
private String studetName;
public Integer getStudentId() {
return studentId;
}
public void setStudentId(Integer studentId) {
this.studentId = studentId;
}
public String getStudetName() {
return studetName;
}
public void setStudetName(String studetName) {
this.studetName = studetName;
}
public Student() {
System.out.println("Student对象被IOC容器构建了。。。。");
}
public Student(Integer studentId, String studetName) {
super();
this.studentId = studentId;
this.studetName = studetName;
}
@Override
public String toString() {
return "Student [studentId=" + studentId + ", studetName=" + studetName
+ "]";
}
}
(3) 声明Beans的具体属性,用来管理实体类(在项目当中一般在src目录下命名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">
<!--
用于声明Bean对象
id : 标识,具有唯一性
class : Bean对象的类型
scope="singleton" 单例的。默认值
scope="prototype" 多例的。
-->
<bean id="student" class="com.pers.spring.bean.Student" scope="prototype">
<property name="studentId" value="1"/>
<property name="studetName" value="zhangsan"/>
</bean>
</beans>
(4) 定义测试类:
package junit.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.pers.spring.bean.Student;
public class TestSpring {
@Test
public void testSpring() {
//之前需要一个对象,自动动手,丰衣足食
Student student = new Student();
student.setStudentId(1);
student.setStudetName("zhangsan");
student.getStudentId();
student.getStudetName();
System.out.println(student);
System.out.println("------------------------------------------");
//有Spring的IOC容器,一切变得非常美好
//第一个步骤:从类路径下,加载配置文件,构建IOC容器
ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml ");
//第二个步骤:需要从IOC容器中获取一个Bean对象
Student student1 = (Student)ioc.getBean("Student");
//第三个步骤:只管使用就可以了
System.out.println(student1);
}
}