Spring

IOC

通过IOC容器创建对象步骤

(1)创建Maven项目,导入依赖

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-context</artifactId>
  4. <version>5.2.5.RELEASE</version>
  5. </dependency>

(2)定义类

  1. public class Student {
  2. private String name;
  3. private int age;
  4. }

(3)注册bean

  1. <bean id="student" class="com.cskaoyan.Student"/>

(4)获取对象

属性赋值

XML

(1)通过Set方法给属性赋值

基本数据类型

  1. <bean id="student" class="com.cskaoyan.Student">
  2. <property name="name" value="xyz"/>
  3. <property name="age" value="18"/>
  4. </bean>

引用数据类型

  1. <bean id="student" class="com.cskaoyan.Student">
  2. <property name="name" value="xyz"/>
  3. <property name="age" value="18"/>
  4. <property name="address" ref="address"/>
  5. </bean>
  6. <bean id="address" class="com.cskaoyan.Address">
  7. <property name="province" value="广东省"/>
  8. <property name="city" value="广州市"/>
  9. </bean>

(2)通过构造方法赋值

定义类

  1. @Data
  2. public class Address {
  3. private String province;
  4. private String city;
  5. public Address(String province, String city){
  6. this.province = province;
  7. this.city = city;
  8. }
  9. }

通过构造方法给对象赋值

  1. <bean id="address" class="com.cskaoyan.Address">
  2. <constructor-arg name="province" value="广东省"></constructor-arg>
  3. <constructor-arg name="city" value="广州市"></constructor-arg>
  4. </bean>

自动赋值方式

byName属性名与bean的id值相同

  1. <bean id="student" class="com.cskaoyan.Student" autowire="byName">
  2. <property name="name" value="xyz"/>
  3. <property name="age" value="18"/>
  4. </bean>
  5. <bean id="address" class="com.cskaoyan.Address">
  6. <constructor-arg name="province" value="广东省"></constructor-arg>
  7. <constructor-arg name="city" value="广州市"></constructor-arg>
  8. </bean>

byType属性类型与bean的类型相同

  1. <bean id="student" class="com.cskaoyan.Student" autowire="byType">
  2. <property name="name" value="xyz"/>
  3. <property name="age" value="18"/>
  4. </bean>
  5. <bean id="address" class="com.cskaoyan.Address">
  6. <constructor-arg name="province" value="广东省"></constructor-arg>
  7. <constructor-arg name="city" value="广州市"></constructor-arg>
  8. </bean>

注解

定义类

Student

  1. @Component(value = "student")
  2. @Data
  3. public class Student {
  4. @Value("xyz")
  5. private String name;
  6. @Value("20")
  7. private int age;
  8. @Autowired
  9. private Address address;
  10. }

Address

  1. @Component(value = "address")
  2. public class Address {
  3. @Value("广东省")
  4. private String province;
  5. @Value("广州市")
  6. private String city;
  7. }

注册扫描器

  1. <!--组件扫描器-->
  2. <context:component-scan base-package="com.cskaoyan"/>

AOP

AOP的底层实现就是动态代理

AspectJ是一个AOP框架

使用步骤

(1)新建Maven项目,导入依赖

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-aspects</artifactId>
  4. <version>5.2.5.RELEASE</version>
  5. </dependency>

(2)添加AOP约束文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xsi:schemaLocation=
  7. "http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/context
  10. https://www.springframework.org/schema/context/spring-context.xsd
  11. http://www.springframework.org/schema/aop
  12. https://www.springframework.org/schema/aop/spring-aop.xsd">

(3)定义接口及其实现类

UserService

  1. public interface UserService {
  2. User selectUserById(int id);
  3. }

UserServiceImpl

  1. @Component
  2. public class UserServiceImpl implements UserService {
  3. @Override
  4. public User selectUserById(int id) {
  5. // 业务主体逻辑
  6. System.out.println("根据用户id查找用户");
  7. return null;
  8. }
  9. }

(4)注册Aspect组件

  1. @Aspect
  2. @Component
  3. public class MyAspect {
  4. // 定义增强方法
  5. @Before("execution(* com.cskaoyan.service.Impl.UserServiceImpl.*(..))")
  6. public void doLog(){
  7. System.out.println("日志记录...");
  8. }
  9. }

(5)设置组件扫描器以及AspectJ自动生成代理

  1. <!--组件扫描器-->
  2. <context:component-scan base-package="com.cskaoyan"/>
  3. <!--AspectJ自动生成代理对象-->
  4. <aop:aspectj-autoproxy/>

AspectJ事务管理

AOP面向切面编程事务管理

