最近想学一下新东西,看到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中,DI主要通过两种方式...
在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本文将深入探讨Spring中的依赖注入实现方式,以及如何通过样例文件...
学习Spring IOC Annotation注入,首先需要理解Bean的生命周期,包括初始化、使用和销毁的过程。然后,通过编写带有注解的类,创建Bean定义,并让Spring容器管理这些Bean。容器会在适当的时间调用`@PostConstruct`...
Spring 2.0是Java开发中的一个里程碑,它在企业级应用开发中扮演着至关重要的角色,特别是对于依赖注入(IoC)和面向切面编程(AOP)的支持。本学习提纲旨在为初学者提供一份详尽的Spring 2.0学习指南,帮助他们系统...
在Java开发领域,Spring框架是应用最广泛的IoC(Inversion of Control)和DI(Dependency...通过学习和实践`example4forConstructor`和`example4forSetter`这两个示例,我们可以更好地理解和掌握这两种注入方式的使用。
3. **构建IoC容器**:模拟Spring的IoC容器,我们需要一个类来存储和管理对象。这个类可以包含一个Map来保存对象,以及方法来注册和获取对象。 ```java public class SimpleIOCContainer { private Map, Object> ...
综上所述,这个"Struts2+Spring3+Hibernate3框架整合标签注入版"是一个实用的学习资源,对于想要掌握Java Web开发的开发者来说,它提供了实际操作的机会,能够帮助理解如何在实际项目中整合和使用这些框架,提升开发...
我们学习了spring框架spring框架里面有3个优势第一个是轻量级的IOC也叫控制反转后来改名为DI也叫依赖注入,依赖注入里面有3中注入方法分别是set注入,构造器注入,注解注入,我传的是set注入的视频
本篇学习笔记主要探讨了Spring中的属性注入方式,包括了传统的XML配置注入、注解式注入以及使用Java配置类的方式。 一、XML配置注入 在Spring早期版本中,XML配置文件是定义Bean及其依赖关系的主要方式。属性注入...
3. **使用ApplicationContext**: Spring提供`ApplicationContext`接口,它是访问Bean的主要入口点。通过加载XML配置文件,我们可以获取到Bean实例并进行操作。 ```java ApplicationContext context = new ...
在Spring框架中,Bean的注入是其核心特性之一,它允许开发者通过声明式的方式管理对象的依赖关系。本文将深入探讨如何在Spring中通过XML配置文件对Bean进行值的注入,包括List、Set和Map等集合类型的注入。 首先,...
压缩包文件`SpringNet_Lesson6`可能包含一系列教程或示例代码,用于帮助学习Spring.NET的依赖注入和实际应用。建议结合这个资源,通过实践进一步理解Spring.NET的功能和使用方法。 总结来说,Spring.NET 是一个强大...
为了更深入地学习Spring 3.0的注解注入,你可以阅读提供的文档`Spring 3注解注入.docx`,它应该包含了详细的示例和解释,帮助你更好地理解和掌握这一重要特性。通过熟练运用注解注入,可以显著提升代码的可读性和可...
通过阅读这些源码,我们可以学习如何定义bean,声明依赖,以及如何让Spring容器根据配置来创建和管理对象。 总的来说,掌握Spring的IoC和DI是成为一名熟练的Java开发者必备的技能。理解并应用这些概念可以显著提高...
通过《跟开涛学spring3》系列文档,读者可以逐步学习到Spring3的这些核心概念,从基础到进阶,深入理解Spring3框架的精髓。每个章节都详细讲解了相关知识点,包括理论介绍、代码示例和实战指导,是学习Spring3的宝贵...
Spring3作为其较早的一个版本,尽管已经被后续的新版本所取代,但它仍然是许多项目的基础,学习Spring3可以帮助我们理解Spring框架的核心原理和发展历程。 Spring框架的核心特性包括依赖注入(Dependency Injection...
本资料“Spring学习笔记&源码”是基于网易云课堂黑马程序员的Spring四天精通课程,旨在帮助学习者深入理解和实践Spring框架。 笔记部分可能会涵盖以下内容: 1. **Spring概述**:介绍Spring框架的历史、特点和主要...
Spring框架是Java开发中不可或缺的一部分,它以其强大的依赖注入(DI)和面向切面编程(AOP)功能而闻名。本篇文章将深入探讨Spring的配置和事件注入机制,帮助开发者更好地理解和利用这些特性。 首先,让我们关注...
3. 接口注入:Spring提供了ApplicationContextAware接口,通过实现该接口并注入ApplicationContext,可以在运行时获取到任何需要的bean。 ```java public class MyClass implements ApplicationContextAware { ...
综上所述,文档中提到的Spring学习指南为开发者提供了一个全面了解和掌握Spring框架的途径,通过阅读和实践可以深入理解依赖注入、面向切面编程、SpringMVC以及如何在实际项目中应用这些技术。同时,文档强调了开源...