最近想学一下新东西,看到spring3,struts2,ibatis3都出来了,以前也不怎么了解,今天在网上看了点东西,发给“自己”以后学习吧。
先了解下 spring 注入:
Spring有3种注入,接口注入,构造子注入,设值注入
Type1 接口注入
我们常常借助接口来将调用者与实现者分离。如:
public class ClassA {
private InterfaceB clzB;
public init() {
Ojbect obj =
Class.forName(Config.BImplementation).newInstance();
clzB = (InterfaceB)obj;
}
……
}
上面的代码中,ClassA依赖于InterfaceB的实现,如何获得InterfaceB实现类的实例?传统的方法是在代码中创建InterfaceB实现类的实例,并将起赋予clzB。而这样一来,ClassA在编译期即依赖于InterfaceB的实现。为了将调用者与实现者在编译期分离,于是有了上面的代码,我们根据预先在配置文件中设定的实现类的类名,动态加载实现类,并通过InterfaceB强制转型后为ClassA所用。
这就是接口注入的一个最原始的雏形。
而对于一个Type1型IOC容器而言,加载接口实现并创建其实例的工作由容器完成,如J2EE开发中常用的Context.lookup(ServletContext.getXXX),都是Type1型IOC的表现形式。Apache Avalon是一个典型的Type1型IOC容器。
Type2 构造子注入
构造子注入,即通过构造函数完成依赖关系的设定,如:
public class DIByConstructor
{
private final DataSource dataSource;
private final String message;
public DIByConstructor(DataSource ds, String msg)
{
this.dataSource = ds;
this.message = msg;
}
……
}
可以看到,在Type2类型的依赖注入机制中,依赖关系是通过类构造函数建立,容器通过调用类的构造方法,将其所需的依赖关系注入其中。PicoContainer(另一种实现了依赖注入模式的轻量级容器)首先实现了Type2类型的依赖注入模式。
Type3 设值注入
在各种类型的依赖注入模式中,设值注入模式在实际开发中得到了最广泛的应用(其中很大一部分得力于Spring框架的影响)。
在笔者看来,基于设置模式的依赖注入机制更加直观、也更加自然。Quick Start中的示例,就是典型的设置注入,即通过类的setter方法完成依赖关系的设置。
几种依赖注入模式的对比总结
接口注入模式因为具备侵入性,它要求组件必须与特定的接口相关联,因此并不被看好,实际使用有限。Type2和Type3的依赖注入实现模式均具备无侵入性的特点。
Type3 设值注入的优势
1、对于习惯了传统JavaBean开发的程序员而言,通过setter方法设定依赖关系显得更加直观,更加自然。
2、如果依赖关系(或继承关系)较为复杂,那么Type2模式的构造函数也会相当庞大(我们需要在构造函数中设定所有依赖关系),此时Type3模式往往更为简洁。
我的理解:依赖关系(或继承关系)较为复杂,指的是,属性较多,需要写很多的set和get方法。
3、对于某些第三方类库而言,可能要求我们的组件必须提供一个默认的构造函数(如Struts中的Action),此时Type2类型的依赖注入机制就体现出其局限性,难以完成我们期望的功能。
可见,Type2和Type3模式各有千秋,而Spring、PicoContainer都对Type2和Type3类型的依赖注入机制提供了良好支持。这也就为我们提供了更多的选择余地。理论上,以Type2类型为主,辅之以Type3类型机制作为补充,可以达到最好的依赖注入效果,不过对于基于Spring Framework开发的应用而言,Type3使用更加广泛。
给个简单的例子:
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: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" default-autowire="byName" default-lazy-init="false">
<!-- component-scan自动搜索@Component , @Controller , @Service , @Repository等标注的类 -->
<!-- 默认值如果适合,该项可以不用修改 -->
<context:component-scan base-package="com.**.service.impl" />
</beans>
服务实现类:
package com.mylink.mipbs.service.impl;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import javacommon.base.*;
import javacommon.util.*;
import cn.org.rapid_framework.util.*;
import cn.org.rapid_framework.web.util.*;
import cn.org.rapid_framework.page.*;
import cn.org.rapid_framework.page.impl.*;
import com.mylink.mipbs.model.*;
import com.mylink.mipbs.dao.*;
import com.mylink.mipbs.service.impl.*;
import com.mylink.mipbs.service.*;
//加上注解,供其它地方调用。
@Component("permissionManager")
@Transactional
public class PermissionManagerImpl extends BaseManager<Permission,java.lang.Integer>
implements PermissionManager {
private PermissionDao permissionDao;
/**增加setXXXX()方法,spring就可以通过autowire自动设置对象属性*/
public void setPermissionDao(PermissionDao dao) {
this.permissionDao = dao;
}
public EntityDao getEntityDao() {
return this.permissionDao;
}
@Transactional(readOnly=true)
public Page findByPageRequest(PageRequest pr) {
return permissionDao.findByPageRequest(pr);
}
}
事件类调用:
package com.mylink.mipbs.action;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javacommon.util.extjs.ExtJsPageHelper;
import javacommon.util.extjs.ListRange;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang.StringUtils;
import cn.org.rapid_framework.page.Page;
import cn.org.rapid_framework.page.PageRequest;
import com.mylink.mipbs.model.Permission;
import com.opensymphony.xwork2.Preparable;
import com.opensymphony.xwork2.ModelDriven;
import static javacommon.util.extjs.Struts2JsonHelper.*;
import java.util.*;
import javacommon.base.*;
import javacommon.util.*;
import cn.org.rapid_framework.util.*;
import cn.org.rapid_framework.web.util.*;
import cn.org.rapid_framework.page.*;
import cn.org.rapid_framework.page.impl.*;
import com.mylink.mipbs.model.*;
import com.mylink.mipbs.dao.*;
import com.mylink.mipbs.service.impl.*;
import com.mylink.mipbs.service.*;
public class PermissionAction extends BaseStruts2Action implements Preparable,ModelDriven{
//默认多列排序,example: username desc,createTime asc
protected static final String DEFAULT_SORT_COLUMNS = null;
//forward paths
protected static final String QUERY_JSP = "/pages/Permission/query.jsp";
protected static final String LIST_JSP= "/pages/Permission/list.jsp";
protected static final String CREATE_JSP = "/pages/Permission/create.jsp";
protected static final String EDIT_JSP = "/pages/Permission/edit.jsp";
protected static final String SHOW_JSP = "/pages/Permission/show.jsp";
//redirect paths,startWith: !
protected static final String LIST_ACTION = "!/pages/Permission/list.do";
private PermissionManager permissionManager;
private Permission permission;
java.lang.Integer id = null;
private String[] items;
public void prepare() throws Exception {
if (isNullOrEmptyString(id)) {
permission = new Permission();
} else {
permission = (Permission)permissionManager.getById(id);
}
}
/** 通过spring自动注入 */
public void setPermissionManager(PermissionManager manager) {
this.permissionManager = manager;
}
public Object getModel() {
return permission;
}
public void setId(java.lang.Integer val) {
this.id = val;
}
public void setItems(String[] items) {
this.items = items;
}
/**
* ExtGrid使用
* 列表
* @throws IOException
*/
public void extlist() throws IOException
{
PageRequest<Map> pr = ExtJsPageHelper.createPageRequestForExtJs(getRequest(), DEFAULT_SORT_COLUMNS);
Page page = permissionManager.findByPageRequest(pr);
List<Permission> Permissionlist = (List) page.getResult();
ListRange<Permission> resultList = new ListRange<Permission>();
resultList.setList(Permissionlist);
resultList.setTotalSize(page.getTotalCount());
resultList.setMessage("ok");
resultList.setSuccess(true);
outJson(resultList);
}
/**
* extGrid保存
* @throws IOException
*/
public void extsave() throws IOException
{
Map<String, Object> result = new HashMap<String, Object>();
try
{
permissionManager.save(permission);
result.put("success", true);
result.put("msg", "添 加 成 功!");
}
catch (Exception e)
{
result.put("failure", true);
result.put("msg", e.getMessage());
e.printStackTrace();
}
outJson(result);
}
/**
* extGrid修改
* @throws IOException
*/
public void extupdate() throws IOException
{
Map<String, Object> result = new HashMap<String, Object>();
try
{
permissionManager.update(permission);
result.put("success", true);
result.put("msg", "修 改 成 功!");
}
catch (Exception e)
{
result.put("failure", true);
result.put("msg", e.getMessage());
e.printStackTrace();
}
outJson(result);
}
/**
* extGrid删除
* @throws IOException
*/
public void extdelete() throws IOException
{
String ids = getRequest().getParameter("ids");
String[] idarray = ids.split(",");
Map<String, Object> result = new HashMap<String, Object>();
try
{
for (int i = 0; i < idarray.length; i++)
{
java.lang.Integer id = new java.lang.Integer((String)idarray[i]);
permissionManager.removeById(id);
}
result.put("success", true);
result.put("msg", "删除成功");
}
catch (Exception e)
{
result.put("failure", true);
result.put("msg", e.getMessage());
e.printStackTrace();
}
outJson(result);
}
}
分享到:
相关推荐
spring依赖注入底层详解,很不错的资源,欢迎大家来下载学习。
Spring IOC Annotation 注入 学习实例
原创的哦,希望能对spring学习者有所帮助
主要给大家介绍了关于spring boot中几种注入方法的一些个人看法,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
我们学习了spring框架spring框架里面有3个优势第一个是轻量级的IOC也叫控制反转后来改名为DI也叫依赖注入,依赖注入里面有3中注入方法分别是set注入,构造器注入,注解注入,我传的是set注入的视频
关于spring-工厂注入的实例代码,可以下载学习
NULL 博文链接:https://shmilyaw-hotmail-com.iteye.com/blog/2169569
NULL 博文链接:https://coolszy.iteye.com/blog/512193
实例主要讲述了,Spring的Xml(list,set,map)怎样进行注入值
Spring2.5注入学习配置的写法和案例
对spring依赖注入原理进行了详细说明和解析,过程详实,思路清晰,便于新手理解和学习spring依赖注入的核心要义。
《Spring技术内幕》学习笔记3——IoC容器载入Bean定义资源文件 《Spring技术内幕》学习笔记4——IoC容器解析Bean定义资源并注册解析后的Bean 《Spring技术内幕》学习笔记5——IoC容器的依赖注入 《Spring技术内幕...
本文是我在业余时间学习spring注解注入之后的整理总结,希望能给对spring注入技术感兴趣和正在学习spring注入的同学们一些帮助。文中的内容都是我自己的摸索总结,当中难免会有偏差和错误,希望spring达人能够及时...
本章学习目标 Spring 框架简介 SpringIOC 的概念和作用 工厂模式设计一个简单的IOC 容器 ... SpringIOC 的XML 方式依赖注入 SpringIOC 的注解方式 Spring 整合Junit 简化测试类编写
本文是我在业余时间学习spring注解注入之后的整理总结,希望能给对spring注入技术感兴趣和正在学习spring注入的同学们一些帮助。文中的内容都是我自己的摸索总结,当中难免会有偏差和错误,希望spring达人能够及时...
Spring 学习笔记《依赖注入》源文件。https://blog.csdn.net/jx520/article/details/86549841
spring依赖注入基础知识,适合新手学习浏览,用idea环境搭建,数据库需要自己修改
spring2.5学习PPT 传智博客 01_全面阐释Spring及其各项功能 02_搭建与测试Spring的开发环境 03_编码剖析Spring管理Bean的原理 04_Spring的三种实例化Bean的方式 05_配置Spring管理的bean的作用域 06_Spring...
主要介绍了SPRING IOC注入方式过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
struts与hibernate集成原理,基础知识补充AOP,编程式事务,声明式事务,spring注入学习笔记