一、了解 Spring 基本介绍、主要思想 IoC/DI

1、了解 Spring 基本介绍

(1) Spring是什么?

Spring 是一个轻量级DI/IoC 和 AOP 容器开源框架,致力于构建致力于构建轻量级的 JavaEE 应用简化应用开发,本身涵盖了传统应用开发,还拓展到移动端,大数据等领域。

(2) Spring有什么优点?与作用?

① Spring 能帮我们低侵入/低耦合地根据配置文件 创建及组装对象之间的依赖关系。

② Spring 面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制等。

③ Spring 能非常简单的且强大的声明式事务管理(通过配置完成事务,不用修改代码)。

④ Spring 提供了与第三方数据访问框架(如 Hibernate、JPA)无缝集成,且自己也提供了一套 JDBC 模板来方便数据库访问。

⑤ Spring 提供与第三方 Web(如 Struts1/2、JSF)框架 无缝集成,且自己也提供了一套 Spring MVC 框架,来方便 Web 层搭建。

⑥ Spring 能方便的与如 Java Mail、任务调度、缓存框架等技术整合,降低开发难度。

2、主要思想 IoC/DI

Spring 是一个DI容器或IoC容器(DI和IoC 思想差不多)。掌握着创建对象和构建对象之间的依赖控制权

● IoC:Inversion of Control(控制反转):

一种设计思想。 其本意是是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理

● DI:Dependency Injection(依赖注入):

一种设计思想具体是指 Spring 创建对象的过程中,将对象依赖属性(常量,对象,集合)通过配置设值给该对象。

二、掌握Spring 基本使用、Spring 获取bean对象的方式、Spring 标签 import的引入配置

1、掌握Spring 基本使用

(1) 依赖jar包:

  • spring-beans.jar
  • spring-core.jar
  • commons-logging.jar

(2) 配置:

  • 创建applicationContext.xml 配置文件:

  • 配置的约束内容:

    <!-- 配置的bean约束内容 -->
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 通过配置的bean元素,告诉Spring的IoC容器,需要管理哪一个类的对象 -->
    <bean id="hello" class="com.shan.hello.Hello">
    <!-- 通过property子元素,设置管理对象的属性的值 -->
    <property name="password" value="123"/>
    <property name="username" value="shan"/>
    </bean>
    </beans>

(3) 使用:

	@Test
void testIoC() throws Exception {
Hello hello = null;
//=========================
//1、加载配置文件:从classpath路径去寻找配置文件,创建资源对象
Resource resource = new ClassPathResource("applicationContext.xml");
//2、创建IoC容器:创建spring的工厂对象(IoC容器对象)
BeanFactory factory = new XmlBeanFactory(resource);
//3、从Ioc容器获取对象:从spring IoC 容器(就是factory 工厂对象)中获取指定名称的对象
hello = (Hello)factory.getBean("hello");
//=========================
hello.printUser();
}
■ 从例子,可以看出,spring不仅帮我们创建对象,还帮我们把对象需要的数据给设置进来(对象的属性依赖)

2、Spring 获取bean对象的方式

  • 推荐使用:bean的名称+类型: T getBean(String name, Class requiredType) 根据bean对象在容器中的 名称+类型 来获取

    	@Test
    void testIoC() throws Exception {
    Hello hello = null;
    //=========================
    //1、加载配置文件:从classpath路径去寻找配置文件,创建资源对象
    Resource resource = new ClassPathResource("applicationContext.xml");
    //2、创建IoC容器:创建spring的工厂对象(IoC容器对象)
    BeanFactory factory = new XmlBeanFactory(resource);
    //3、从Ioc容器获取对象:从spring IoC 容器(就是factory 工厂对象)中获取指定名称的对象
    //方式(推荐): T getBean(String name, Class<T> requiredType) 根据bean对象在容器中的 名称+类型 来获取
    hello = factory.getBean("hello", Hello.class);
    //=========================
    hello.printUser();
    }

3、Spring 标签 import的引入配置

  • 元素:<import resource="com/shan/hello.xml"/> 用于引入spring的配置文件,相当于js中的元素 <javaScript src=""/>
  • 推荐resource路径加上前缀 classpath
  • 默认情况下,resource 是从 classpath 的跟路径寻找,举例:<import resource="classpath:com/shan/hello.xml"/>

