一. 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. 最短路径spfa

    #include <stdio.h> #include <string.h> #include <algorithm> #include <queue> ...

  2. Flv视频格式如何转换成MP4格式

    如何将flv视频格式转换成MP4格式呢?随着现在视频格式的不断多样化,视频格式转换的问题也成了现在生活中常见的问题,那么我们应该怎样将flv视频格式转换成MP4格式呢?下面我们就一起来看一下吧. 操作 ...

  3. eclipse与hadoop-eclipse-plugin之间的版本对应关系

    eclipse与hadoop-eclipse-plugin之间,版本互相不兼容,或者说,版本要求严格. 把hadoop-eclipse-plugin复制到eclipse的plugins目录下以后,如果 ...

  4. spring 开始构造

    1,选择“org.apache.maven.archetypes:maven-archetype-webapp”骨架(模板),创建一个Web项目: 在main 目录下创建文件夹  java,  res ...

  5. MySQL 连接数相关参数设置

    当我们的数据库服务器遇到如下的错误:ERROR: Too many connections 一种可能性就是我们的压力确实很大,需要增加服务器硬件资源或者增加数据库服务器.但是大多数情况下是我们的连接数 ...

  6. java.net.UnknownHostException 异常处理

    修改hosts文件: 1.把机器名和ip写在下面 2.hosts文件生效   soure /etc/hosts

  7. [01-01]oracle数据库汉化

    oracle汉化方法: 1.下载oracle工具,下载与自己电脑版本相关的oracle工具,可在电脑 [控制面板] - [系统和安全] - [系统] 查看电脑版本 32位或64位,oracle工具下载 ...

  8. C++11 vector使用emplace_back代替push_back

    C++11中,针对顺序容器(如vector.deque.list),新标准引入了三个新成员:emplace_front.emplace和emplace_back,这些操作构造而不是拷贝元素.这些操作分 ...

  9. 接口测试工具-Jmeter使用笔记(九:跨线程组传递变量)

    使用场景: 请求API需要授权令牌,但是授权令牌只需要获取一次,即可调用服务器上其他业务接口. 所以我想要把授权操作放在单独的一个线程,业务流放在其他线程. 这就需要我把从授权线程获取的令牌传入业务流 ...

  10. js/jquery 元素是否存在

    <!DOCTYPE html><html><head><meta charset="UTF-8"><title>spli ...