`
atgoingguoat
  • 浏览: 195851 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

spring3注入学习

阅读更多

最近想学一下新东西,看到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学习笔记(6)----编码剖析Spring依赖注入的原理

    本篇学习笔记将深入剖析Spring依赖注入的原理,通过源码分析帮助我们理解这一核心机制。 首先,依赖注入允许我们解耦组件之间的关系,使得各个组件可以独立地进行开发、测试和维护。在Spring中,DI主要通过两种方式...

    spring学习:依赖注入的几种方式讨论

    在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本文将深入探讨Spring中的依赖注入实现方式,以及如何通过样例文件...

    Spring IOC Annotation 注入 学习实例

    学习Spring IOC Annotation注入,首先需要理解Bean的生命周期,包括初始化、使用和销毁的过程。然后,通过编写带有注解的类,创建Bean定义,并让Spring容器管理这些Bean。容器会在适当的时间调用`@PostConstruct`...

    详尽的Spring2.0学习提纲

    Spring 2.0是Java开发中的一个里程碑,它在企业级应用开发中扮演着至关重要的角色,特别是对于依赖注入(IoC)和面向切面编程(AOP)的支持。本学习提纲旨在为初学者提供一份详尽的Spring 2.0学习指南,帮助他们系统...

    Spring注入的方式

    在Java开发领域,Spring框架是应用最广泛的IoC(Inversion of Control)和DI(Dependency...通过学习和实践`example4forConstructor`和`example4forSetter`这两个示例,我们可以更好地理解和掌握这两种注入方式的使用。

    自己的代码模拟spring的依赖注入

    3. **构建IoC容器**:模拟Spring的IoC容器,我们需要一个类来存储和管理对象。这个类可以包含一个Map来保存对象,以及方法来注册和获取对象。 ```java public class SimpleIOCContainer { private Map, Object&gt; ...

    Struts2+Spring3+Hibernate3框架整合标签注入版

    综上所述,这个"Struts2+Spring3+Hibernate3框架整合标签注入版"是一个实用的学习资源,对于想要掌握Java Web开发的开发者来说,它提供了实际操作的机会,能够帮助理解如何在实际项目中整合和使用这些框架,提升开发...

    SpringSet方法注入

    我们学习了spring框架spring框架里面有3个优势第一个是轻量级的IOC也叫控制反转后来改名为DI也叫依赖注入,依赖注入里面有3中注入方法分别是set注入,构造器注入,注解注入,我传的是set注入的视频

    Spring学习笔记(8)----属性注入的方式

    本篇学习笔记主要探讨了Spring中的属性注入方式,包括了传统的XML配置注入、注解式注入以及使用Java配置类的方式。 一、XML配置注入 在Spring早期版本中,XML配置文件是定义Bean及其依赖关系的主要方式。属性注入...

    一个简单的spring依赖注入的例子

    3. **使用ApplicationContext**: Spring提供`ApplicationContext`接口,它是访问Bean的主要入口点。通过加载XML配置文件,我们可以获取到Bean实例并进行操作。 ```java ApplicationContext context = new ...

    Spring (bean怎样注入值)学习实例

    在Spring框架中,Bean的注入是其核心特性之一,它允许开发者通过声明式的方式管理对象的依赖关系。本文将深入探讨如何在Spring中通过XML配置文件对Bean进行值的注入,包括List、Set和Map等集合类型的注入。 首先,...

    Spring.net(依赖注入应用)

    压缩包文件`SpringNet_Lesson6`可能包含一系列教程或示例代码,用于帮助学习Spring.NET的依赖注入和实际应用。建议结合这个资源,通过实践进一步理解Spring.NET的功能和使用方法。 总结来说,Spring.NET 是一个强大...

    (转)Spring 3.0 注解注入详解

    为了更深入地学习Spring 3.0的注解注入,你可以阅读提供的文档`Spring 3注解注入.docx`,它应该包含了详细的示例和解释,帮助你更好地理解和掌握这一重要特性。通过熟练运用注解注入,可以显著提升代码的可读性和可...

    Spring Ioc(依赖注入)入门例子--属性注入

    通过阅读这些源码,我们可以学习如何定义bean,声明依赖,以及如何让Spring容器根据配置来创建和管理对象。 总的来说,掌握Spring的IoC和DI是成为一名熟练的Java开发者必备的技能。理解并应用这些概念可以显著提高...

    spring3教程

    通过《跟开涛学spring3》系列文档,读者可以逐步学习到Spring3的这些核心概念,从基础到进阶,深入理解Spring3框架的精髓。每个章节都详细讲解了相关知识点,包括理论介绍、代码示例和实战指导,是学习Spring3的宝贵...

    spring3框架 spring3框架

    Spring3作为其较早的一个版本,尽管已经被后续的新版本所取代,但它仍然是许多项目的基础,学习Spring3可以帮助我们理解Spring框架的核心原理和发展历程。 Spring框架的核心特性包括依赖注入(Dependency Injection...

    Spring学习笔记&源码

    本资料“Spring学习笔记&源码”是基于网易云课堂黑马程序员的Spring四天精通课程,旨在帮助学习者深入理解和实践Spring框架。 笔记部分可能会涵盖以下内容: 1. **Spring概述**:介绍Spring框架的历史、特点和主要...

    Spring的配置以及事件注入

    Spring框架是Java开发中不可或缺的一部分,它以其强大的依赖注入(DI)和面向切面编程(AOP)功能而闻名。本篇文章将深入探讨Spring的配置和事件注入机制,帮助开发者更好地理解和利用这些特性。 首先,让我们关注...

    spring依赖注入基础知识.rar

    3. 接口注入:Spring提供了ApplicationContextAware接口,通过实现该接口并注入ApplicationContext,可以在运行时获取到任何需要的bean。 ```java public class MyClass implements ApplicationContextAware { ...

    Spring学习指南

    综上所述,文档中提到的Spring学习指南为开发者提供了一个全面了解和掌握Spring框架的途径,通过阅读和实践可以深入理解依赖注入、面向切面编程、SpringMVC以及如何在实际项目中应用这些技术。同时,文档强调了开源...

Global site tag (gtag.js) - Google Analytics