一、相关网址

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 库

https://mvnrepository.com/

在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

https://tomcat.apache.org/

二、添加的命名空间

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
">

注意,添加的内容为:

springboot maven依赖本地jar maven下载spring完整依赖包_xml

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是对应使用的数据库)

springboot maven依赖本地jar maven下载spring完整依赖包_spring_02

 (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>