8 -- 深入使用Spring -- 7...4 使用自动装配
8.7.4 使用自动装配
在自动装配策略下,Action还是由Spring插件创建,Spring 插件在创建Action实例时,利用Spring的自动装配策略,将对应的业务逻辑组件注入Action实例中。这种整合策略的配置文件简单,但控制器和业务逻辑组件耦合又提升到了代码层次,耦合较高。
如果不指定自动装配,则系统默认使用按byName自动装配。前面的整合策略并没有指定任何自动装配策略。
所谓自动装配,即让Spring自动管理Bean与Bean之间的依赖关系,无须使用ref显示指定依赖Bean。Spring容器会自动检查XML配置文件的内容,为主调Bean注入依赖Bean。自动装配可以减少配置文件的工作量,但会降低依赖关系的透明性和清晰性。
通过使用自动装配,可以让Spring插件自动将业务逻辑组件注入Struts 2 的Action实例中。
通过设置struts.objectFactory.spring.autoWire常量可以改变Spring插件的自动装配策略,该常量可以接受如下几个值:
⊙ name : 使用byName自动装配。
⊙ type : 使用byType自动装配。
⊙ auto : Spring插件会自动检测需要使用那种自动装配方式。
⊙ constructor : 与type类似,区别是constructor使用构造器来构造注入所需的参数,而不是使用设值注入方式。
如果使用按byName来完成自动装配,则无须设置任何Struts 2 常量。
在这种整合策略下,还采用传统的方式来配置Struts 2 的Action,配置Action时一样指定具体的实现类。
因为使用了自动装配,Spring插件创建Action实例时,是根据配置Action的class 属性指定实现类来创建Action实例的。
XML : Struts 2
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 指定Struts 2 配置文件的DTD信息 -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd"> <!-- Struts 2 配置文件的根元素 -->
<struts>
<!-- 配置了一系列常量 -->
<constant name="struts.i18n.encoding" value="UTF-8"/>
<constant name="struts.devMode" value="true"/>
<constant name="struts.enable.DynamicMethodInvocation" value="false"/> <package name="edu.pri.lime.account.act" extends="struts-default">
<!-- 定义处理用户请求的Action,该Action的class属性不是实际处理类,而是Spring容器中的Bean实例的ID -->
<action name="login" class="edu.pri.lime.account.act.LoginAction">
<!-- 为两个逻辑视图配置页面 -->
<result name="error">/WEB-INF/content/error.jsp</result>
<result name="success">/WEB-INF/content/welcome.jsp</result>
</action>
<!-- 让用户直接访问该应用时列出所有的视图页面 -->
<action name="*">
<result>/WEB-INF/content/{1}.jsp</result>
</action>
</package>
</struts>
Class : LoginAction
package edu.pri.lime.account.act; import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport; import edu.pri.lime.account.service.MyService; public class LoginAction extends ActionSupport{ /**
*
*/
private static final long serialVersionUID = 1L; // 封装用户请求参数的两个成员变量
private String username;
private String password; // 系统所用的业务逻辑组件
private MyService ms;
// 设置注入业务逻辑组件所必需的setter方法
public void setMs(MyService ms){
this.ms = ms;
}
// 处理用户请求的execute方法
public String execute() throws Exception{
// 调用业务逻辑组件的validLogin()方法
// 验证用户名和密码
if(ms.validLogin(getUsername(),getPassword()) > 0){
addActionMessage("Congratulation!,Integer Succeed !");
return Action.SUCCESS;
}
return Action.ERROR;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
} }
XML : applicationContext
<?xml version="1.0" encoding="UTF-8"?>
<!-- Spring 配置文件的根元素,使用Spring-beans-4.0.xsd语义约束 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- 部署一个业务逻辑组件 -->
<bean id="ms" class="edu.pri.lime.account.service.impl.MyServiceImpl"/> </beans>
Action所需的业务逻辑组件的id必须为ms,因此配置业务逻辑组件时,必须指定其id属性为ms。
在这种整合策略下,Spring插件负责为Action自动装配业务逻辑组件,从而可以简化配置文件的配置。
这种方式也存在如下两个缺点:
⊙ Action与业务逻辑组件的耦合降低到代码层次,必须在配置文件中配置与Action所需控制器同名的业务逻辑组件。这不利于高层次解耦。
⊙ Action 接收Spring容器的自动装配,代码的可读性较差。
啦啦啦
啦啦啦
啦啦啦
8 -- 深入使用Spring -- 7...4 使用自动装配的更多相关文章
- [原创]java WEB学习笔记99:Spring学习---Spring Bean配置:自动装配,配置bean之间的关系(继承/依赖),bean的作用域(singleton,prototype,web环境作用域),使用外部属性文件
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Spring学习(六)-----Spring使用@Autowired注解自动装配
Spring使用@Autowired注解自动装配 在上一篇 Spring学习(三)-----Spring自动装配Beans示例中,它会匹配当前Spring容器任何bean的属性自动装配.在大多数情况下 ...
- spring(4)——自动装配
set注入和构造注入有时在做配置时比较麻烦.所以框架为了提高开发效率,提供自动装配功能,简化配置.spring框架式默认不支持自动装配的,要想使用自动装配需要修改spring配置文件中<bean ...
- Spring@Autowired注解与自动装配
1 配置文件的方法 我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法. Boss ...
- 【转】Spring@Autowired注解与自动装配
1 配置文件的方法 我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法. Boss ...
- Spring@Autowired注解与自动装配(转发)
1 配置文件的方法 我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法. Boss ...
- Spring基于的注解自动装配和依赖注入(***)
#自动装配的小Demo: package com.gyf.annotation; //DAO层 public interface UserDao { public void save(); } pac ...
- Spring第八发—自动装配及让Spring自动扫描和管理Bean
依赖注入–自动装配依赖对象(了解即可) 对于自动装配,大家了解一下就可以了,实在不推荐大家使用.例子: byName:按名称装配,可以根据属性的名称,在容器中寻找跟该属性名相同的bean,如果没有找到 ...
- Spring实战之处理自动装配的歧义性
仅有一个bean匹配所需的结果时,自动装配才是有效的.如果不仅有一个bean能够匹配结果的话,这种歧义性会阻碍Spring自动装配属性.构造器参数或方法参数.为了阐述自动装配的歧义性,假设我们使用@A ...
随机推荐
- WmS具体解释(二)之怎样理解Window和窗体的关系?基于Android7.0源代码
上篇博客(WmS具体解释(一)之token究竟是什么?基于Android7.0源代码)中我们简要介绍了token的作用,这里涉及到的概念非常多,当中出现频率最高的要数Window和窗体这一对搭档了,那 ...
- Qt封装QTcpServer参考资料--QT4中构建多线程的服务器
首先说一下对多线程这个名词的理解过程.以前听说过很多次多线程这个词,而且往往与服务器联系起来,因此一直把多线程误解为服务器特有的功能:直到这次课程设计,仔细学习了一下多线程的机制,才知道真正的意思.简 ...
- Linux之查看切换Shell
1.查看存在的shell cat /etc/shells 2.查看使用的shell echo $SHELL 3.切换shell 切换bash chsh -s /bin/bash 切换zsh chsh ...
- tensorflow的升级与版本管理
1 查看cuda与cudnn的版本 cuda一般安装在 /usr/local/cuda/ 路径下,该路径下有一个version.txt文档,里面记录了cuda的版本信息 cat /usr/local ...
- Linux_iptables
Linux:网络防火墙 netfilter:Frame iptables: 生成防火墙规则,并附加到netfilter上实现数据报文过滤 NAT mangle等规则生成的工具 TCP有限状态机 LIS ...
- 【转】【WPF】WPF绑定用法
一.简介 为了后面行文顺利,在进入正文之前,我们首先对本文所涉及到的绑定知识进行简单地介绍.该节包含绑定的基本组成以及构建方式. WPF中的绑定完成了绑定源和绑定目标的联动.一个绑定常常由四部分组成: ...
- nodemon是个好东西
不说话,直接上图: 安装 使用
- Solr系列二:solr-部署详解(solr两种部署模式介绍、独立服务器模式详解、SolrCloud分布式集群模式详解)
一.solr两种部署模式介绍 Standalone Server 独立服务器模式:适用于数据规模不大的场景 SolrCloud 分布式集群模式:适用于数据规模大,高可靠.高可用.高并发的场景 二.独 ...
- Git -- 相关命令
git init : 将当前目录变成Git可以管理的仓库 git add :告诉Git,把文件添加到仓库 git commit -m "" :把文件提交到仓库 git status ...
- C#中按模板操作Word —— 如何向Word中插入图片
一.Word对象模型的重叠性分析 本文主要介绍通过书签Bookmark向Word文档中插入图片的方法.在此之前我们先简单讨论下Word对象模型的重叠性.如果你对Word对象模型还不熟悉,请参考本专栏第 ...