Spring framework(1):框架构建&配置文件
Spring 框架概况
Spring 框架主要可以分为以下模块:
1.Core Container(核心模块)
-
Core
:实现了IOC功能,用配置的方式进行类于类之间的以阿里关系描述,用IOC容器负责依赖类之间的创建,拼接,管理,获取等工作;
-
Bean :提供了 BeanFactory,是Spring Core的核心接口,实现了IOC容器的核心功能;
-
Context
:拓展了 BeanFactory 的功能,添加了许多接口功能,ApplicationContext 是 Context 的核心接口;
-
SpEL :EL 表达式模块,该表达式用于查询和管理运行时的对象,支持/获取对象的属性,调用对象方法等,可以通过表达式串与 IOC 容器进行交互;
2.Data Access / Integration(数据访问和集成模块)
Spring 通过模板化技术对各种数据访问技术进行和薄层封装,是数据访问得到了极大的简化,由此建立了和数据形式及访问技术无关的同意的DAO层,该模块提供了对 JDBC,ORM,OXM,JMS,事务的支持;
3. Web(MVC/Remoting)(网络层模块)
-
Web:该模块建立在 Application Context 模块之上,提供基本的面向Web的集成功,如使用 servlet listener 和 application context 初始化 IOC 容器;
-
Web-MVC:该模块实现了一套类似于Structs的MVC框架,同样该MVC框架也是基于Servlet的;
-
Web-Socket:提供了一个在Web应用中高效/双向的通信,用于客户端和服务器之间的高频低延时的信息交换(一般应用在在线交易,游戏,协作,数据可视化等);
-
Web-Portlet:提供了Portlet的MVC实现环境;
4.其他模块
-
AOP:提供了面向切面编程方式的支持,提供了满足 AOP Alliance 规范的实现;
-
Aspects:提供了对于 AspectJ 这种 AOP 语言级别的框架的集成支持;
-
Instrumentation:支持 Java5.0 引入的 java.lang.instrument ,允许在 JVM 启动时启动一个代理类,通过该类在运行期修改类的字节码,从而改变一个类的功能,以实现AOP的功能;
-
Messaging:用于对 WebSsocket 的 STOMP 协议提供支持;
- Testing:用于支持 JUnit 或 TestNG 测试框架的集成;
Spring 各个模块需要引入的包
Spring在工程中的依赖导入时,在需要哪一个子模块,就导入该模块即可,一般核心模块是必须导入的,导入方式建议使用Maven,Gradle等工程管理框架;
1. Core Container
spring-core //支持core模块
spring-beans //支持bean模块
spring-context //支持context模块
spring-context-support
spring-expression //支持SpEL模块
2. Aop / Instrumentation
spring-aop //支持AOP模块
spring-aspects //支持ASpects模块
spring-instrument //支持Instrumentation模块
spring-instrument-tomcat //支持Tomcat环境的Instrumetation模块
3. Data / Integration
spring-jdbc //支持JDBC模块
spring-orm //支持ORM模块
spring-oxm //支持OXM模块
spring-tx //支持tranasction模块
spring-jms //支持JMS模块
4. Web
spring-web //支持MVC模块
spring-webmvc //支持MVC模块
spring-webmvc-portlet //支持MVC的protlet模块
spring-websocket //支持websocket模块
5. test
spring-test
6. Messaging
spring-messaging
文件结构
一个示例的spring工程文件结构(使用gradle构建):
testSpring //项目根目录
├ src
| ├ main
| | ├ java //源码目录
| | | └ com.assad
| | | ├ domain //领域对象(Domain Object),领域对象使对象对数据表的操作以对象的方式
| | | | ├ LoginLog.java
| | | | └ User.java
| | | ├ dao //DAO层,持久化层
| | | | ├ LoginLogDao.java
| | | | └ UserDao.java
| | | ├ service //Service层,业务层
| | | | └ UserService.java
| | | └ web //Web层,展现层
| | | ├ LoginCommand.java
| | | └ LoginController.java
| | ├ resources //资源目录
| | | ├ applicationContext.xml //spring配置文件(可以任意命名)
| | | └ log4j2.xml
| | └ webapp
| | ├ WEB-INF
| | | ├ jsp
| | | | ├ login.jsp
| | | | └ main.jsp
| | | ├ assad-servlet.xml //spring-mvc 配置文件
| | | └ web.xml //java web 配置文件
| | └ index.jsp
| └ test //单元测试
| └ java
| └ com.assad
| └ service
| └ UserServiceTest.java
└ build.gradle //gradle构建脚本
spring 配置文件
applicationContext.xml
Spring IOC,AOP,DAO 等核心功能的配置文件,一个示例的 applicationContext.xml 如下(以上例子):
<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" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation=... />
<!-- 扫描类包,将标注Spring注解的类自动转化Bean,同时完成Bean的注入 -->
<context:component-scan base-package="com.assad.dao" />
<context:component-scan base-package="com.assad.service" />
<!-- 装配DAO层 -->
<!-- 配置数据源/连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://127.0.0.1:3306/test_spring"
p:username="root"
p:password="1234"/>
<!-- 配置jdbc模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
p:dataSource-ref="dataSource"/>
<!-- 装配Service层 -->
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource"/>
<!-- 通过AOP配置提供事务增强,让service包下所有Bean的所有方法拥有事务-->
<aop:config proxy-target-class="true">
<aop:pointcut id="serviceMethod"
expression="(execution(* com.assad.service..*(..))) and
(@annotation(org.springframework.transaction.annotation.Transactional))" />
<aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice" />
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" />
</tx:attributes>
</tx:advice>
</beans>
连接池配置
其中配置连接池,常用的连接池有:DBCP连接池,C3P0连接池,JNDI连接池等;
-
DBCP连接池
依赖引入:commons-dbcp:commons-dbcp
配置文件中的对应配置:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
p:driverClassName="com.mysql.jdbc.Driver" //配置数据库驱动类
p:url="jdbc:mysql://127.0.0.1:3306/test_spring" //配置数据库URL
p:username="root" //配置访问口令
p:password="1234"/>
-
CP30连接池
依赖引入:com.mchange:c3p0
对应配置:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
p:driverClass="oracle.jdbc.driver.OracleDriver"
p:jdbcUrl="jdbc:oracle:thin:@localhost:1521:test_spring"
p:user="admin"
p:password="1234"/>
web.xml
配置 Spring 的启动容器和相关行为;
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- 从类路径下加载Spring配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--启动Spring容器的监听器,应用以上的上下文参数获取Spring配置文件地址-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 指定 Spring MVC 的主控 Servlet,对应 assad-servlet.xml 的Spring MVC 配置文件-->
<servlet>
<servlet-name>assad</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
<!-- 指定被 assad Servlet 截获的页面为.html(伪装后的jsp页面,普通静态页面标记为.htm)-->
<servlet-mapping>
<servlet-name>assad</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
</web-app>
assad-servlet.xml
配置Spring MVC的相关行为;
<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" xmlns:p="http://www.springframework.org/schema/p"
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">
<!-- 扫描web包,将标注Spring注解的类自动转化Bean,同时完成Bean的注入-->
<context:component-scan base-package="com.assad.web" />
<!-- 配置视图解析器,将 ModelAndView及字符串解析为具体的页面-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:viewClass="org.springframework.web.servlet.view.JstlView"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp"/>
</beans>