配置如下

  1. <!--datasource-->
  2. <bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
  3. <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  4. <property name="url" value="jdbc:mysql://localhost:3306/test"/>
  5. <property name="username" value="root"/>
  6. <property name="password" value="123456"/>
  7. </bean>
  8. <!--事务管理器-->
  9. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  10. <property name="dataSource" ref="datasource"/>
  11. </bean>
  12. <!--事务设置-->
  13. <tx:advice id="txAdvice" transaction-manager="transactionManager">
  14. <tx:attributes>
  15. <tx:method name="transfer" rollback-for="java.lang.Exception"/>
  16. </tx:attributes>
  17. </tx:advice>
  18. <!--切入点-->
  19. <aop:config>
  20. <aop:pointcut id="transactionPointcut" expression="execution(* com.cskaoyan.service..*(..))"/>
  21. <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut"/>
  22. </aop:config>

Spring事务管理

声明式事务管理

(1)配置事务管理器

  1. <!--事务管理-->
  2. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  3. <property name="dataSource" ref="datasource"/>
  4. </bean>
  5. <!--使用注解声明事务-->
  6. <tx:annotation-driven transaction-manager="transactionManager"/>

(2)在Service层所在事务方法添加注解

  1. @Transactional
  2. @Override
  3. public void transfer(Integer fromId, Integer toId, Integer money) {
  4. // 主体业务逻辑
  5. // 获取余额
  6. Integer sourceAccountBalance = accountMapper.selectBalanceById(fromId);
  7. Integer targetAccountBalance = accountMapper.selectBalanceById(toId);
  8. // 完成转账
  9. sourceAccountBalance -= money;
  10. targetAccountBalance += money;
  11. // 更新账户余额
  12. accountMapper.updateAccountBalance(fromId, sourceAccountBalance);
  13. // 模拟异常情况
  14. System.out.println(1 / 0);
  15. accountMapper.updateAccountBalance(toId, targetAccountBalance);
  16. }

只要发生运行时异常,那么就会自动回滚

Spring整合Mybatis

(1)新建Maven项目,导入依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework</groupId>
  4. <artifactId>spring-context</artifactId>
  5. <version>5.2.5.RELEASE</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework</groupId>
  9. <artifactId>spring-jdbc</artifactId>
  10. <version>5.2.15.RELEASE</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>mysql</groupId>
  14. <artifactId>mysql-connector-java</artifactId>
  15. <version>5.1.47</version>
  16. <scope>runtime</scope>
  17. </dependency>
  18. <dependency>
  19. <groupId>com.alibaba</groupId>
  20. <artifactId>druid</artifactId>
  21. <version>1.2.8</version>
  22. </dependency>
  23. </dependencies>

(2)配置文件

  1. <!--datasource-->
  2. <bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
  3. <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  4. <property name="url" value="jdbc:mysql://localhost:3306/test"/>
  5. <property name="username" value="root"/>
  6. <property name="password" value="123456"/>
  7. </bean>
  8. <!--sqlSessionFactory-->
  9. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  10. <property name="dataSource" ref="datasource"/>
  11. </bean>
  12. <!--dao-->
  13. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  14. <property name="basePackage" value="com.cskaoyan.mapper"/>
  15. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
  16. </bean>

(3)Dao层

AccountDao

  1. public interface AccountDao {
  2. Integer selectBalanceById(Integer id);
  3. int updateAccountBalance(@Param("id") Integer id, @Param("money") Integer money);
  4. }

(4)Service层

AccountService

  1. public interface AccountService {
  2. void transfer(Integer fromId, Integer toId, Integer money);
  3. }

AccountServiceImpl

  1. @Component
  2. public class AccountServiceImpl implements AccountService {
  3. @Autowired
  4. @Qualifier("accountMapper")
  5. AccountMapper accountMapper;
  6. @Override
  7. public void transfer(Integer fromId, Integer toId, Integer money) {
  8. // 主体业务逻辑
  9. // 获取余额
  10. Integer sourceAccountBalance = accountMapper.selectBalanceById(fromId);
  11. Integer targetAccountBalance = accountMapper.selectBalanceById(toId);
  12. // 完成转账
  13. sourceAccountBalance -= money;
  14. targetAccountBalance += money;
  15. // 更新账户余额
  16. accountMapper.updateAccountBalance(fromId, sourceAccountBalance);
  17. accountMapper.updateAccountBalance(toId, targetAccountBalance);
  18. }
  19. }

(5)测试

  1. // Spring容器
  2. ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
  3. // 获取组件
  4. AccountService accountService = (AccountService) app.getBean("accountServiceImpl");
  5. // 转账
  6. accountService.transfer(1, 2, 1000);