本文讨论了 Spring 框架中的依赖注入和控制反转的概念,强调了 Spring 的主要特性如降低组件耦合、提供服务和支持 AOP 等。通过示例展示了如何搭建 Spring 环境、配置 beans.xml 文件以及使用注解进行依赖注入,同时介绍了不同的 bean 生命周期和作用域。最后,提到利用自动扫描功能简化配置过程和管理 bean 实例。
我的 je 博客:http://86asm.javaeye.com/
</bean>
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManag
er">
<property name="dataSource" ref="theDatasource" />
</bean>
<tx:annotation-driven transaction-manager="txManager" />
说明:首先是配置了一个数据源,以供数据源事务管理器配置引用。接着配置了数据源事务管
理器,随后开启了基于@Transactional注解的事务管理器,开启后,只要是被spring管理
的bean且打有@Transactional注解的bean都会受配置的事务管理。关于这里的配置可参看
spring文档9.5.6
步骤二、准备使用环境。
建立UserDao接口,代码如下:
package com.asm.dao;
public interface UserDao {
void save(User user);
void delete(User user);
void update(User user);
User get(int id);
List<User> getUsers();
}
建立UserDaoImp类实现UseDao接口,代码如下:
package com.asm.dao.impl;
@Transactional
public class UserDaoImp implements UserDao {
private JdbcTemplate jdbcTemplate;
public void setDatasouce(DataSource datasource) {
jdbcTemplate = new JdbcTemplate(datasource);
}
public void delete(User user) {
jdbcTemplate.update("delete from user where id=?", new
Object[] { user.getId() },
new int[] { java.sql.Types.INTEGER });
}
public User get(int id) {
return (User) jdbcTemplate.queryForObject("select * from user
where id=?",
new Object[] { id }, new int[] { java.sql.Types.INTEGER
}, new RowMapper() {
public Object mapRow(ResultSet rs, int arg1) throws
17
http://86asm.javaeye.com/ 文章错误之处肯请大家留言指正,
再此谢过。
文章编排目录结构,大家可以在文档结构图下很方便地查看
18.
我的 je 博客:http://86asm.javaeye.com/
SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
return user;
}
});
}
@SuppressWarnings("unchecked")
public List<User> getUsers() {
return (List<User>) jdbcTemplate.query("select * from user",
new RowMapper() {
public Object mapRow(ResultSet rs, int arg1) throws
SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
return user;
}
});
}
public void save(User user) {
jdbcTemplate.update("insert into user(name) values(?)", new
Object[] { user.getName() },
new int[] { java.sql.Types.VARCHAR });
}
public void update(User user) {
jdbcTemplate.update("update user set name=? where id=?", new
Object[] { user.getName(),
user.getId() }, new int[] { java.sql.Types.VARCHAR,
java.sql.Types.INTEGER });
}
}
步骤三、把UserDaoImp纳入spring容器管理。
在beans.xml中增加对应的配置内容如下:
<bean id="userDaoImp" class="com.asm.dao.impl.UserDaoImp">
<property name="datasouce" ref="theDatasource" />
</bean>
结合配置文件解析UserDaoImp实现类:(1)此类作为一个bean实例纳入spring容器管理,
18
http://86asm.javaeye.com/ 文章错误之处肯请大家留言指正,
再此谢过。
文章编排目录结构,大家可以在文档结构图下很方便地查看
19.
我的 je 博客:http://86asm.javaeye.com/
使用setter注入方式完成对datasource的注入,实质是完成的JdbcTemplate对象的初始
化。(2)该类CRUD方法都使用了Spring容器提供的JdbcTemplate对象来简化了CRUD操作,
在spring文档的11.2.1.节对JdbcTemplate类作了较详细的介绍。(3)此类打上了
@Transactional注解,表示此类中的业务方法都会受beans.xml配置的
<tx:annotation-driven transaction-manager="txManager" />管理
步骤四、编写测试类
package com.asm.test;
public class TestSJ {
private UserDao ud = (UserDao) new
ClassPathXmlApplicationContext("beans.xml").getBean("userDaoImp");
public static void main(String[] args) {
TestSJ sj = new TestSJ();
sj.save();
sj.delete();
}
public void save() {
User user = new User();
user.setName("张某某");
ud.save(user);
}
public void delete() {
User user = new User();
user.setId(1);
ud.delete(user);
}
//其它测试方法省略...
}
说明:注意这里通过getBean获取的是UserDao接口对象,而非UserDao接口的实现类
UserDaoImp对象,因为spring的事务管理也是利用了aop技术,所以必须要面向接口,如果
想通过getBean获取它的实现类对象将会报错。
步骤五、感知事务管理。
在UserDaoImp的delete方法中增加如下代码:
jdbcTemplate.update("delete from user where id=?", new Object[]
{ user.getId() }, new int[] { java.sql.Types.INTEGER });
int i=5/0;
jdbcTemplate.update("delete from user where id=2");
spring 默认的事务管理方式:运行期异常进行事务回滚,非运行期异常不进行事务回滚。
因此增加上面的代码后,会出现 ArithmeticException 运行期异常。所以当出现此异常
时,delete 方法中的数据库操作都会进行回滚,因而 id=1 和 2 这两条记录都不会被删除。
如果把 UseDaoImp 类前标记@Transactional 的注解去掉,id=1 的记录会被删除,因为失
去了 spring 容器的事务管理。
小结 spring 事务:
19
http://86asm.javaeye.com/ 文章错误之处肯请大家留言指正,
再此谢过。
文章编排目录结构,大家可以在文档结构图下很方便地查看