Spring致力于提供一种方法管理你的业务对象。
Spring的主要目的是使JavaEE易用和促进好编程习惯。
Spring致力于J2EE应用的各层的解决方案,而不是仅仅专注于某一层的方案。可以说Spring是企业应用开发的“一站式”选择,并贯穿表现层、业务层及持久层。然而,Spring并不想取代那些已有的框架,而是与它们无缝地整合。
Spring 框架是一个分层架构,它包含一系列的功能要素并被分为大约20个模块。这些模块分为Core Container、Data Access/Integration、Web、AOP(Aspect Oriented Programming)、Instrumentation和测试部分,如下图所示:
Core和Beans模块提供了Spring最基础的功能,提供IoC(控制反转)和DI(依赖注入)特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。
Context模块基于Core和Beans来构建,它提供了用一种框架风格的方式来访问对象,有些像JNDI注册表。Context封装包继承了beans包的功能,还增加了国际化(I18N),事件传播,资源装载,以及透明创建上下文,例如通过servlet容器,以及对大量JavaEE特性的支持,如EJB、JMX。核心接口是ApplicationContext。
Expression Language,表达式语言模块,提供了在运行期间查询和操作对象图的强大能力。支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从Spring 容器获取Bean,它也支持列表投影、选择和一般的列表聚合等。
JDBC模块,提供对JDBC的抽象,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码。
ORM模块,提供了常用的"对象/关系"映射API的集成层。 其中包括JPA、JDO、Hibernate 和 iBatis 。利用ORM封装包,可以混合使用所有Spring提供的特性进行"对象/关系"映射,如简单声明性事务管理 。
OXM模块,提供一个支持Object和XML进行映射的抽象层,其中包括JAXB、Castor、XMLBeans、JiBX和XStream。
JMS模块,提供一套"消息生产者、消费者"模板用于更加简单的使用JMS,JMS用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
Transaction模块,支持程序通过简单声明性事务管理,只要是Spring管理对象都能得到Spring管理事务的好处,即使是POJO,也可以为他们提供事务。
Web-Socket模块, WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信,spring支持webSocket通信。
Web模块,提供了基础的web功能。例如多文件上传、集成IoC容器、远程过程访问、以及Web Service支持,并提供一个RestTemplate类来提供方便的Restful services访问
Web-Servlet模块,提供了Web应用的Model-View-Controller(MVC)实现。Spring MVC框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证等及一套非常易用的JSP标签,完全无缝与Spring其他技术协作。
Web-Portlet模块,提供了在Portlet环境下的MVC实现
spring本身提供springmvc
AOP模块,提供了符合AOP 联盟规范的面向方面的编程实现,让你可以定义如方法拦截器和切入点,从逻辑上讲,可以减弱代码的功能耦合,清晰的被分离开。而且,利用源码级的元数据功能,还可以将各种行为信息合并到你的代码中 。
Aspects模块,提供了对AspectJ的集成。
Instrumentation模块, 提供一些类级的工具支持和ClassLoader级的实现,可以在一些特定的应用服务器中使用。
Test模块,提供对使用JUnit和TestNG来测试Spring组件的支持,它提供一致的ApplicationContexts并缓存这些上下文,它还能提供一些mock对象,使得你可以独立的测试代码。
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.11version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-beansartifactId>
<version>4.2.5.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>4.2.5.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
<version>4.2.5.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-testartifactId>
<version>4.2.5.RELEASEversion>
dependency>
dependencies>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="service" class="com.java.service.impl.EmpServiceImpl">
<property name="dao" ref="dao"/>
bean>
<bean id="dao" class="com.java.dao.impl.EmpDaoImpl">bean>
<bean id="Emp" class="com.java.model.Emp">
<property name="name" value="黄容">property>
bean>
beans>
package com.java.service.impl;
import com.java.dao.IEmpDao;
import com.java.model.Emp;
import com.java.service.IEmpService;
/**
* @author Liushun
* @date Created in 2018/6/1 20:42
* @description service层实现类
*/
public class EmpServiceImpl implements IEmpService {
private IEmpDao dao;
public IEmpDao getDao() {
return dao;
}
// 配置版需要提供set方法
public void setDao(IEmpDao dao) {
this.dao = dao;
}
// 调用dao的方法
@Override
public void saveEmp(Emp emp) {
dao.insertEmp(emp);
}
}
package com.java.dao.impl;
import com.java.dao.IEmpDao;
import com.java.model.Emp;
/**
* @author Liushun
* @date Created in 2018/6/1 20:50
* @description dao层实现类
*/
public class EmpDaoImpl implements IEmpDao {
@Override
public void insertEmp(Emp emp) {
System.out.println("模拟新增:" + emp);
}
}
package com.java.test;
import com.java.dao.IEmpDao;
import com.java.model.Emp;
import com.java.service.IEmpService;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author Liushun
* @date Created in 2018/6/1 20:53
* @description web测试类
*/
public class LocTest {
// 使用通用工厂类来实例化application.xml中配置的bean标签的对象
@Test
public void addEmpTest(){
// 加载spring配置文件
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 加载application.xml配置文件中相应的bean标签
Emp emp = (Emp) context.getBean("Emp");
IEmpService service = (IEmpService) context.getBean("service");
IEmpDao dao = (IEmpDao) context.getBean("dao");
service.saveEmp(emp);
}
}
注解的原理和配置xml中的bean标签,property标签是相同的,注解的本质就是封装好的方法的调用
类的注解相当于在xml中配置bean标签,利用反射的原理实例化对象
属性的注解相当于xml中配置property标签,借助反射实现为属性赋值
使用属性注解不需要提供set方法
通用型:@Component
Dao层:@Repository
Service层:@Service
Web层:@Controller
@Autowired:根据类型进行注入
<context:component-scan base-package="com.java"/>
package com.java.dao.impl;
import com.java.dao.IEmpDao;
import com.java.model.Emp;
import org.springframework.stereotype.Repository;
/**
* @author Liushun
* @date Created in 2018/6/1 20:50
* @description dao层实现类
*/
@Repository
public class EmpDaoImpl implements IEmpDao {
@Override
public void insertEmp(Emp emp) {
System.out.println("模拟新增:" + emp);
}
}
package com.java.service.impl;
import com.java.dao.IEmpDao;
import com.java.model.Emp;
import com.java.service.IEmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author Liushun
* @date Created in 2018/6/1 20:42
* @description service层实现类
*/
@Service
public class EmpServiceImpl implements IEmpService {
@Autowired
private IEmpDao dao;
// 调用dao的方法
@Override
public void saveEmp(Emp emp) {
dao.insertEmp(emp);
}
}
package com.java.test;
import com.java.model.Emp;
import com.java.service.IEmpService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author Liushun
* @date Created in 2018/6/1 20:53
* @description 测试类
*/
// 开启spring自带的测试功能
@RunWith(SpringJUnit4ClassRunner.class)
// 读取spring配置文件
@ContextConfiguration("/applicationContext.xml")
public class LocTest {
@Autowired
private IEmpService service;
@Autowired(required = false)
private Emp emp;
@Test
public void springTest(){
service.saveEmp(emp);
}
}