Spring框架 是一个非常强大的工具, 她能够将一个项目需要的几个框架连动起来,使得开发高效又规范!
其实也不用把她想象的多么神奇,然后就认为学习起来就比较困难, 工具就是工具, 用的多了自然就会熟悉她的规则, 还有她那高效功能, 久之就会得心应手。现在来看一下她的大体使用流程 (非注解方式---后续会增加注解(简单改动)):
下图是一个ssh项目的目录结构(可以参考学习), 有几个重要的配置现在一起来看一下:
1,pom.xml( maven 依赖配置文件):动态管理项目所需各种jar包、插件等 , 前边文章有讲到。maven可以动态管理一个项目,会自动整合下载所需jar包、插件,只需要在pom.xml中粘贴上对应工具的gav坐标或者插件代码即可.
2,,app-root.xml (Spring根容器,也称Spring核心容器):是用来整合Spring框架用的一个配置,例如hibernate框架(持久化数据)、事务等都在这个文件配置(那些hibernate的配置文件已经不用了,都在这个文件配置).
3,app-servlet.xml (Spring mvc 配置文件): 她可以配置组件扫描的范围(让Spring 知道哪些可以配置注解, 可以认为管理这众多以前的Servlet文件(现在可称为控制器)), 还可以配置web相关的东西
4,web.xml 可以配置中央控制器、监听器等
一、pom.xml文件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xintouyun</groupId>
<artifactId>ssh</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>ssh</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.25</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
<dependency>
<groupId>commons-dbcp</groupId> <!-- 配置数据源,数据库连接设置 -->
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId> <!-- hibernate 框架 -->
<artifactId>hibernate-core</artifactId>
<version>5.3.7.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
<dependency>
<groupId>org.springframework</groupId> <!-- Spring 核心 -->
<artifactId>spring-orm</artifactId>
<version>5.1.2.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<!-- servlet依赖: maven的基础包中没有servlet, jsp文件不能编译; Tomcat服务器中是有的 -->
<dependency>
<groupId>javax.servlet</groupId> <!-- Spring Servlet -->
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId> <!-- 为了使用Spring-mvc 注解 -->
<artifactId>spring-webmvc</artifactId>
<version>5.1.2.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver Aop配置 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=+++++ -->
<build>
<finalName>smvc1</finalName> <!-- 打成的War包名 -->
<plugins> <!-- 设置编译级别为1.8 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.eclipse.jetty</groupId> <!-- jetty 嵌入式服务器 -->
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.12.v20180830</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
</configuration>
</plugin>
</plugins>
</build>
</project>
二、app-root.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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
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-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- -->
<!-- Spring配置: 组件扫描(让Spring知道 哪些可以配置注解)-->
<!-- <context:component-scan base-package="com.xintouyun.ssh"/> -->
<!-- 配置数据源,数据库连接设置 -->
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///bookstore"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<property name="initialSize" value="5"></property> <!-- 先定义几个连接放到连接池,这样连接速度快 -->
</bean>
<!-- 配置Sessionfactory(代替hibernate 配置) --> <!-- 以前的Sessionfactory是用代码生成实现的,现在用bean即可 -->
<bean id="mySessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource"/> <!-- 注入数据源(上边) -->
<property name="mappingResources"> <!-- 读取hbm.xml 配置文件,实现类和表的映射 -->
<list>
<value>com/xintouyun/ssh/entity/User.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<value> <!-- hibernate中需要配置的属性(方言、是否显示sql语句) -->
hibernate.dialect=org.hibernate.dialect.MySQL55Dialect
hibernate.show_sql=true
</value>
</property>
</bean>
<!--声明式事务开始+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- 配置事务管理器 --> <!-- 此处用以sessionfactory依赖注入(比以前代码实现方便多了) -->
<bean id="myTxManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="mySessionFactory"/><!-- 事务管理器需要依赖注入sessionFactory -->
</bean>
<!-- 事务通知 -->
<tx:advice id="txAdvice" transaction-manager="myTxManager">
<!-- 事务属性配置 -->
<tx:attributes>
<!-- 所有以get开头的方法 使用只读 -->
<tx:method name="get*" read-only="true"/>
<tx:method name="list*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<!-- 其他方法 使用默认事务传播(可以提交事务) propagation="REQUIRED(默认required: 若没有事务就开启一新的,有的话传递)-->
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- AOP配置(因为要用声明式事务) -->
<aop:config>
<!-- 指定哪些事务的哪些方法使用声明式事务 (现在是service 下边的都可以使用事务) -->
<aop:pointcut id="fooServiceOperation" expression="execution(* com.xintouyun.ssh.service..*.*(..))"/>
<!-- 事务通知 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/>
</aop:config>
<!--声明式事务结束 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- 只是通常的bean方法 实现依赖注入(一个类一个bean,一个需要注入的属性一个property) -->
<bean name="userDao" class="com.xintouyun.ssh.dao.impl.UserDaoImpl">
<!-- setter注入,对象要注入的属性要有Setter方法 --> <!-- UserDao需要依赖注入SessionFactory -->
<property name="sessionFactory" ref="mySessionFactory"></property>
</bean>
<bean name="userService" class="com.xintouyun.ssh.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property> <!-- 依赖注入:service依赖于dao -->
</bean>
</beans>
3,app-servlet配置文件 ( Spring-mvc配置文件 )
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
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-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<!-- Spring配置: 组件扫描(让Spring知道 哪些可以配置注解)-->
<context:component-scan base-package="com.xintouyun.ssh"/>
<!-- 支持jsp jstl的视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
4,web.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<!-- ServletContext 监听器:容器启动的时候自动执行
(此处可以 让它读取Spring配置文件,实例化spring容器(root容器 (servlet容器依赖 root容器) )) -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 上边监听器使用下边参数,指定Spring配置文件的位置(classpath),容器启动的时候读取app-root.xml配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:app-root.xml</param-value>
</context-param>
<!-- 中央控制器 --> <!-- servlet容器 可以访问root中的bean,反过来不行 -->
<display-name>spring-mvc</display-name>
<servlet>
<servlet-name>ssh</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:app-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ssh</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>