spring注解事务实现demo
- @Configuration标识当前类是Spring的一个配置类
- @ComponentScan替代xml中的context:component-scan/
- @Import引入其他配置类,被引入的配置类可以不加@Configuration注解
- @PropertySource:引入外部properties文件,注意加classpath:
- @Value对成员变量赋值
- @Bean将一个方法的返回值对象加入到Spring的容器当中管理
- @Qualifier可以使用在方法上,表明对应的形参引入/注入的对象类型
直接删除xml的配置文件,取而代之的是一个Config类
@Transactional注解,取代tx标签
@EnableTransactionManagement注解,开启事务注解
- @Configuration 标识当前类为一个配置类, 当前项目的配置类,好比是applicationContext.xml
- @Import(Xxx.class) 在主配置类中包含Xxx的配置类
- @PropertySource(“classpath:db.properties”) 读取配置文件
- @Bean(“Xxx”) 相当于 , Bean()中不写参数,默认就是该方法创建的对象; 该对象就被Spring容器所管理了
该类是一个配置类,它的作用和bean.xml是一样的
spring中的新注解
Configuration
作用:指定当前类是一个配置类
细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写。
ComponentScan
作用:用于通过注解指定spring在创建容器时要扫描的包
属性:
value:它和basePackages的作用是一样的,都是用于指定创建容器时要扫描的包。
我们使用此注解就等同于在xml中配置了:
<context:component-scan base-package="com.sunny"></context:component-scan>
Bean
作用:用于把当前方法的返回值作为bean对象存入spring的ioc容器中
属性:
name:用于指定bean的id。当不写时,默认值是当前方法的名称
细节:
当我们使用注解配置方法时,如果方法有参数,spring框架会去容器中查找有没有可用的bean对象。
查找的方式和Autowired注解的作用是一样的
Import
作用:用于导入其他的配置类
属性:
value:用于指定其他配置类的字节码。
当我们使用Import的注解之后,有Import注解的类就父配置类,而导入的都是子配置类
PropertySource
作用:用于指定properties文件的位置
属性:
value:指定文件的名称和路径。
关键字:classpath,表示类路径下
DEMO
java依赖包
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.19</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.3.19</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.15</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
</dependencies>
Java配置类
@ComponentScan("com.buba") //IoC注解解析器
@Configuration //标识当前类为一个配置类
@EnableAspectJAutoProxy //不在配置类中添加@EnableAspectJAutoProxy,那么所有切面注解是不生效
@EnableTransactionManagement //事务注解解析器
public class CoreConfig {
// 当前项目的连接池的配置类
@Bean
public DataSource dataSource(){
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setUsername("root");
druidDataSource.setPassword("123456");
druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
druidDataSource.setUrl("jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai");
return druidDataSource;
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource){
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
//创建事务管理的Bean
@Bean
public DataSourceTransactionManager txManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
实体类
@Data
public class Money {
private Integer id;
private String name;
private double money;
}
dao层
@Repository
public class MoneyDao {
private Logger logger = Logger.getGlobal();
@Autowired
private JdbcTemplate jdbcTemplate;
public Integer UserUpdate(Money money){
String sql = "update money set money = ? where id = ?";
int update = jdbcTemplate.update(sql, money.getMoney(),money.getId());
logger.info(Integer.toString(update));
return update;
}
}
service层
@Service
public class MoneyService {
@Autowired
private MoneyDao moneyDao;
@Transactional
public void test1(){
Money money1 = new Money();
money1.setMoney(999);
money1.setId(1);
Money money2 = new Money();
money2.setMoney(999);
money2.setId(2);
moneyDao.UserUpdate(money1);
// int o = 5/0;
moneyDao.UserUpdate(money2);
}
}
测试类
public classs test{
@Test
public void test1(){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(CoreConfig.class);
MoneyService bean = context.getBean(MoneyService.class);
bean.test1();
}
}