标签:
写一个银行转账案例,
案例结构如下:
AccountDao是Dao层。Account是数据库的实体类。AccountService是业务层。TestAccount是测试类。applicationContext.xml是Spring的配置文件。
第一步:导jia包:
第二步:写实体类:
//对应数据库中的account表 public class Account { private int id; private String name; private double money; /** * @return the id */ public int getId() { return id; } /** * @param id the id to set */ public void setId(int id) { this.id = id; } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @return the money */ public double getMoney() { return money; } /** * @param money the money to set */ public void setMoney(double money) { this.money = money; } }
第三步:写 AccountDao接口:
public interface AccountDao { //加钱 public void addmoney(String name,double money); //减钱 public void reducemoney(String name ,double money); }
第四步:写AccountDao接口的实现类
//继承了JdbcDaoSupport,这样就可以Spring的JDBc的模板 public class AccountDaoimpl extends JdbcDaoSupport implements AccountDao { public void addmoney(String name, double money) { String sql="update account set money=money+"+money+"where name=?"; this.getJdbcTemplate().update(sql, name); } public void reducemoney(String name, double money) { String sql="update account set money=money-"+money+"where name=?"; this.getJdbcTemplate().update(sql, name); } }
第五步:写转账的接口
/* * 转账的接口 */ public interface AccountService { //转钱 public void transfer(String outAccount,String inAccount,double money); }
第六步:转账接口的实现类
第一种写法:里面的accountDao用set/get方法注入。
public class AccountServiceimpl implements AccountService { /** * 这个类是转账接口的实现类。我们要考虑的问题是怎么把Dao给注入进去。 * 这里用普通的方式(get/set) * * */ private AccountDao accountDao; /** * @return the accountDao */ public AccountDao getAccountDao() { return accountDao; } /** * @param accountDao the accountDao to set */ public void setAccountDao(AccountDao accountDao) { this.accountDao = accountDao; } public void transfer(String outAccount, String inAccount, double money) { accountDao.addmoney(inAccount, money); accountDao.reducemoney(outAccount, money); } }
第二种写法:里面的accountDao用@AutoWired注解的方式。
public class AccountServiceimpl implements AccountService { /** * 这个类是转账接口的实现类。我们要考虑的问题是怎么把Dao给注入进去。 * 这里用注解的方式 @Autowired。 * 一旦用这种方式,之前那种set/get方式在applicationContext.xml中的 * <bean id="AccountService" class="cn.itcast.service.AccountServiceimpl"> <!-- <property name="accountDao" ref="AccountDao"/> --> </bean> 里面的property name="accountDao" ref="AccountDao"/>必须去掉。 * * */ @Autowired private AccountDao accountDao; public void transfer(String outAccount, String inAccount, double money) { accountDao.addmoney(inAccount, money); accountDao.reducemoney(outAccount, money); } }
第七步:写applicationContext.xml
第一种写法对应(第六步中的第一种写法:里面的accountDao用set/get方法注入)。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <!-- <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> --> <!-- 引入peoperties文件 --> <!-- <context:property-placeholder location="classpath:db.properties"/> --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations" value="classpath:db.properties"/> </bean> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${driver}"/> <property name="jdbcUrl" value="${url}"></property> <property name="user" value="${username}"></property> <property name="password" value="${password}"></property> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="AccountDao" class="cn.itcast.dao.AccountDaoimpl"> <property name="jdbcTemplate" ref="jdbcTemplate"/> </bean> <bean id="AccountService" class="cn.itcast.service.AccountServiceimpl"> <!-- 这里用的是property这种方式,也就是说在AccountServiceimpl这个类里面的accountDao属性 必须要有set方法不然会报错,属性不能注入。 --> <property name="accountDao" ref="AccountDao"/> </bean> </beans>
第二种写法:对应(第六步里面的accountDao用@AutoWired注解的方式。)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <!-- <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> --> <!-- 引入peoperties文件 --> <!-- <context:property-placeholder location="classpath:db.properties"/> --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations" value="classpath:db.properties"/> </bean> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${driver}"/> <property name="jdbcUrl" value="${url}"></property> <property name="user" value="${username}"></property> <property name="password" value="${password}"></property> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="AccountDao" class="cn.itcast.dao.AccountDaoimpl"> <property name="jdbcTemplate" ref="jdbcTemplate"/> </bean> <bean id="AccountService" class="cn.itcast.service.AccountServiceimpl"> </bean> </beans>
第八步:写Junit测试类
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:applicationContext.xml") public class TestAccount { @Autowired private AccountService accountService; @Test public void accounttest() { accountService.transfer("aaa", "bbb", 200); } }
总结:这里要注意的是:@Autowired这个注解的使用不需要在ApplicationContext.xml中配置bean.只要在AccountServiceimpl中配置了AccountDaoimpl用@Autowired修饰了那么就会根据类型来创建对象。
所以上面的注解形式的流程是:在测试程序中,根据
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml")
把ApplicationContext.xml文件引入进来。然后当执行
@Autowired
private AccountService accountService;
时发现有一个@Autowired注解。马上去bean容器中,在对应的类型匹配的bean注入(spring先找类型为AccountService的bean)。
找到后注入。那么accountService不就有值了吗,然后在创建AccountServiceimpl的过程中。发现里面有一个
@Autowired
private AccountDao accountDao;
同理Spring马上再去bean容器中寻找类型为AccountDao的bean.找到后注入到accountDao中。那么accountDao就有值了。
解释一下为什么加一句<property name="accountDao" ref="AccountDao"/> 就会报错。
<bean id="AccountService" class="cn.itcast.service.AccountServiceimpl"> <!-- 这里用的是property这种方式,也就是说在AccountServiceimpl这个类里面的accountDao属性 必须要有set方法不然会报错,属性不能注入。 --> <!-- <property name="accountDao" ref="AccountDao"/> --> </bean>
因为:按照上面的解释是:在测试代理中先看到了@Autowire注解时。再去bean容器中找到相应的类型注入。如果<bean id="AccountService" class="cn.itcast.service.AccountServiceimpl">中还有一个<property name="accountDao" ref="AccountDao"/>,如果用<property 这样的话就必须要用set/get方式,给accountDao注入值。而如果我这里不写这句话,等AccountServiceimpl创建时,发现
@Autowired
private AccountDao accountDao;
就会再去bean容器中找到相应的类型注入。
标签:
原文地址:http://www.cnblogs.com/shenxiaoquan/p/5732744.html