小弟最近刚刚接触ssh2整合 ,有2个问题没弄明白,希望各位高手 指教一下,小弟不胜感激
下面把我的代码先贴出来
[color=red]user.java[/color]
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
[color=red]user.hbm.xml[/color]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
[color=red]UserDao[/color]
public interface UserDao {
/**
* 添加
*/
public void save(User user);
[color=red]UserDaoImpl[/color]
@Repository("userDao")
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
@Resource(name = "hibernateTemplate")
public void setHibernateTemplate1(HibernateTemplate hibernateTemplate) {
super.setHibernateTemplate(hibernateTemplate);
}
/*
* 添加
*/
public void save(User user) {
getHibernateTemplate().save(user);
}
[color=red]UserService[/color]
public interface UserService {
/**
* 注册用户
*/
public void save(User user);
[color=red]UserServiceImpl[/color]
@Service("userService")
@Transactional
public class UserServiceImpl implements UserService {
@Resource
private UserDao userDao;
/*
* 注册用户
*/
public void save(User user) {
if (user != null && user instanceof Object)
userDao.save(user);
}
[color=red]struts.xml[/color]
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<package name="User" extends="struts-default">
<action name="userAdd" class="userAddAction">
<result name="success" >/success.jsp</result>
<result name="input">/userAdd.jsp</result>
</action>
</package>
[color=red]applicationContext.xml[/color]
<?xml version="1.0" encoding="UTF-8"?>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-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">
<!-- spring自动扫描和管理bean -->
<context:component-scan base-package="cn.com.jyp"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/ssh2" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<!-- 配置SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>cn/com/jyp/model/User.hbm.xml</value>
</list>
</property>
</bean>
<!-- 配置hibernateTemplate -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置spring提供的事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 采用@Transactional注解方式使用事务 -->
<tx:annotation-driven transaction-manager="txManager"/>
我的疑问是,第一个:在使用Spring提供的注解方式@Resource 注入依赖对象,标注在属性上,是不是可以不用提供这个属性的setter方法,如果可以不提供的话,为什么UserDaoImpl 里 这么写
@Resource private HibernateTemplate hibernateTemplate;
确出错,这个注解的实现原理是不是根据相应的属性自动提供其setter方法为其注入的啊 ?
第二个:关于事务的注解是按照上面的代码这么标在service上吧?
第三个:就是请各位帮我看看我的代码不足之处 谢谢了!
1、默认情况下@Resource是按照setXXX格式来注入的,也就是按照属性名注入的。必须要有set方法
2、事务的处理一般不做成你那样的,而是做一个统一的切面进行事务处理,即直接在spring配置文件里面指定某个层为事务层,如:service层:
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="save" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- 那些类的哪些方法参与事务 -->
<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution(* service.*.*(..))"/>
<aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/>
</aop:config>
3、大家都很忙,没时间看你的代码哦~还是直接问问题好点
Spring应该是根据AOP自动为属性生成了setter方法,其它的应该是没有这样做,所以得自己写setter方法。
Spring 的注解的作用是简化xml配置文件,而不是取代setter方法,这种方式是为了减少配置工作量的折中方案。
1、@Resource方法默认的是按照名称注入的,就是你的setXXXX方法后面的那一部分,如果你的set方法后面的这部分和你的属性名称不是一致的,那么在spring容器中他又找不到的话,就会按照类型来注入了。只要是类型匹配就可以注入进去了
2、关于事务可以使用@Transtional注解。里面有关于属性的各种属性的设置,不过关于事务的配置一般还是使用xml的方式因为他比较容易理解
没看你的代码。不过你可以看看下面2篇博客,你提出的 :D 问题里面有详细的解释,我就不copy了
[url]http://liuxi1024.iteye.com/blog/556457[/url]
[url]http://www.iteye.com/topic/295348[/url]