spring 注解方面的疑惑

小弟最近刚刚接触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上吧?
第三个:就是请各位帮我看看我的代码不足之处 谢谢了!

5个回答

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]

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问