SSM框架详细实例讲解
SSM框架简介
SSM框架,是Spring + Spring MVC + MyBatis的缩写,这个是继SSH之后,⽬前⽐较主流的Java EE企业级框架,适⽤于搭建各种⼤型的企业级应⽤系统。 我们先⼤概的回顾⼀下吧。
1.Spring简介
Spring是⼀个开源框架,Spring是于2003年兴起的⼀个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One
J2EE Development and Design中阐述的部分理念和原型衍⽣⽽来。它是为了解决企业应⽤开发的复杂性⽽创建的。Spring使⽤基本的JavaBean来完成以前只可能由EJB完成的事情。然⽽,Spring的⽤途不仅限于服务器端的开发。从简单性、可测试性和松耦合的⾓度⽽⾔,任何Java应⽤都可以从Spring中受益。 简单来说,Spring是⼀个轻量级的控制反转(IoC)和⾯向切⾯(AOP)的容器框架。
A.控制反转(IOC)是什么呢?
IOC:控制反转也叫依赖注⼊。利⽤了⼯⼚模式将对象交给容器管理,你只需要在spring配置⽂件总配置
相应的bean,以及设置相关的属性,让spring容器来⽣成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置⽂件中配置的bean都初始化好,然后在你需要调⽤的时候,就把它已经初始化好的那些bean分配给你需要调⽤这些bean的类(假设这个类名是A),分配的⽅法就是调⽤A 的setter⽅法来注⼊,⽽不需要你在A⾥⾯new这些bean了。
[注意]:⾯试的时候,如果有条件,画图,这样更加显得你懂了
B.⾯向切⾯(AOP)⼜是什么呢?
⾸先,需要说明的⼀点,AOP只是Spring的特性,它就像OOP⼀样是⼀种编程思想,并不是某⼀种技术,AOP可以说是对OOP的补充和完善。OOP引⼊封装、继承和多态性等概念来建⽴⼀种对象层次结构,⽤以模拟公共⾏为的⼀个集合。当我们需要为分散的对象引⼊公共⾏为的时候,OOP则显得⽆能为⼒。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如⽇志功能。⽇志代码往往⽔平地散布在所有对象层次中,⽽与它所散布到的对象的核⼼功能毫⽆关系。在OOP设计中,它导致了⼤量代码的重复,⽽不利于各个模块的重⽤。将程序中的交叉业务逻辑(⽐如安全,⽇志,事务等),封装成⼀个切⾯,然后注⼊到⽬标对象(具体业务逻辑)中去。
实现AOP的技术,主要分为两⼤类:⼀是采⽤动态代理技术,利⽤截取消息的⽅式,对该消息进⾏装饰,以取代原有对象⾏为的执⾏;⼆是采⽤静态织⼊的⽅式,引⼊特定的语法创建“⽅⾯”,从⽽使得编
译器可以在编译期间织⼊有关“⽅⾯”的代码。
[简单点解释],⽐⽅说你想在你的biz层所有类中都加上⼀个打印‘你好,AOP’的功能这你经可以⽤aop思想来做,你先写个类写个⽅法,⽅法经实现打印‘你好,AOP’让后你Ioc这个类 ref=“biz.*”让每个类都注⼊。
2.Spring MVC简介
Spring MVC属于Spring Framework的后续产品,已经融合在Spring Web Flow⾥⾯,它原⽣⽀持的Spring特性,让开发变得⾮常简单规范。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的⾓⾊,这种分离让它们更容易进⾏定制。
3.MyBatis简介
MyBatis本是apache的⼀个开源项⽬iBatis, 2010年这个项⽬由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis是⼀个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了⼏乎所有的JDBC代码和参数的⼿⼯设置以及结果集的检索。MyBatis使⽤简单的XML或注解⽤于配置和原始映射,将接⼝和Java的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。可以这么理解,MyBatis是⼀个⽤来帮你管理数据增删改查的框架。
先看⼀下项⽬的结构吧
说了这么多,现在回归正题,SSM框架⾥⾯有很多繁杂的配置,⼀共有三个
l
l
l
下⾯将会依次详细介绍三个配置⽂件的配置⽅法以及配置的含义
l
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"java.sun/dtd/web-app_2_3.dtd" >
<web-app version="2.4"
xmlns="java.sun/xml/ns/j2ee"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="java.sun/xml/ns/j2ee java.sun/xml/ns/j2ee/web-app_2_4.xsd">
<!--spring的配置-->
<!--==================================================-->
<!-- 配置srping的位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>l</param-value>
<!-- 配置 -->
<listener>
<listener-class>org.t.ContextLoaderListener</listener-class> </listener>
<!--springmvc需要配置的-->
<!--==================================================-->
<!-- 配置springmvc的核⼼控制器 -->
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>l</param-value>spring aop应用场景
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 解决乱码的配置 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 请求method⽀持 put和delete必须添加过滤器 -->
<filter>
<filter-name>myFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--<!– 启⽤druid的监控功能 –>-->
<servlet>
<servlet-name>statViewServlet</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<init-param>
<param-name>loginUsername</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<param-name>loginPassword</param-name>
<param-value>admin</param-value>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>statViewServlet</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
</web-app>
l
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xmlns:context="/schema/context" xmlns:tx="/schema/tx"
xmlns:aop="/schema/aop"
xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-4.2.xsd /schema/context /schema/context/spring-context-4.2.xsd
/schema/tx /schema/tx/spring-tx-4.1.xsd
/schema/aop /schema/aop/spring-aop-4.1.xsd">
<!-- 扫描cn -->
<context:component-scan base-package="cn">
<!-- spring是bean的容器(spring⽤来操做 service+repository)controler是springmvc操作的所以排除-->
<!--<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />-->
</context:component-scan>
<!-- 扫描jdbc⽂件 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!--
所有数据库操作的源头实现⾃接⼝DataSouce DriverManagerDataSource
还有很多连接池继承DataSouce DriverManagerDataSource 实现了很多⼦连接池⽐如c3p0 dbcp druid
这⾥我们就⽤阿⾥的druid,因为这个连接池有⼀个监控功能
-->
<!-- 连接数据库 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="${url}"></property>
<property name="driverClassName" value="${driverClass}"></property>
<property name="username" value="${username1}"></property>
<property name="password" value="${password1}"></property>
<!-- 默认初始化的连接个数 -->
<property name="initialSize" value="1"></property>
<!-- 最⼤允许的连接个数 -->
<property name="maxActive" value="200"></property>
<!-- 最⼤的等待⼈数 -->
<property name="maxIdle" value="100"></property>
<!-- 开启sql统计功能 -->
<property name="filters" value="stat"></property>
</bean>
<!-- 事务管理器不再使⽤jdbc的commit和rollback 必须由事务管理器提供配置事物管理器必须要注⼊dataSource-->
<bean id="tm" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 定义事物⾥⾯的通知-->
<tx:advice id="txAdvise" transaction-manager="tm">
<tx:attributes>
<!--tx:method的作⽤是拦截指定⽅法开头的然后对他进⾏事物处理 -->
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<!--read-only="true" 意思是除了上⾯拦截的以外其他的都不拦截-->
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice>
<aop:config>
<!-- 定义切点(搜索条件) aop:pointcut 意思相当于跟if差不多满⾜条件的就会进来表⽰式 execution(返回值包.类.⽅法(参数 ...代表任意多个参数))
id 表⽰切点的名字
-->
<aop:pointcut expression="execution(* cn.et.service.*.*(..))" id="myPointCut" />
<!-- 关联切点和事务管理器将事物跟切点连接起来-->
<aop:advisor advice-ref="txAdvise" pointcut-ref="myPointCut" />
</aop:config>
<!-- 集成mybatis -->
<!-- 实例化⼀个SqlSessionFactory⼯⼚-->
<bean id="sqlSessionFactory" class="batis.spring.SqlSessionFactoryBean">
<!--指定数据源-->
<property name="dataSource" ref="dataSource"></property>
<!--指定实体⽂件所在的位置-->
<property name="typeAliasesPackage" value="del"/>
<!--指定l⽂件所在的位置-->
<property name="mapperLocations" value="classpath:mapper/*.xml" />
</bean>
<!-- 扫描mybatis的接⼝映射⽂件 -->
<bean id="scannerConfigurer" class="batis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="cn.et.mapper"></property>
</bean>
</beans>
l
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论