一. 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. Java编程基础篇第二章

    关键字 概述:被Java语言赋予特定含义的单词. 特点:组成关键字的字母全部为小写字母. 标识符 概述:给类,接口,包,方法,常量起名字时的字符序列 组成规则:英文大小写字母,数字,$和— 命名规则. ...

  2. Gym 101194H / UVALive 7904 - Great Cells - [数学题+快速幂][2016 EC-Final Problem H]

    题目链接: http://codeforces.com/gym/101194/attachments https://icpcarchive.ecs.baylor.edu/index.php?opti ...

  3. Ubuntu上Qt之简单图片浏览器

     >>主要功能: (1)图片切换浏览,上一张/下一张. (2)图片放大.缩小.包括两种机制:鼠标滚轮和按钮放大/缩小. (3)图片自动循环播放,间隔2s.点击播放后,其他操作均无效,直至点 ...

  4. MVC中code first方式开发,数据库的生成与更新

    在使用EF的实际编程中我们经常遇到这样的问题:发现实体结构需要新增加一个字段,或者减少一个字段,急需把实体结构修改,并让数据库更新这种修改.在用Model First或者Database First的 ...

  5. 唯美MACD-完全版

    前言: 自己很喜欢MACD这个指标,因为很欠缺所以就搜集的多一点,有人问,学习缠为什么还这么搜集些Macd的资料呢?因为在分析走势(或盘整背驰.或趋势背驰)的时候我的习惯使用Macd做辅助判断,所以M ...

  6. [面试题]vi/vim快捷键及面试题系列

    选择 vi保存退出命令 w! wq! q! www vi移动光标到文件最后一行 G g ggg 4444 vi删除一行的命令 dd d D shift+4 在vi编辑器中的命令模式下,键入()可在光标 ...

  7. linux下查看CPU、内存、磁盘信息

    1.查看CPU信息# 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数cat /proc/c ...

  8. Session, Token and SSO 有什么区别

    Session, Token and SSO 有什么区别 Basic Compareation Session-based Authentication In Session-based Authen ...

  9. Python之包管理

    1.setup.py from distutils.core import setup setup(name='Distutils', version='1.0', description='Pyth ...

  10. Oarcle 入门之like关键字

    like关键字 模糊查询,有两个特殊的符号"%" ,"_" “%”表示匹配零个或若干字符 放哪边就表示哪边有零到若干个未知符号,其作用起到占位符的效果. “_” ...