一. Spring.net中IOC介绍

  1. 什么是IOC,控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

二. Spring.Net基本实现:此处使用的是把引用外部的xml文件封装object里的代码。

实现步骤,

  1. 首先引用两个dll文件,从 Spring.net2.0中找出这四个文件,并且放在新建的Lib文件夹中,然后导入文件。

引入文件 : 

2. 新建一个接口,并且提供一个方法。

 namespace SpringNet
{
public interface IUserInfoService
{
string msgShow();
}
}

3.  写一个类,继承上面的接口

 {
public class UserInfoService : IUserInfoService
{
public string UserName { get; set; }
public PerSon person { get; set; }
public string msgShow()
{
return "hello:" + UserName+",年龄:"+person.Age;
}
}
}

3.5 加一个person类,后面ref对应的类

 namespace SpringNet
{
public class PerSon
{
public int Age { get; set; }
}
}

4 .新建一个winform页面,并且放一个button按钮

5. 配置配置文件,重点看红色标记的行,其中value是是指当前属性的值,而ref是指关联的类的名称。

重点注意一下:命名空间和类名很有可能不是同一个

 <?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="spring"> <!--配置引用的dll文件的路径-->
<section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
6 <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
<!--配置截止-->
</sectionGroup>
</configSections>
<spring>
<context>
<resource uri="config://spring/objects"/>
<!--将xml与配置文件关联-->
<!-- <resource uri="file://XMLServer.xml"/> -->
</context>
<objects xmlns="http://www.springframework.net"> <!--使用xml文件-->
<description>An example that demonstrates simple IoC features.</description>
<!--命名空间的类全称,和程序集的名称-->
<object name="UserInfoService" type="SpringNet.UserInfoService, SpringNet">
<!--类的属性-->
<property name="UserName" value="张三"/>
24 <property name="person" ref="PerSon"/> <!--类的属性-->
</object>
<object name="PerSon" type="SpringNet.PerSon, SpringNet">
<!--类的属性-->
<property name="Age" value="16"/>
</object>
</objects>
</spring>
</configuration>

6. button对应的代码如下:

 namespace SpringNet
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
IApplicationContext ctx = ContextRegistry.GetContext();
//获取object的程序集类的对象,并且和对应的接口绑定,然后用接口接收
IUserInfoService lister = (IUserInfoService)ctx.GetObject("UserInfoService");
MessageBox.Show(lister.msgShow());
}
}
}

三. Spring.Net在MVC中应用

1:先导入dll文件。在2.0中找到这些文件,并且放置在一个新建的lib文件夹中,并且引入。

2:将案例中的Config文件夹拷贝到项目中:在webapp项目中新建一个config文件夹,用来存放xml类型的文件。

2.1 修改控制器中原本的new对象的方法。

//原本是这样new对象 ,改成下面这样,其实就时相当于改成其中一个属性,然后在配置文件中给该类中这个属性赋值  
// IBLL.IUserInfoService UserInfoService = new BLL.UserInfoService();
IBLL.IUserInfoService UserInfoService { get; set; }

3:修改Config文件夹中的相关的配置信息。 该配置文件的作用主要是为类的中的一个属性赋值,注意:type中对应的是命名空间带类名的全称,程序集,我的两个就不一样然后这个bug我改了半个月.......

 <?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net">
<!--controller的程序集,专门负责相关控制器-->
<!--命名空间带类名的全称,程序集-->
<object type="OA_MVC.Controllers.UserInfoController, OA-MVC" singleton="false" >
<property name="UserInfoService" ref="userInfoService" />
</object>
<object name="userInfoService" type="BLL.UserInfoService, UserInfoService" singleton="false" >
</object>
</objects>

4:修改Web.config文件中的配置。

 <!--在<configSections>中配置以下-->
<sectionGroup name="spring">
<!--Spring.Net配置 指对应的处理由Handler执行-->
<section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc4"/>
</sectionGroup>
<!--在跳出上面这个之后,加入以下-->
<spring>
<!--Spring.Net配置 配置处理,配置xml文件路径-->
<context>
<resource uri="file://~/Config/controllers.xml"/>
<resource uri="file://~/Config/services.xml"/>
</context>
</spring>

5:可以将Config/controllers.xml文件中的配置信息分离(可以将控制器的配置与业务类的配置分离。)注意web.config文件中也要修改一下。

就是指把第三步的红色的object文件夹中的文件分离出来新建一个xml文件,并且在web.config配置中,也要注意加入业务类对应的xml文件路径。
6:修改Global文件.使其继承SpringMvcApplication

 namespace OA_MVC
{
// 注意: 有关启用 IIS6 或 IIS7 经典模式的说明,
// 请访问 http://go.microsoft.com/?LinkId=9394801
//SpringMvcApplication继承System.Web.HttpApplication,并且SpringMvcApplication自带容器,所以不用自己构建
public class MvcApplication : SpringMvcApplication //System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
}

