2 gq6547017 gq6547017 于 2016.04.15 12:19 提问

spring会自动代理Struts2的action 50C

我的struts的action全部被spring配置成了aop,我的action出现的全部是代理对象。
导致我的action不能调用自己定义的方法。为什么我没有配置struts的action为aop,
但是spring全部自动配置成了aop?这spring的配置文件

 <?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: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/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">

<!-- 启用注解扫描 -->
<context:annotation-config/>
<!-- spring默认只代理Action类的接口的函数,cglib jar文件就是可以代理Action自己定义的函数 
<aop:aspectj-autoproxy proxy-target-class="true" />
-->
<bean id="testService" class="com.guoqiao.test.TestService">
    <property name="name" value="test"/>
</bean>
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
        <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orclguo"/>
        <property name="username" value="scott"/>
        <property name="password" value="tiger"/>
         <!-- 连接池启动时的初始值 -->
        <property name="initialSize" value="30"/>
        <!-- 连接池的最大值 -->
        <property name="maxActive" value="500"/> 
        <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
        <property name="maxIdle" value="2"/>
        <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
        <property name="minIdle" value="1"/>
</bean>
<!-- 配置会话工厂() -->
<bean id="sessionFactory"  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
     <!-- 设置数据源 -->
     <property name="dataSource" ref="dataSource"/>
     <!-- 接管了hibernate对象映射文件 -->
     <property name="mappingResources">
        <list>     
          <value>com/guoqiao/domain/Department.hbm.xml</value>
          <value>com/guoqiao/domain/Employee.hbm.xml</value>
        </list>
     </property>
     <property name="hibernateProperties">
        <value>
                hibernate.dialect=org.hibernate.dialect.OracleDialect
                hibernate.hbm2ddl.auto=update
                hibernate.show_sql=true
                hibernate.cache.use_second_level_cache=true
                hibernate.cache.use_query_cache=true
                hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
                hibernate.generate_statistics=true        
        </value>
     </property>
</bean>
<!--
<bean id="employeeService" class="com.guoqiao.service.imp.EmployeeService">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>
  -->
<!-- 配置EmployeeService对象通过注解的方式来注入属性值,这是一个知识点 -->
<bean id="employeeService" class="com.guoqiao.service.imp.EmployeeService"/>

<bean id="departmentService" class="com.guoqiao.service.imp.DepartmentService">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 配置事务管理器,统一管理sessionFactory的事务 -->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

<!-- 启用事务注解 @Transactional-->
<tx:annotation-driven transaction-manager="txManager"/>
</beans>

明白点说就是我spring中的bean全部都被spring代理了,包括我struts2的action.
举个例子,我有个叫employee的bean

 <bean id="employeeService" class="com.guoqiao.service.imp.EmployeeService">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

public interface EmployeeServiceInterf{
public void a();
}
public class EmpolyeeService implements EmployeeServiceInterf{
public void b(){
System.out.println("b");
};
public void a(){
System.out.println("a");
};
}

public class TestInjection(){
//下面的写法注入不了
EmpoyeeService employeeService;
//下面的写法可以注入
EmpoyeeServiceInterf employeeService;
}
这是一个bean,这个Bean类是EmpoyeeService
EmpoyeeService实现了EmployeeServiceInterf接口
但我是把这个bean注入类型为EmpoyeeService的对象上会注入失败
把这个bean注入EmployeeServiceInterf的对象上时才能成功(在spring集成struts2的环境中)

再明白点说就是说这个bean看起来像是一个实现类,但其实你用这bean注入其他对象
上的时候,这个bean是这个实现类的代理对象。

如果上面我手动写的代码还看不懂的话,你还是绕道吧,你连我讲的是什么都看不懂。

3个回答

haixuan1137
haixuan1137   2016.04.15 13:12

/context:component-scan这个才是扫描注释的

epm_kf6_10
epm_kf6_10   2016.04.15 15:02

context:annotation-config/

这一段里把不就是自动配置的语句吗······你没发现这里注释的不对吗······把这些都注释在一起

gq6547017
gq6547017 不懂你说什么,我的注解没问题的就是少了句<context:component-scan base-package="XXX" />
2 年多之前 回复
Goskalrie
Goskalrie   2016.04.16 00:42

配置文件中已经引入了context,使用context标签试一下。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
struts2 委托spring代理action
让spring代替struts2生成Action struts2中提供了一个与spring进行集成的包,位于struts2 的lib下,叫做struts2-spring-plugin.jar。复制到当前目录的WEB-INF/lib下,然后配置struts.xml和applicationContext.xml (1)在struts.xml的配置中使用class属性指向Spring的元
Struts2+Spring3 设置默认自动装配action需要注意的细节
让spring自动装配,只要设置需要自动装配的中的autowire属性。如下设置:      <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sp
Struts2集成spring3后action的几种实例方法
一般来说,整合struts和spring后,struts的配置文件struts.xml或struts.properties不会发生变化,spring配置文件也只需配置业务组件及以下层次的bean,但我们在请求action的时候缺可以直接使用。那么action实例到底是怎样实例和注入的呢?
struts2和spring的两种整合方式 action的自动装配
http://www.cnblogs.com/taoxiaoji/archive/2011/03/12/Two_ways_to_integrate_Struts2_and_Spring.html struts2与spring集成时,关于Action类中成员bean自动注入的问题 http://1234jie.ok.blog.163.com/blog/static/774269932
Struts2动态代理生成action源码执行流程
动态代理生成action这部分源码,应该算是Struts2之中比较底层的代码了,在这里贴出源码的执行流程,仅供参考。核心过滤器StrutsPrepareAndExecuteFilter,在此只贴出doFilter()的代码 public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws
spring整合struts2时action里的service注入不进来,
spring整合struts2时action里的service注入不进来,有可能是spring和struts没有整合成功。 struts2和spring的两种整合方式 (1) 把Action配置在beans.xml里,利用Spring初始化Action的bean: 将Struts的业务逻辑控制器类配置在Spring的配置文件中,Action中引用的业务类一并注入。  (
Spring整合Structs2时,Action类中的成员变量(Bean)的注入
Action 中注入Spring 管理的BeanProductAction 是一个 Action,处理页面的请求,其中的save()方法使用到了业务层 ProductService对象,Spring 管理这个对象,所以涉及到 Action 中注入 Spring 管理的bean的问题。 记得导入spring整合structs2 的jar包 struts2-spring-plugin-2.3.31.
Struts2,action中用spring注入,启动服务时注入成功,action运行时对象又变成null了
在软件群中遇到一个求助者:  问各位大神一个问题,ssh框架里,action中用spring注入,启动服务时注入成功,action运行时对象又变成null了,这是怎么回事啊? 问题所在: 看了他的配置文件后发现他用spring的依赖注入,在applictionContext.xml配置了相关的bean,但是在struts2的文件中配置action时使用的是类的全路径,没有引用spring
struts2,spring整合中使用spring 管理struts2的action,springaop 常见问题
在整合过程中struts2的action有spring管理必须配置struts配置文件的一些属性如下 1              2 spring中action的默认scope 是singleton (单例) ,strtus2 中action为propotype (多例) 在项目中我使用了注解标记 用来实现日志的记录 1.         同一个切面中的通知的执行顺
SpringMVC的Controller和Struts2的Action的区别
SpringMVC的Controller和Struts2的Action 两者区别