一、相关网址
1、spring jar包下载:https://repo.spring.io/ui/native/libs-release-local/org/springframework/spring/
2、spring 官网:https://spring.io/
3、spring文档——Core Technologies (Version 5.3.23):
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-introduction
4、Maven 官网 :( —— Downloading Apache Maven 3.8.6 )
https://maven.apache.org/download.cgi
5、MVN REPOSITORY : Maven 库
在Maven 库下:如
(1)(pom)依赖-Maven依赖:点击 Spring Context 进去,选择一个版本即可
https://mvnrepository.com/search?q=spring
(2)Apache Commons Logging » 1.2 jar包下载:
https://mvnrepository.com/artifact/commons-logging/commons-logging/1.2
6、阿里云的Maven仓库:
https://developer.aliyun.com/mvn/guide
其他:
1、Apache Tomcat
二、添加的命名空间
1、在resources文件夹下的ioc.xml配置文件中添加 p 命名空间
xmlns:p="http://www.springframework.org/schema/p"
http://www.springframework.org/schema/p
http://www.springframework.org/schema/p/spring-p.xsd
2、在resources文件夹下的ioc.xml配置文件中添加context命名空间
<?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: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
">
注意,添加的内容为:
3、aop命名空间同理
<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
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
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
">
三、添加的依赖
pom依赖:
pom.xml配置文件:
1、添加的maven依赖
2、添加的druid依赖
3、添加的mysql依赖
示例:
<?xml version="1.0" encoding="UTF-8"?>
<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.zhoulz</groupId>
<artifactId>spring_study_maven_3</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--添加的maven依赖-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<!--添加的druid依赖-->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.14</version>
</dependency>
<!--添加的mysql依赖-->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
</dependencies>
</project>
4、添加junit的依赖
<!--添加junit的依赖-->
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
5、进行 Spring AOP 配置的时候,需要的依赖
<?xml version="1.0" encoding="UTF-8"?>
<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.zhoulz</groupId>
<artifactId>spring_aop_study</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--添加的maven依赖-->
<!--添加的spring-context依赖-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<!--添加junit的依赖-->
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--添加的spring-aop依赖-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<!--cglib依赖-->
<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
<!--aspectj weaver依赖 —— 提供了一种功能更强的织入方式-->
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
<!--<scope>runtime</scope>--> <!--这个一定要注释掉,不然@Aspect出不来-->
</dependency>
<!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>
</project>
6、进行 Spring AOP 配置的时候,需要的依赖
pom.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<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.zhoulz</groupId>
<artifactId>springmvc_helloworld</artifactId>
<version>1.0-SNAPSHOT</version>
<!--创建SpringMVC,首先是pom依赖的导入:依赖 Servlet 和 Web -->
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<!--导入下面spring-web、spring-webmvc两个依赖后,右侧就已经有了 spring-context 的包,所以上面其实就可以不用再导了-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<!--注: 最核心的处理类在左侧的库:Maven:org.springframework:spring-webmvc:5.2.3.RELEASE\spring-webmvc-5.2.3.RELEASE.jar!\org\springframework\web\servlet\DispatcherServlet.class-->
<!--然后,就可以在web下WEB-INF下的web.xml配置文件中配置servlet了-->
</dependencies>
</project>
四、java要知道
1、声明式事务
SpringAOP 提供了声明式事务管理。
代码参考:spring_aop_tx
(1)首先要声明事务管理器
在applicationContext 配置文件中:
<!--首先,要声明/添加 事务管理器--><!--即:配置事务管理器的bean对象-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
(2)接着还要导入tx的命名空间(tx是对应使用的数据库)
(3)然后,就可以开启基于注解的事务管理器的配置
<!--再然后,就可以引入tx的一些注解了:--> <!--即:开启基于注解的事务管理器的配置-->
<!--注解驱动-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
<!--以前的AOP是这样的,同样的操作-->
<!--<aop:aspectj-autoproxy></aop:aspectj-autoproxy>-->
<!--添加好事务管理器就可以引入相关的事务控制了,即:在BookService类的buyBook()方法上面添加上@Transactional注解即可-->
(4)最后,就可以引入相关的事务控制了 —— 加上@Transactional 注解即可。
BookService 类中的 buyBook() 方法:
package com.zhoulz.service;
import com.zhoulz.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.awt.print.Book;
@Service
public class BookService {
@Autowired
private BookDao bookDao;
//声明事务:
@Transactional //——引入事务控制。然后就可以进行事务回滚等操作
public void buyBook(){
bookDao.getPrice(1);
bookDao.updateBalance("zhangsan",100);
int i = 1/0;//会导致事务的中断
bookDao.updateStock(1);
}
}
这样,由于 int i = 1/0; 的错误,事务被中断,使得原来执行过的操作需要进行回滚操作,以回到最初的状态,完成事务的管理。
注:buyBook() 方法下属于几个操作,但是声明式事务管理后,就属于一个操作了,要么都执行,要么都不执行,这样才不会出现异常。
2、Spring AOP 基于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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
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
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
https://www.springframework.org/schema/tx/spring-tx.xsd
">
<!--分为bean对象的配置和事务的配置-->
<!-- 一、bean对象的配置-->
<!--1、定义扫描包 — 扫描一些基本的包。 这样不用每个bean都单独写-->
<context:component-scan base-package="com.zhoulz"></context:component-scan>
<!--2、进行事务操作的话,必然要连接数据库,所以要把外部数据属性的配置文件加入进来,比如db.properties-->
<context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
<!--3、还用到了一个druid(德鲁伊)的数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!--然后写上一些对应的属性:-->
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="driverClassName" value="${jdbc.driverNamee}"></property>
</bean>
<!--4、还有JdbcTemplate对应的配置:-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 二、事务的配置:-->
<!--1、首先,声明一个事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--声明式事务是依托于AOP的,所以AOP的配置必须要有-->
<!--2、AOP配置-->
<aop:config>
<!--然后是aop中切面之类的-->
<aop:pointcut id="txPointcut" expression="execution(* com.zhoulz.service.*.*(..))"/>
<!--事务建议(这里事务还没配)-->
<aop:advisor advice-ref="myAdvice" pointcut-ref="txPointcut"></aop:advisor>
</aop:config>
<!--事务的话,有专门的事务标签 (对应上面的事务建议)-->
<!--3、事务标签(然后把下面的myAdvice拿上去)-->
<tx:advice id="myAdvice" transaction-manager="transactionManager">
<!--配置事务的属性-->
<tx:attributes>
<!--配置咋哪些方法上添加事务-->
<tx:method name="addBook" propagation="REQUIRED" read-only="true" isolation="DEFAULT"/>
<tx:method name="updatePrice" propagation="REQUIRED"></tx:method>
<!--有通配符的写法:-->
<tx:method name="*" propagation="REQUIRED" read-only="false"></tx:method>
<tx:method name="update*" propagation="REQUIRES_NEW"></tx:method>
</tx:attributes>
</tx:advice>
</beans>