四. 异常处理

1.新建一个MyExceptionAttribute类,用来处理异常,将异常加载进入队列中

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace OA_MVC.Models
{
public class MyExceptionAttribute : HandleErrorAttribute
{
//新建一个异常类型的队列,并且设置静态的队列,就向同一个队列中插入
public static Queue<Exception> ExceptionQueue = new Queue<Exception>();
public override void OnException(ExceptionContext filterContext)
{
base.OnException(filterContext);
Exception ex = filterContext.Exception; //创建一个异常
ExceptionQueue.Enqueue(ex); //将异常追加到队列最后
//跳转错误页
filterContext.HttpContext.Response.Redirect("/Error.html");
}
}
}

2. 在Global.asax文件中开启线程,捕获异常,因为该文件是最初启动的,并且线程一直启动。然后将启动的线程日志放在log文件夹中。15号以后是关键代码

 namespace OA_MVC  //该文件是应用程序加载就会自动执行,并且不间断执行的
{
// 注意: 有关启用 IIS6 或 IIS7 经典模式的说明,
// 请访问 http://go.microsoft.com/?LinkId=9394801
//SpringMvcApplication继承System.Web.HttpApplication,并且SpringMvcApplication自带容器,所以不用自己构建
public class MvcApplication : SpringMvcApplication //System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
//开启一个线程,扫描异常信息队列。
string filePath = Server.MapPath("/Log/"); //获取存放日志文件的物理路径
//开启一个线程池 需要传递一个委托的object
ThreadPool.QueueUserWorkItem((a) =>
{
while (true)
{
//判断一下队列中是否有数据
if (MyExceptionAttribute.ExceptionQueue.Count() > )
{
//出队,谁先进去,谁就先出去
Exception ex=MyExceptionAttribute.ExceptionQueue.Dequeue();//出队
if (ex != null)
{
//将异常写入日志文件中。
string fileName = DateTime.Now.ToString("YYYY-MM-dd");
//如果文件有,就追加,如果没有就新创建一个并且写入,三个参数,第一个是文件名,第二个是需要填充的内容,第三个是编码格式
File.AppendAllText(filePath+fileName+".txt",ex.ToString(),System.Text.Encoding.UTF8);
}
}
else
{
//如果队列中没有数据休息3秒钟
Thread.Sleep();
}
}
}, filePath);
}
}
}

3. 关键点,修改App_Start文件夹下的FilterConfig文件

     public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//捕获异常注册,修改下面代码
//filters.Add(new HandleErrorAttribute());
filters.Add(new MyExceptionAttribute());
}
}
}

五. Log4Net日志处理

Log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件、数据库、EventLog等),日志就是程序的黑匣子,可以通过
日志查看系统的运行过程,从而发现系统的问题。日志的作用:将运行过程的步骤、成功失败记录下来,将关键性的数据记录下来分析系统问题所在。Log4J。
对于网站来讲,不能把异常信息显示给用户,异常信息只能记录到日志,出了问题把日志文件发给开发人员,就能知道问题所在。

配置Log4Net环境

(1)新建一个WebApplication 应用程序

(2)添加对log4net.dll的引用(bin\net\2.0\release 不能引用debug版本)(把相应的dll文件拷贝到项目中的lib文件夹下。)

(3)在Web.Config (或App.Config)添加配置,见备注
加入configSections配置文件中

(4)初始化:在程序最开始(Global文件中)加入log4net.Config.XmlConfigurator.Configure();不要加到页面的Load,

(5)在要打印日志的地方LogManager.GetLogger(typeof(Program)).Debug(“信息”); 。通过LogManager.GetLogger传递要记录的日志类类名获得这个类的ILog(这样在日志文件中就能看到这条日志是哪个类输出的了),然后调用Debug方法输出消息。因为一个类内部不止一个地方要打印日志,所以一般把ILog声明为一个static字段。
Private static ILog logger=LogManager.GetLogger(typeof(Test))
输出错误信息用ILog.Error方法,第二个参数可以传递Exception对象。log.Error("***错误"+ex),log.Error("***错误",ex)
测试代码:

Appender:可以将日志输出到不同的地方,不同的输出目标对应不同的Appender:RollingFileAppender(滚动文件)、AdoNetAppender(数据库)、SmtpAppender (邮件)等。

level(级别):标识这条日志信息的重要级别。None>Fatal>ERROR>WARN>DEBUG>INFO>ALL,设定一个Level,那么低于这个Level的日志是不会被写到Appender中的。

Log4Net还可以设定多个Appender,可以实现同时将日志记录到文件、数据、发送邮件等;可以设定不同的Appender的不同的Level,可以实现普通级别都记录到文件,Error以上级别发送邮件;可以实现对不同的类设定不同的Appender;还可以自定义Appender,这样可以自己实现将Error信息发短信等。

