转载地址:http://www.2cto.com/kf/201206/137492.html
struts和spring整合首先要在Web容器启动的时候自动装配ApplicationContext的配置信息,可想而知应该在web.xml做相应的配置:
[html]
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
配置了org.springframework.web.context.ContextLoaderListener后我们就不惜要编写代码显示地实例
化ApplicationContext对象了。至于为什么要使用监听是因为web.xml 的加载顺序是:context-param ->
listener -> filter -> servlet
。如果你是在不想使用监听,或许你可以尝试下继承struts2的
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter重写这
个它的init方法在StrutsPrepareAndExecuteFilter过滤器init中实例化ApplicationContext对象加载
配置信息,虽然这种方法也可行,但是当拦截每个action都会加载一次配置信息,重新实例化了一个新的web容器,不仅浪费了资源也让spring更加
依赖了struts。
1、使用xml方式:
struts2配置
<package name="user" extends="struts-default">
<action name="login" class="userAction">
<result name="success">/success.jsp
</result>
<result name="input" type="redirect">/index.jsp</result>
</action>
</package>
spring配置
<bean id="userDao" class="org.han.dao.impl.UserDaoImpl" />
<bean id="biz" class="org.han.service.impl.LoginBizImpl">
<property name="userdao" ref="userDao"/>
</bean>
<bean id="userAction" class="org.han.action.LoginAction" scope="prototype" >
<property name="biz" ref="biz" />
</bean>
注意红色部分,struts2的action class与对应的action bean必须相同,这样才能由spring管理action;
2、struts2使用零配置方式:
当你导入了零配置插件包的时候千万要注意约定大于配置,还是上面的spring配置,只是不需要struts2配置了。
第一种方式:只需要将Action的className对应到spring配置中的bean id就行了
@Action(value = "/login", results = { @Result(name = "success", location
=
"/success.jsp"),@Result(name="input",location="/index.jsp")},className="userAction")
public String login() throws Exception {
// TODO Auto-generated method stub
User u=biz.login(this.getUser());
if(u!=null){
return SUCCESS;
}
return INPUT;
}
第二种方式:
Action注解不需要className了,将spring配置稍作修改
<bean id="org.han.action.LoginAction" class="org.han.action.LoginAction" scope="prototype" >
<property name="biz" ref="biz" />
</bean>
这样可以是因为当你使用零配置的时候,action的class默认是当前类的全类名,所以和spring整合的时候刚好使用全类名在spring配置中查找以全类名为id的bean。
3、struts2、spring都使用注解方式:
www.2cto.com
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="org.han.dao.impl,org.han.service.impl,org.han.action"/>
</beans>
<context:component-scan
base-package=""/>用此种方式,不需要在配置文件中再配置bean,也不需要再导入上面对应的处理bean。也就是说可以不需要在
配置文件中使用<context:annotation-config/>了,因为此种方式会自动导入
[java]
@Namespace("/")
@Component(value="userLogin")
@Scope(value="prototype")
public class LoginAction extends ActionSupport {
public LoginAction() {
super();
// TODO Auto-generated constructor stub
System.out.println("action:"+this.hashCode());
}
@Autowired
private ILoginBiz biz;
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Autowired
public void setBiz(ILoginBiz biz) {
this.biz = biz;
}
@Override
@Action(value = "hello", results = { @Result(name = "success",
location =
"/success.jsp"),@Result(name="input",location="/index.jsp")})
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println("biz:"+this.biz.hashCode());
User u=biz.login(this.getUser());
if(u!=null){
return SUCCESS;
}
return INPUT;
}
}
@Component 有一个可选的入参,用于指定 Bean 的名称。一般情况下,Bean 都是 singleton 的,需要注入 Bean
的地方仅需要通过 byType 策略就可以自动注入了,所以大可不必指定 Bean 的名称。除了提供 @Component
注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository、@Service 和 @Controller。在目前的 Spring
版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层、业务层和控制层(Web
层)相对应。虽然目前这 3 个注释和 @Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能。所以,如果
Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用 @Repository、@Service 和
@Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释。
@Scope用于定义Bean的作用范围。
@Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。当 Spring
容器启动时,AutowiredAnnotationBeanPostProcessor 将扫描 Spring 容器中所有 Bean,当发现
Bean 中拥有 @Autowired 注释时就找到和其匹配(默认按类型匹配)的 Bean,并注入到对应的地方中去。所以对成员变量使用
@Autowired 后,您大可将它们的 setter 方法删除。
@Qualifier(“name”) 中的 name是 Bean 的名称,所以 @Autowired 和 @Qualifier
结合使用时,自动注入的策略就从 byType 转变成 byName 了。@Autowired 可以对成员变量、方法以及构造函数进行注释,而
@Qualifier 的标注对象是成员变量、方法入参、构造函数入参。
@PostConstruct 和 @PreDestroy:JSR-250
为初始化之后/销毁之前方法的指定定义了两个注释类,这两个注释只能应用于方法上。标注了 @PostConstruct
注释的方法将在类实例化后调用,而标注了 @PreDestroy 的方法将在类销毁之前调用。
通过 <bean> 元素的 init-method/destroy-method 属性进行配置,都只能为 Bean 指定一个初始化 /
销毁的方法。但是使用 @PostConstruct 和 @PreDestroy 注释却可以指定多个初始化 / 销毁方法,那些被标注
@PostConstruct 或@PreDestroy 注释的方法都会在初始化 / 销毁时被执行。
更多的关于注解使用:请看官方文档
4、总结:
1、注释配置不一定在先天上优于 XML 配置。如果 Bean 的依赖关系是固定的,(如 Service 使用了哪几个 DAO
类),这种配置信息不会在部署时发生调整,那么注释配置优于 XML 配置;反之如果这种依赖关系会在部署时发生调整,XML
配置显然又优于注释配置,因为注释是对 Java 源代码的调整,您需要重新改写源代码并重新编译才可以实施调整。
2、如果 Bean 不是自己编写的类(如 JdbcTemplate、SessionFactoryBean 等),注释配置将无法实施,此时 XML 配置是唯一可用的方式。
3、注释配置往往是类级别的,而 XML 配置则可以表现得更加灵活。比如相比于 @Transaction 事务注释,使用 aop/tx 命名空间的事务配置更加灵活和简单。
所以在实现应用中,我们往往需要同时使用注释配置和 XML
配置,对于类级别且不会发生变动的配置可以优先考虑注释配置;而对于那些第三方类以及容易发生调整的配置则应优先考虑使用 XML 配置。Spring
会在具体实施 Bean 创建和 Bean 注入之前将这两种配置方式的元信息融合在一起。
分享到:
相关推荐
Struts2整合Spring和JPA是企业级Java应用开发中常见的技术组合,它们分别负责不同的职责:Struts2作为一款成熟的MVC框架,主要用于处理Web层的请求与响应;Spring作为一个全面的轻量级框架,提供了依赖注入(DI)和...
需在`struts.xml`中添加`<constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory"/>`来启用Spring插件,并且可能需要配置扫描注解的路径。 - **Action注解**:Action...
这个"struts2.1.6 + hibernate3.1 + spring2.5"的整合案例主要展示了如何在不使用大量XML配置的情况下,通过注解来简化集成过程。以下是相关的知识点: 1. **Struts2框架**:Struts2提供了Action、Result和...
这样,每次请求时,Struts2会从Spring容器中获取Action实例,而不是使用默认的实例化方式。 4. **Action类的配置**:Action类需要实现Spring的`org.springframework.stereotype.Component`注解,以便Spring能识别并...
Struts2和MyBatis的配置信息通常会整合到Spring的配置文件中,以实现整体的统一管理和控制。 项目结构通常如下: - src/main/java:存放业务逻辑类、DAO接口及实现、Struts2 Action类。 - src/main/resources:存放...
3. **配置文件**:整合Struts2和Spring需要修改两部分配置,即Struts2的配置文件(struts.xml)和Spring的配置文件(如applicationContext.xml)。在struts.xml中,我们需要配置一个`<package>`来指定Action的执行...
Struts2的配置文件(struts.xml)定义Action和结果,Hibernate的配置文件(hibernate.cfg.xml)设置数据库连接,Spring的配置文件(applicationContext.xml)管理bean。这些配置文件需要正确地互相引用,以确保框架...
4. **Action 类**:Action 类通常作为 Struts2 处理请求的入口,它可以从 Spring 容器中注入所需的依赖。通过在 Action 类上使用 `@Component` 注解并配置在 Spring 配置文件中,可以确保 Spring 能够创建和管理这些...
Struts2 整合 Spring 是一个常见的 Java Web 开发中的集成技术,主要目的是利用 Spring 提供的依赖注入(Dependency Injection, DI)和控制反转(Inversion of Control, IoC)来管理 Struts2 中的 Action 类,使得...
Spring以其强大的依赖注入(DI)和面向切面编程(AOP)能力,而Struts2则以其优秀的MVC设计模式著称,两者整合可以构建出高效、可维护的Web应用。下面将详细介绍Spring与Struts2整合的相关知识点。 **一、整合背景*...
4. **整合Struts2和Spring**:使用Struts2的Spring插件,将Spring管理的Bean注入到Struts2的Action中,通常通过`<struts-plugin>`标签进行配置。 5. **配置Struts2**:创建Struts2的配置文件(struts.xml),定义...
- **struts2-spring-plugin.jar**:用于Struts2与Spring的整合,提供Action类的依赖注入功能。 - **struts2-tiles-plugin.jar**:集成Tiles布局框架,方便页面的组织和复用。 - **struts2-json-plugin.jar**:...
总的来说,"struts2+spring+mybatis+easyui"的实现是一个标准的Java Web项目结构,它利用Maven进行构建管理,通过整合四个组件,实现了后端的业务逻辑处理、数据访问和前端的用户界面展示。这种架构在实际开发中具有...
6. **整合三者**:在Struts2的Action配置中,使用Spring插件将Action实例从Spring容器中获取。 7. **测试**:编写JUnit测试用例,验证整合是否成功。 **最佳实践** - 使用注解来减少XML配置,提高代码可读性。 - ...
Struts2 和 Spring 的整合是Java Web开发中常见的技术组合,尤其在企业级应用中,它们的集成可以实现更高效、灵活的控制层和业务层交互。"s2sh" 是 Struts2、Spring 和 Hibernate 的简称,这里我们只讨论 Struts2 和...
7. **拦截器配置**:在struts.xml中配置Spring拦截器,使Spring管理的Action类可以在Struts2框架中正常工作。 8. **运行测试**:完成上述配置后,可以通过一个简单的登录或注册功能来测试整合是否成功。如果一切...
【轻量级Java_EE企业应用实战_Struts2_Spring3_Hibernate整合开发】这个主题主要涉及的是Java EE领域中的三大框架——Struts2、Spring3和Hibernate的集成应用,这是构建现代Java后端系统的一种常见方式。这些框架...
在Struts2+Spring+MyBatis的架构中,MyBatis负责与数据库交互,通过XML或注解方式配置SQL语句,使得数据库操作更加灵活且易于维护。 **整合过程** 1. **配置Spring**:创建Spring配置文件,定义Bean,包括Action、...
1. 配置环境:首先需要在项目中引入Struts2、Hibernate和Spring的相应库,并配置相应的XML配置文件,如struts.xml、hibernate.cfg.xml、spring-context.xml等。 2. 创建模型:定义Java实体类,这些类对应数据库中的...
整合Spring和Struts 2的主要目的是将Spring的依赖注入和管理能力引入到Struts 2的Action中,以及利用Spring的AOP进行事务管理。整合步骤通常包括以下几个部分: 1. **添加依赖**:在项目中引入Spring和Struts 2的库...