为了解决企业应用开发的复杂性而创建的一个轻量级的Java 开发框架
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
Spring框架的目标是使得Java EE应用程序的开发更加简捷
基本框架:AOP、JEE、WEB、CORE、DAO、ORM
三种依赖注入方式:属性(Setter方法)注入,构造注入和接口注入
Spring DAO:Spring提供了对JDBC的操作支持:JdbcTemplate模板工具类 。
Spring AOP:Spring提供面向切面的编程,可以给某一层提供事务管理
Spring Core:提供IOC容器对象的创建和处理依赖对象关系 。
Spring JEE:J2EE开发规范的支持,例如EJB 。
Spring WEB:Spring提供了对Struts、Springmvc的支持,支持WEB开发。与此同时Spring自身也提供了基于MVC的解决方案
Spring ORM:Spring可以与ORM框架整合
IOC容器
就是具有依赖注入功能的容器,是可以创建对象的容器,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。通常new一个实例,控制权由程序员控制,而"控制反转"是指new实例工作不由程序员来做而是交给Spring的容器来做。所以每次调用不再实例化,加一个声明即可
简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦,如下图:
BeanFactory 是所有Spring应用的核心。Spring框架是建立在这个模块之上的,这也使得Spring成为一个容器。
IOC实现了松耦合。依赖被注入到对象,而不是创建或寻找依赖对象
AOP容器(切面编程)
可以为某一类对象进行监督和控制从而达到对一个模块扩充的功能。比如说日志、安全、缓存等那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码
切面(Aspect):其实就是共有功能的实现。
通知(Advice):是切面的具体实现。
连接点(Joinpoint):就是程序在运行过程中能够插入切面的地点。
切入点(Pointcut):用于定义通知应该切入到哪些连接点上。
目标对象(Target):就是那些被通知的对象。
代理对象(Proxy):将通知应用到目标对象之后被动态创建的对象。
织入(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程。
把应用的业务逻辑与系统的服务分离开来
@Aspect
@Component
public class LogAspect {
private static final Logger logger =LoggerFactory.getLogger(LogAspect.class);
@Before("execution(* com.example.demo.controller.UserController.*(..))")
public void beforeMethod(){//所有调用之前
logger.info("beforeMethod"+new Date());
}
@After("execution(* com.example.demo.controller.UserController.*(..))")
public void afterMethod(){//所有调用之后
logger.info("afterMethod"+new Date());
}
}
Bean
每个Bean定义只存在一个实例,即Bean的scope默认是singleton的
实际例子
public class Hello {
private String mess;
public void steMess(String mess){
this.mess=mess;
}
public void say(){
System.out.println("hello"+mess);
}
public void setMess(String mess) {
this.mess = mess;
}
public String getMess() {
return mess;
}
}
public static void main(String[] args){
ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
Hello hello=(Hello)context.getBean("hello");
hello.say();
}
//xml配置
<bean id="hello" class="Hello">
<property name="mess" value="Spring">
</property>
</bean>
我们可以把对象的创建和管理工作交给Spring去完成,不需要自己去new对象,也不要去设置对象的属性,只要写好Spring的配置文件,Spring就可以帮我们去做
SpringMVC
SpringMVC实现了mvc设计模式的web框架。
MVC是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
视图包括Adobe Flash和像XHTML,XML/XSL,WML等一些标识语言和Web services.
模型表示企业数据和业务规则
控制器接受用户的输入并调用模型和视图去完成用户的需求
首先用户发出请求,请求到达SpringMVC的前端控制器(DispatcherServlet),前端控制器根据用户的url请求处理器映射器查找匹配该url的handler,并返回一个执行链,前端控制器再请求处理器适配器调用相应的handler进行处理并返回给前端控制器一个modelAndView,前端控制器再请求视图解析器对返回的逻辑视图进行解析,最后前端控制器将返回的视图进行渲染并把数据装入到request域,返回给用户。
spring mvc的入口是servlet,而struts2是filter。
spring会稍微比struts快。spring mvc是基于方法的设计,而sturts是基于类