(*)除了Log4Net,还有Enterprise Library中的Logging Application Block、Apache的CommonLog 以及NLog等,都差不多。

六. 基本登录完成

1. 先加一个登陆页面,引入image文件夹,修改js和jquery文件路径。

2. 加验证码功能,先在common文件夹中加入ValidateCode.cs类文件,切记引入system.web

3. 修改登陆页面中图片src路径

七. 登录问题(重定向问题,Session问题)

Spring.Net —IOC详解的更多相关文章

  1. Spring之IOC详解

    学过Spring的小伙伴对于IOC一定不陌生,IOC:控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spr ...

  2. Spring之IoC详解(非原创)

    文章大纲 一.Spring介绍二.Spring的IoC实战三.IoC常见注解总结四.项目源码及参考资料下载五.参考文章 一.Spring介绍 1. 什么是Spring   Spring是分层的Java ...

  3. 2、Spring的 IoC详解(第一个Spring程序)

    Spring是为了解决企业应用开发的复杂性而创建的一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架.在这句话中重点有两个,一个是IoC,另一个是AOP.今天我们讲第一个IoC. IoC概念 ...

  4. (二)Spring 之IOC 详解

    第一节:spring ioc 简介 IOC(控制反转:Inversion of Control),又称作依赖注入dependency injection( DI ),是一种重要的面向对象编程的法则来削 ...

  5. Spring IoC详解

    Spring IoC详解 1. 控制反转 控制反转是一种通过描述(XML或者注解)并通过第三方去产生或获取特定对象的方式.在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Depend ...

  6. Spring jar包详解

    Spring jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spri ...

  7. Spring——jar包详解(转)

    Spring——jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spr ...

  8. spring注入参数详解

    spring注入参数详解 在Spring配置文件中, 用户不但可以将String, int等字面值注入到Bean中, 还可以将集合, Map等类型的数据注入到Bean中, 此外还可以注入配置文件中定义 ...

  9. Spring4 IOC详解

    Spring4 IOC详解 上一章对Spring做一个快速入门的教程,其中只是简单的提到了IOC的特性.本章便对Spring的IOC进行一个详解.主要从三个方面开始:基于xml文件的Bean配置,基于 ...

随机推荐

  1. C#Web从0到1—创建一个web并从VS集成的SQLlocalDB数据库中查询数据

    软件说明: VS2017,腾讯云服务器10元1个月,系统Win2012 R2标准版 第一步:建立第一个网页 建立工程 建好后,可以打开View选项打开项目资源浏览器和工具箱,后文会多次用到这两个版面 ...

  2. React中redux表单编辑

    reduxForm中反写数据在输入框中,数据是从别的模块拉取 // 编辑应用表单 class EditCode extends React.Component { constructor(props) ...

  3. 我对于B-树索引的内部结构与索引类型所做的笔记

    图 3-1 B-树索引的内部结构 分支块和页块 B-树索引有两种类型的块: 用于查找的分支块和用于存储值的叶块.B-树索引的上层分支块包含指向下层索引块的索引数据.在图 3-1 中,根分支块包含条目 ...

  4. #学号 20175201张驰 《Java程序设计》第1周学习总结

    教材学习内容总结 第一章 ·第一章的内容相对简单,我并未遇到大的困难. ·1.Java特点:语法简单.面向对象.与平台无关.动态. ·2.关于编写源文件:源文件名字必须与public类的名字相同:保存 ...

  5. PHP中new self()和new static()的区别探究

    1.new static()是在PHP5.3版本中引入的新特性. 2.无论是new static()还是new self(),都是new了一个新的对象. 3.这两个方法new出来的对象有什么区别呢,说 ...

  6. 小程序 navigator 无法跳转 tabBar上的页面

    解决方法一: navigator 的 open-type 设置为 switchTab 解决方法二: 使用 wx.switchTab({ url: ‘../cart/index’ }) 进行跳转

  7. 这10个Python项目超有趣!

    前言: Python可谓是现在很多人正在学或者想学的一个脚本语言了,提到学习自然就少不了拿项目练手,可是一般的项目根本提不起兴趣嘛,这10个项目可是非常有趣的,不信你看看. [Python 图片转字符 ...

  8. 队列ADT

    队列 队列是FIFO表,使用队列时在队尾(rear)插入元素,称之为入队(enqueue),以及在对头(front)删除并返回元素值,称之为出队(dequeue). 任何表的实现都可以用于实现队列结构 ...

  9. 024-母版页MasterPage

    网站的布局通常是统一的,上面是Logo.菜单条.下面是公司地址.版权声明等.如果每个页面都重复做这些功能的话:重复性劳动.一旦修改那么每个页面都要修改..Net中一般用母版(MasterPage)技术 ...

  10. eclipse添加mybatis插件

    1,在 eclipse中选择 Help->eclipse marketplace 2, 搜索安装