三、Spring 核心对象 BeanFactory Bean、Spring的配置方式、了解Spring管理bean的原理

1、Spring 核心对象 BeanFactory Bean

  • BeanFactory:是Spring的IoC容器(容器--管理对象的生命周期),生产 bean 对象的工厂,负责配置,创建和管理 bean。

  • bean:被 Spring IoC 容器管理的对象称之为bean。

2、Spring的配置方式

■ 元数据的配置有三种方式:

□ XML-based configuration (xml配置文件)

□ Annotation-based configuration (注解

□ Java-based configuration (基于java-config

3、了解Spring管理bean的原理

  • 底层是:反射(获取构造器实例对象)+内省机制(设置属性值)

① 通过 Resource 对象加载配置文件
② 解析配置文件,得到指定名称的 bean
③ 解析 bean 元素,id 作为 bean 的名字,class 用于反射得到 bean 的实例
  • 注意:此时,bean 类必须存在一个无参数构造器(且该无参构造器和访问权限无关);
④ 调用 getBean 方法的时候,从容器中返回对象实例;
■ 结论:就是把代码从 JAVA 文件中转移到了 XML 中。

四、使用Spring的测试框架

相对于传统测试方式,spring测试框架会帮我们关闭对象资源,而使用传统方式,不会正常关闭spring容器。

1、依赖jar包:

  • spring-test.jar
  • spring-context.jar
  • spring-aop.jar
  • spring-expression.jar

2、配置文件:

■ SpringTestTest5-context.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 配置bean对象 -->
<bean id="someBean" class="com.shan.spring_test.SomeBean"/>
</beans>

3、测试类:

■ SpringTestTest5 类:

//SpringTest 案例测试

//运行 Spring JUnit5
@SpringJUnitConfig
public class SpringTestTest5 {
//表示自动按照类型 Spring容器中去找到bean对象,并设置给该字段
@Autowired
private SomeBean bean; @Test
void testIoC() throws Exception {
bean.doWork();
}
}

五、Spring的核心 IoC(基于xml)

1、ApplicationContext 和 BeanFactory 创建对象的区别

  • BeanFactory 在创建Spring容器的时候,并不会立马创建容器中管理的Bean对象,需要等到获取某一个 bean 的时候才会创建该 bean--延迟初始化。(懒加载

  • ApplicationContext 在启动 Spring 容器的时候就会创建所有的 bean(在 Web 应用使用Application

2、常用实例化bean的方式 和 实现FactoryBean接口实例化的方式

(1)实例化bean的方式:

  • 构造器实例化(bean 中有 无参数构造器),标准、常用

    <!-- 配置bean对象 -->
    <bean id="someBean" class="com.shan.spring_test.SomeBean"/>

(2)实现FactoryBean接口实例化的方式:

  • 类要实现接口FactoryBean:

    public class DogFactory implements FactoryBean<Dog>{
    @Override
    public Dog getObject() throws Exception {
    Dog dog = new Dog();
    return dog;
    } @Override
    public Class<?> getObjectType() {
    return Dog.class;
    }
    }
    <!-- 实现 FactoryBean 接口实例化:实例工厂变种, 如集成 MyBatis 框架使用 -->
    <bean id="dog" class="com.shan._04_factory_bean.DogFactory"/>

3、 bean作用域scope、初始化init-method和销毁destroy-method

(1) bean作用域scope

  • 缺省和常用的情况是单例 singleton
<bean id="" class="" scope="作用域"/>
  • 单例和多例: singleton: 单例(默认的作用域) prototype: 多例

  • 在web应用中(request、session、application)

  • globalSession: 一般用于 Porlet 应用环境 , 分布式系统存在全局 session 概念(单点登录)

  • websocket:将一个bean定义定义到WebSocket的生命周期

(2) bean初始化和销毁:

  • 属性init-method="该类中初始化方法名" 和 属性destroy-method="该类中销毁方法名"
  • 没有使用spring的测试框架的话,就不能正常关闭IoC容器,即销毁bean对象了(可以手动关闭)
<bean id="cat" class="com.shan.lifecycle.Cat" init-method="init" destroy-method="close"/>

六、Spring的核心 DI(基于xml):

\({\color{Violet}{● DI跟IoC差不多啦,细节就是DI还负责管理bean对象的属性}}\)

1、xml配置注入属性值:

配置与注入:

  • 常量类型 配置value--->注入setter方法

  • 对象类型 配置ref--->注入setter方法

  • 集合类型 配置各自集合对应的元素...--->注入setter方法

    1、通过XML配置装配

    (1)XML 自动装配(不推荐)通过bean元素的属性 autowire 自动装配

    ✿(2)setter注入 [ 属性注入(根据类型区分)]

    ■(常用) 注入常量 value

    	<bean id="person" class="com.shan.di_setter.Person">
    <property name="name" value="shan"/>
    <property name="age" value="22"/>
    <property name="salary" value="10000"/>
    </bean>

    ■(常用) 注入对象 ref

        <bean id="cat" class="com.shan.di_setter2.Cat">
    <property name="name" value="kity"/>
    </bean>
    <bean id="person" class="com.shan.di_setter2.Person">
    <property name="name" value="shan"/>
    <property name="age" value="22"/>
    <property name="cat" ref="cat"/>
    </bean>

    ■ 注入集合 、 、、 、

    	<bean id="person" class="com.shan.di_setter3.Person">
    <!-- set类型 -->
    <property name="set">
    <set>
    <value>set1</value>
    <value>set2</value>
    </set>
    </property>
    <!-- list类型 -->
    <property name="list">
    <list>
    <value>list1</value>
    </list>
    </property>
    <!-- array类型 -->
    <property name="array">
    <array>
    <value>array1</value>
    </array>
    </property>
    <!-- map类型(字典类型) -->
    <property name="map">
    <map>
    <entry key="key1" value="value1"/>
    </map>
    </property>
    <!-- properties类型(特殊的map类型【key和value都是字符串】) -->
    <property name="prop">
    <value>
    p1=v1
    p2=v2
    </value>
    </property>
    </bean>

2、bean元素继承 (本质是xml配置内容的拷贝)

  • 通过abstract属性进行抽取

  • 通过parent属性进行引入

3、属性注入应用---配置数据库连接池

  • 动态加载配置文件(db.properties---数据库连接的配置信息)

  • <context:property-placeholder/>

  • 使用 ${} 动态引入属性值

(1) 配置数据库连接池

	<!-- 配置数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/springdemo?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="admin"/>
<property name="initialSize" value="2"/>
</bean>

(2) db.properties---数据库连接的配置信息

(3) property place holder

● 要是使用标签Context,需要先引入Context的约束(在beans的基础进行修改即可):

● context:property-placeholder 属性占位符
     <!-- 从classpath的根路径 加载db.properties -->
<context:property-placeholder location="classpath:db.properties"/>
● 使用 ${} 动态引入属性值
	<!-- 配置数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="initialSize" value="${jdbc.initialSize}"/>
</bean>

七、Spring使用注解配置

1、注解三要素:注解本身、被贴、第三方程序(赋予注解的特殊功能)

★ 对于IoC注解、DI注解:他们的第三方程序是他们对应的解析器。

  • IoC注解:组件扫描器 <context:component-scan base-package=""/>

  • DI注解:注解配置 <context:annotation-config/>

2、DI 注解:@Autowired、@Resource、@Value

  • value注解的威力:结合动态properties配置文件引入值变量 例如:@Value("${service.port}")

(1) 通过注解注入属性值

★ 配置与注入:

  • 常量类型 配置value--->注入@Value

  • 对象类型 配置ref--->注入@Autowired/@Resource

(2) IoC 注解:@Component、@Scope、@PostConstruct、@PreDestroy

★ 使用注解@Component(配置Bean)

//相当于 <bean id="dataSource" class="com.shan.ioc.MyDataSource"/>
@Component("dataSource")
public class MyDataSource { }

★ bean组件版型:

@Component 泛指组件
@Repository 持久层
@Service 业务层
@Controller 控制层

★ 作用域注解、初始化和销毁注解:@Scope、@PostConstruct、@PreDestroy

\({\color{Violet}{■ 其中初始化和销毁注解[依赖:javax.annotation-api.jar]}}\)

八、Spring AOP

1、了解AOP思想[面向切面编程的思想]、AOP思想的原理

(1) 面向切面编程的思想:

利用一种称为"横切"的技术,剖开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。

  • 切面:把一个个的横切关注点放到某个模块中去,称之为切面。

  • 那么每一个的切面都能影响业务的某一种功能, 切面的目的就是功能增强

    如日志切面就是一个横切关注点,应用中许多方法需要做日志记录的只需要插入日志的切面即可.

(2) AOP思想的原理:动态代理

2、Pointcot语法

  • 找到具体的某个方法--哪个包.哪个类.哪个方法

execution(<修饰符>? <返回类型> <声明类型>? <方法名>(<参数>) <异常>)

  • 切入点表达式中的通配符(看具体的方法,先从方法名位置开始看):

    *:匹配任何部分,但是只能表示一个单词。

    ..:可用于全限定名中和方法参数中,分别表示子包和 0 到 N 个参数

3、AOP 开发:

(1) 依赖jar包:

  • spring-aop.jar
  • com.springsource.org.aopalliance.jar [spring5的spring-aop.jar已经包含]
  • com.springsource.org.aspectj.weaver.jar

(2) 配置:

  • 引入AOP的约束:

  • AOP的3W-what、where、when

	<!-- AOP 配置:在什么地点、什么时机、做什么 -->
<!-- 1、what:做什么增强 -->
<bean id="transactionManager" class="com.shan.tx.TransactionManager"/> <aop:config proxy-target-class="false"> <!-- 属性proxy-target-class配置是否使用真实对象 -->
<!-- 配置AOP切面 -->
<aop:aspect ref="transactionManager"> <!-- 关联what -->
<!-- 2、where:在哪些包中的哪些类中的哪些方法上做增强 -->
<aop:pointcut id="txPoint" expression="execution(* com.shan.service..*Service*.*(..))"/>
<!-- 3、when:在方法执行的什么时机做增强 --><!-- 关联where -->
<aop:before method="open" pointcut-ref="txPoint"/>
<aop:after-returning method="commit" pointcut-ref="txPoint"/>
<aop:after-throwing method="rollback" pointcut-ref="txPoint"/>
<aop:after method="close" pointcut-ref="txPoint"/>
<aop:around method="aroundMethod" pointcut-ref="txPoint"/>
</aop:aspect>
</aop:config>

4、AOP增强的分类

■ 根据被增强的方法的执行时机分为:前置增强、后置增强、异常增强、最终增强、环绕增强

  • 前置增强:权限控制、日志记录等 [被增强的方法执行之前]
  • 后置增强:提交事务、统计分析数据结果等 [被增强的方法正常执行之后(中途没有异常)]
  • 最终增强:回滚事务、记录日志异常信息等 [被增强的方法出现异常]
  • 最终增强:释放资源等 [finally最后操作]
  • 环绕增强:缓存、性能日志、权限、事务管理等 [可以自定义在被增强方法的什么时机执行(返回一个Object,参数processdingJoinpoint)]

5、获取被增强方法的信息, 并且可以传递给增强方法【参数Joinpoint类

  • Joinpoint类连接点,访问被增强方法的真实对象,代理对象,方法参数等

  • 可以作为前置、后置、异常、最终增强方法的参数,第一个参数

    //可以作为前置、后置、异常、最终增强方法的参数,**`第一个参数`**
    public void open(JoinPoint jp) {
    System.out.println("开启事务~");
    System.out.println("代理对象:" +jp.getThis().getClass());
    System.out.println("目标对象:" +jp.getTarget().getClass());
    System.out.println("被增强方法的参数:" +Arrays.toString(jp.getArgs()));
    System.out.println("连接点方法的签名:" +jp.getSignature());
    System.out.println("当前连接点的类型:" +jp.getKind());
    }

5-2、环绕增强方法调用真实对象的方法【参数processdingJoinpoint

  • 参数processdingJoinpoint:是JointPoin 的子类,只能用于环绕增强,作为第一个参数

    还可以调用真实对象中被增强的方法。

//调用真实对象的方法 ret = pjp.proceed();
public Object aroundMethod(ProceedingJoinPoint pjp) {
Object ret = null;
System.out.println("开启事务~");
try {
ret = pjp.proceed();//调用真实对象的方法
System.out.println("调用真实对象的方法...~");
System.out.println("提交事务~");
} catch (Throwable e) {
System.out.println("回滚事务~,错误信息:" + e.getMessage());
}finally {
System.out.println("关闭资源~");
}
return ret;
}

6、使用注解配置AOP

(1) AOP注解的解析器【第三方程序,赋予注解的特殊功能】:

  • 使用cglib注解:配置属性proxy-target-class="true"
<!-- what -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- AOP注解的解析器 -->
<aop:aspectj-autoproxy/>

(2) 使用注解@Aspect配置一个AOP切面

  • @Pointcut (配置where)
  • @Before、@AfterReturning、@AfterThrowing、@After、@Around(配置when
@Component@Aspect //配置一个AOP切面
public class TransactionManager { //where
//xml:<aop:pointcut id="txPoint" expression="execution(* com.shan.service..*Service*.*(..))"/>
@Pointcut("execution(* com.shan.service..*Service*.*(..))")
public void txPoint() { } //@Before("txPoint()")
public void open(JoinPoint jp) {
System.out.println("开启事务~");
} //@AfterReturning("txPoint()")
public void commit() {
System.out.println("提交事务~");
}
//@AfterThrowing(value="txPoint()", throwing="ex")
public void rollback(Throwable ex) {
System.out.println("回滚事务~,异常信息:" +ex.getMessage());
}
//@After("txPoint()")
public void close() {
System.out.println("关闭资源~");
} @Around("txPoint()")
public Object aroundMethod(ProceedingJoinPoint pjp) {
Object ret = null;
System.out.println("开启事务~");
try {
ret = pjp.proceed();//调用真实对象的方法
System.out.println("调用真实对象的方法...~");
System.out.println("提交事务~");
} catch (Throwable e) {
System.out.println("回滚事务~,错误信息:" + e.getMessage());
}finally {
System.out.println("关闭资源~");
}
return ret;
}
}

九、Spring DAO

1、模板类和基类:

2、pring JDBC 【JDBCTemplate 模板类】

(1) 依赖jar包:

  • mysql-connector-java.jar 【还可以使用德鲁伊连接池:druid.jar】
  • spring-jdbc.jar
  • spring-tx.jar

(2) 总结JdbcTemplate模板类-处理CRUD 操作

//DML操作:
public update(String sql, Object...args)
参数:sql ?占位符对应的参数
返回:受影响的行数 //DQL 操作:
public <T>List<T> query(String sql, Object...args, RowMapper<T> rowMapper)
参数:sql ?占位符对应的参数 结果集处理器
返回:多行结果集封装的list

3、模板类JdbcTemplate的问题与解决NameParameterJdbcTemplate

(1) 问题:

● 在模板类JdbcTemplate中使用的占位符 ?【顺序占位符】,需要数第几个,然后写对应的参数,参数多了麻烦
● 面对集合查询 in查询时(不确定参数个数), select * from employee where id in .....
  • in 后边不知道该怎么写,是应该写一个?还是(多少个?,都是不确定的)

(2) 解决:使用NameParameterJdbcTemplate

  • 命名的参数JdbcTemplate模板,其实就是在JdbcTemplate外面套一层。

  • 允许使用 xx 来给占位参数起名称,我们需要给名称xx的位置设置参数。

□ 举例:

public int countOfActorsByFirstName(String firstName) {
String sql = "select count(*) from T_ACTOR where first_name = :first_name";
Map<String, String> namedParameters = Collections.singletonMap("first_name", firstName);
return this.namedParameterJdbcTemplate.queryForObject(sql, namedParameters, Integer.class);
}

十、Spring ORM --- 集成mybatis框架

十一、Spring tx

1、Spring 的事务管理主要包括 3 个 api:

  • PlatformTransactionManager:根据 TransactionDefinition 提供的事务属性配置信息,创建事务
  • TransactionDefinition:封装事务的隔离级别和超时时间,是否为只读事务和事务的隔离级别和传播规则等事务属性.
  • TransactionStatus:封装了事务的具体运行状态。如是否是新开启事务,是否已经提交事务,设置当前事务为rollback-only.

✿ 记:常用的事务管理器:

  • JDBC/MyBatis:DataSourceTransactionManager
  • Hibernate: HibernateTransactionManager

2、事务传播规则 TransactionDefinition 和 常用的情况

(1) 事务传播规则:

在一个事务方法中,调用了其他事务的方法,此时事务该如何传递,按照什么规则传播.

(2) 常用的情况:

■ 情况一:需要尊重/遵从当前事务

  • REQUIRED:(常用)必须存在一个事务,如果当前存在一个事务,则加入到该事务中,否则,新建一个事务.

■ 情况二:不遵从当前事务的

  • REQUIRES_NEW:(常用)不管当前是否存在事务,都会新开启一个事务.必须是一个新的事务.

■ 情况三:寄生事务(外部事务/内部事务/嵌套事务)

  • NESTED:寄生事务,如果当前存在事务,则在内部事务内执行.如果当前不存在事务,则创建一个新的事务.

3、事务配置(基于xml和注解)

(1) 基于xml:事务增强—本质就是AOP增强what、when、where

	<!-- ===============好比是AOP,事务增强================================== -->
<!-- 1、what:配置jdbc事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean> <!-- 2:when:配置事务管理器增强(环绕增强) --><!-- 关联what -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="trans"/>
</tx:attributes>
</tx:advice> <!-- 3、where:配置切面 --><!-- 关联when -->
<aop:config>
<aop:pointcut id="txPc" expression="execution(* com.shan.service.*Service.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPc"/>
</aop:config>

(2) 使用注解配置jdbc事务:tx注解解析器、@Transactional

  • 注解:@Transactional

  • 注解属性:name、propagation、isolation、timeout、read-only、rollback-for、no-rollback-for

    ■ 注解第三方解析:

    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!-- tx注解解析器 -->
    <tx:annotation-driven transaction-manager="txManager"/>

    ■ 注解@Transactional使用:

    @Service@Transactional
    public class AccountServiceImpl implements IAccountService{ @Autowired
    private IAccountDAO dao; @Override
    public void trans(Long outId, Long inId, int money) {
    dao.transOut(outId, money);
    int a = 1/0; //算术异常
    dao.transIn(inId, money);
    } //若是有查询方法,可以再贴注解@Transactional添加注解属性
    @Transactional(readOnly = true)
    public void listXX() { }
    }

(3) 事务配置(基于注解+Java Config 配置)

  • 注解:

    \({\color{Blue}{@Configuration}}\) 配置

    \({\color{Blue}{@import(配置子类)}}\)

    \({\color{Blue}{@Bean}}\) 配置创建bean对象

    \({\color{Blue}{@ComponentScan}}\) IoC注解解析器

    \({\color{Blue}{@EnableTransactionManagement}}\) 事务注解解析器

    @Transactional 配置jdbc事务

    @PropertySource 配置引入的属性文件资源

    \({\color{Gray}{@Component}}\) 泛指组件

    \({\color{Gray}{@Repository}}\) 持久层

    \({\color{Gray}{@Service}}\) 业务层

    \({\color{Gray}{@Controller}}\) 控制层

    @Value 配置注入属性值

    @Autowired 配置注入属性值

❀ Spring5学习大总结的更多相关文章

  1. 12.Linux软件安装 (一步一步学习大数据系列之 Linux)

    1.如何上传安装包到服务器 有三种方式: 1.1使用图形化工具,如: filezilla 如何使用FileZilla上传和下载文件 1.2使用 sftp 工具: 在 windows下使用CRT 软件 ...

  2. 一起来学大数据——走进Linux之门,学习大数据的重中之重

    昨天我们看了有关大数据Hadoop的一些知识点,但是要在学习大数据之前,我们还是要为大数据的环境做一些的部署. 那么,今天我们就来讲讲开启我们大数据之路的Linux,跟上我们的脚步yo~ Linux介 ...

  3. Java软件开发者,如何学习大数据?

    正常来讲学习大数据之前都要做到以下几点 1.学习基础的编程语言(java,python) 2.掌握入门编程基础(linux操作,数据库操作.git操作) 3.学习大数据里面的各种框架(hadoop.h ...

  4. 11种常用css样式学习大结局滚动条与显示隐藏

    滚动条展示 overflow-x: hidden;/*是否对内容的左/右边缘进行裁剪*/overflow-y: hidden;/*是否对内容的上/下边缘进行裁剪*/overflow:scroll;/* ...

  5. 学习大神笔记之 “MyBatis学习总结(一)”

    1.准备工作 软件:eclipse. mysql .navicat for mysql 包:mybatis-3.1.1.jar   mysql-connector-java-5.1.7-bin.jar ...

  6. JS学习大作业-Excel

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  7. python学习——大文件分割与合并

    在平常的生活中,我们会遇到下面这样的情况: 你下载了一个比较大型的游戏(假设有10G),现在想跟你的同学一起玩,你需要把这个游戏拷贝给他. 然后现在有一个问题是文件太大(我们不考虑你有移动硬盘什么的情 ...

  8. 一步一步学习大数据:Hadoop 生态系统与场景

    Hadoop概要 到底是业务推动了技术的发展,还是技术推动了业务的发展,这个话题放在什么时候都会惹来一些争议. 随着互联网以及物联网的蓬勃发展,我们进入了大数据时代.IDC预测,到2020年,全球会有 ...

  9. 在AI人工智能中如何巧妙学习大数据编程,成为五十万年薪的佼佼者

    编辑 ai狗年 大数据和人工智能的关系,首先要说什么是大数据.这些年来,大数据先是被神化,继而又被妖魔化,到了今天,其实谁也不知道别人所谓的大数据指的是什么.我大数据从业者,建了一个大数据资源共享群1 ...

随机推荐

  1. java 变量的定义 类型转换 基本的数据类型

    package com.aaa.zxf.ajax.test; import org.junit.Test; /** * 六. * 如何在ideal的maven项目中导入 Test 测试类? * * * ...

  2. 初识 oracle!

    /** * 一.oracle的简介? * 1.是一个关系型数据库,强大! * * 软件名 开发商 用途 * * oracle oracle 专门的软件公司 收费!1.连接的用户数,2.服务器的cpu的 ...

  3. 使用gige2500万相机时遇见的问题(条纹以及取图过久)

    1.确保网卡支持1g全双工: 2.确保安装了MVTec GigE Vision Streaming Filter(使用halcon接口的情况下) 3.确保机台的杀毒软件开放了相机的网络监控功能

  4. ApacheCN PHP 译文集 20211101 更新

    PHP 入门指南 零.序言 一.PHP 入门 二.数组和循环 三.函数和类 四.数据操作 五.构建 PHP Web 应用 六.搭建 PHP 框架 七.认证与用户管理 八.建立联系人管理系统 使用 PH ...

  5. golang 获取当月最后一天日期

    now := time.Now() year, month, day := now.Date() //fmt.Println(year, month, day) //2021 September 1 ...

  6. sublime配置大全

    配置:Preferences→Settings-User 字体和字体大小 "font_face": "YaHei Consolas Hybrid", " ...

  7. 索引,事务,存储引擎和选择,视图,mysql管理

    一.mysql索引:提高数据库的性能(不用加内存,不用改程序,不用调sql,查询速度就可能提高百倍千倍)索引会占用磁盘空间 CREATE   INDEX   索引名   ON   数据表 (列名or字 ...

  8. 「游记」CSP-S 2021 爆零记

    推荐访问本人自建博客 \(\text{cjwen.top}\) 初赛 之前参加过「难度介于 J 组(基础组)和 S 组(提高组)之间」的 [LGR-(-13) ]SCP 2021 第一轮(初赛)模拟, ...

  9. 【web安全】Nodejs原型链污染分析

    Nodejs原型链污染分析 什么是js原型? 可以将js原型理解为其他OOP语言中的类,但还是有细微区别. 1. function F(){...} 2. var f = new F(); 分析: 1 ...

  10. Rock Pi开发笔记(二):入手Rock Pi 4B plus(基于瑞星微RK3399)板子并制作系统运行

    前言   入手rock pi 4b plus板子,查看具体的实物,然后制作系统,刷系统,让摇滚派的ubuntu系统运行起来.   Rock Pi 4B plus 介绍   ROCK Pi 4 是 Ra ...