1.domain配置Employee实体类
2.dao接口及其实现类
public interface IAccountDAO {
/**
* 从指定帐户转出多少钱
* @param outId
* @param money
*/
void transOut(Long outId,int money);
/**
* 从指定帐户转入多少钱
* @param inId
* @param money
*/
void transIn(Long inId,int money);
}
@Repository
public class AccountDAOImpl implements IAccountDAO {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(DataSource ds) {
this.jdbcTemplate = new JdbcTemplate(ds);
}
@Override
public void transOut(Long outId, int money) {
System.out.println("outId:"+outId+",money:"+money);
this.jdbcTemplate.update("update account set balance = balance - ? where id=?", money,outId);
}
@Override
public void transIn(Long inId, int money) {
System.out.println("inId:"+inId+",money:"+money);
this.jdbcTemplate.update("update account set balance = balance + ? where id=?", money,inId);
}
}
实现类添加注解:@Repository
3.service接口及实现类
public interface IAccountService {
/**
* 从指定帐户转出另一个帐户多少钱
* @param outId
* @param inId
* @param money
*/
void trans(Long outId,Long inId,int money);
}
@Service
@Transactional
public class AccountServiceImpl implements IAccountService {
@Autowired
private IAccountDAO dao;
@Override
public void trans(Long outId, Long inId, int money) {
//转出
this.dao.transOut(outId, money);
//转入
int a = 1/0;//模拟异常
this.dao.transIn(inId, money);
}
}
实现类添加@Service,@Transactional,并注入dao
4.根目录添加当前项目连接池的配置
@Configuration
@PropertySource("classpath:db.properties")
public class DataSourceConfig {
@Value("${jdbc.driverClassName}")
private String driverClassName;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Value("${jdbc.initialSize}")
private int initialSize;
//创建连接池Bean
//<bean id="dataSource" class="">
@Bean
public DataSource dataSource() {
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(driverClassName);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
ds.setInitialSize(initialSize);
return ds;
}
}
5.根目录添加项目的主配置类 AppConfig.java
@Configuration //标记当前类为一个配置类
@Import(DataSourceConfig.class) //包含其他的配置类
@ComponentScan //默认扫描当前所在的包及子包 IOC注解解析
@EnableTransactionManagement //事务注解解析器
public class AppConfig {
//创建事务管理器的Bean,参数所需的DataSource ds,spring会自动在整个IOC容器中找,并注入进去
@Bean
public DataSourceTransactionManager txManager(DataSource ds) {
return new DataSourceTransactionManager(ds);
}
}
6.测试代码
@SpringJUnitConfig(classes=AppConfig.class)
public class App {
@Autowired
private IAccountService service;
@Test
void testTrans() {
service.trans(10002L, 10010L, 100);
}
}
企业中的选择
Spring Ioc容器通过读取配置文件中的配置元数据,通过数据对应用中的各个对象进行实例化及装配。
元数据的配置有三种方式:
1.XML配置
2.注解配置
3.java代码配置
企业中直接使用XML配置越来越少了,更多是
1.注解
2.ML+注解
3.XML+注解+java配置
4.注解+java配置 (SpringBoot框架倾向)
上一篇:spring5整理:(九)事务