TinyIOC

在动不动就是SSH的年代,IOC,AOP不是啥新东东。Spring之所以庞大,是因为集成了太多太多的功能。  验证性的开发了一下,仅实现IOC、AOP、子容器简单实践一下。 
当然了,必须以HelloWorld示例: 
接口:

1
2
3
public interface Hello {
    void sayHello(String name);
}

实现:

1
2
3
4
5
6
7
@Singleton
@Named("abc")
public class Hello1Impl implements Hello {
    public void sayHello(String name) {
        System.out.println("Hello:" + name);
    }
}

测试:

1
2
3
4
5
6
7
8
public static void main(String[] args) {
        BeanContainer container = BeanContainerFactory.getBeanContainer();
        container.registerClass(Hello1Impl.class);
        Hello hello = container.getBeanByType(Hello.class);
        hello.sayHello("abc");
        hello = container.getBeanByName("abc");
        hello.sayHello("def");
    }

运行结果:

1
2
Hello:abc
Hello:def

可以看到根据接口和命名访问都是没有问题的。 
再来一个AOP的例子: 
先写个拦截器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Request
public class InterceptorImpl implements InterceptorBefore, InterceptorAfter, InterceptorException {
    public void after(Object object, Method method, Object... args) {
        System.out.println(String.format("%s->after\n", method.getName()));
    }

public void before(Object object, Method method, Object... args) {
        System.out.println(String.format("%s->before\n", method.getName()));
    }

public void exception(Object object, Method method, Throwable throwable, Object... args) {
        System.out.println(String.format("%s->exception:%s\n", method.getName(), throwable.getMessage()));
    }
}

拦截点有前置,后置及异常,可以实现在一个类上,也可以实现在不同的类上。如果有状态的,则应该配成Prototype或Request类型,否则要考虑线程安全问题。 
还是用前面的HelloImpl做测试:

1
2
3
4
5
6
7
8
public static void main(String[] args) {
        BeanContainer container = BeanContainerFactory.getBeanContainer();
        container.registerClass(InterceptorImpl.class);
        container.registerClass(HelloImpl.class);
        container.addAop(new AopDefine(".*HelloImpl", "sayHello", ".*", InterceptorImpl.class.getName()));
        Hello hello = container.getBeanByType(Hello.class);
        hello.sayHello("abc");
    }

运行结果:

1
2
3
sayHello->before
Hello:abc
sayHello->after

当然了,上面的类注册都是手工添加的,实际使用,会增加一个类扫描器自动添加到容器中的。 
再来看一个子容器的类子:

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) {
        BeanContainer container = BeanContainerFactory.getBeanContainer();
        container.registerClass(InterceptorImpl.class);
        container.registerClass(HelloImpl.class);
        container.registerClass(Hello1Impl.class);
        BeanContainer subContainer = BeanContainerFactory.getBeanContainer("subContainer");
        subContainer.registerClass(HelloHelperImpl.class);
        subContainer.setParent(container);
        container.addAop(new AopDefine(".*Hello1Impl", "sayHello", ".*", InterceptorImpl.class.getName()));
        subContainer.addAop(new AopDefine(".*", "set.*", ".*", InterceptorImpl.class.getName()));
        HelloHelper helloHelper = subContainer.getBeanByType(HelloHelper.class);
        helloHelper.sayHello("abc");
    }

在上面的示例中,创建了一个容器,一个子容器,然后把子容器放在父容器下。

1
2
3
4
5
public class Hello1Impl implements Hello {
    public void sayHello(String name) {
        System.out.println("Hello:" + name);
    }
}

HelloHelper

1
2
3
4
5
6
7
public interface HelloHelper {
    Hello getHello();

List<Hello> getHelloList();

void sayHello(String name);
}

HelloHelperImpl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Singleton
public class HelloHelperImpl implements HelloHelper {
    @Inject
    Hello hello;
    @Inject
    private List<Hello> helloList;

public void setHelloList(List<Hello> helloList) {
        this.helloList = helloList;
    }

public void setHello(Hello hello) {
        this.hello = hello;
    }

public Hello getHello() {
        return <span style=‘line-height: 14.65px; font-family: Consolas, "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; ‘>hello</span>;
    }

public List<Hello> getHelloList() {
        return helloList;
    }

public void sayHello(String name) {
        hello.sayHello(name);
    }
}

下面是运行结果:

1
2
3
4
5
6
7
setHello->before
setHello->after
setHelloList->before
setHelloList->after
sayHello->before
Hello:abc
sayHello->after

Jar包大小: 
16,208 tinyioc-0.0.12-SNAPSHOT.jar

时间: 2024-11-05 12:20:24

TinyIOC的相关文章

C# TinyIOC简单用法

先添加一个接口 namespace IContract { public interface IBase { void ShowMessage(); } } 再添加两个实现类 namespace Contract { public class AContract : IBase { public void ShowMessage() { MessageBox.Show("A"); } } } namespace Contract { public class BContract : I

如何提高码农产量,基于ASP.NET MVC的敏捷开发框架开发随笔一

公司业务量比较大,接了很多项目,为了缩短开发周期老板让我牵头搭建了一个敏捷开发框架. 我们主要的业务是做OA.CRM.ERP一类的管理系统,一个通用的后台搭出来,再配合一些快速开发的组件开发效率能提高很多. 另外老板一再强调要支持APP开发,一次开发能部署到安卓和IOS上. 作为开篇之作,先介绍一下该框架的功能点及技术点,后续的文章再按功能详细讲解. 献上<在线体验Demo地址>希望大家也能从中得到一些启发. 体验地址:http://www.learun.cn:8090 . 用户名:Syste

Nancy FormsAuthentication使用

1.新建UserDatabase类,实现IUserMapper接口 using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Security.Principal; using Nancy.Authentication.Forms; public class UserDatabase : IUserMapper { private st

LCLFramework框架之IOC

LCLFramework框架之依赖注入(IOC)职责 依赖注入(Dependency Injection,简称DI) 依赖查找(Dependency Lookup) 控制反转 LCLFramework框架之依赖注入(IOC)设计 网上有很多的IOC框架如何让用户选择自己熟悉的IOC框架了,那LCL就需要提供可扩展的IOC应该如何让框架注入自己熟悉的IOC框架呢? 下图是基本的IOC扩展契约,所有的第三方都要实现IObjectContainer契约,下图中实现了,Unity,TinyIoc两个第三

x01.Lab.StreetApp: MVVM

Store App 特别适用于 MVVM 模式.由于要用到 SQLite,Bing Maps,所以第一步从网上搜索并安装这两个扩展.很难想象在智能手机上运行 SQL Server 这种巨无霸型数据库,SQLite 便成为首选.运行 SQLite,需要 C++ 扩展,而解决方案属性 => 配置管理中,CPU 也不能是 Any,应改为 x86.安装后,其添加引用窗口的 扩展 项如下: 第二步,当然是下载源代码了.可到我的置顶随笔 x01.Lab.Download 中获取.解压后,双击 Lab.sln

DotNet 资源大全中文版(Awesome最新版)

Awesome系列的.Net资源整理.awesome-dotnet是由quozd发起和维护.内容包括:编译器.压缩.应用框架.应用模板.加密.数据库.反编译.IDE.日志.风格指南等. API 框架 NancyFx:轻量.用于构建 HTTP 基础服务的非正式(low-ceremony)框架,基于.Net 及 Mono 平台. 官网 ASP.NET WebAPI:快捷创建 HTTP 服务的框架,可以广泛用于多种不同的客户端,包括浏览器和移动设备. 官网 ServiceStack:架构缜密.速度飞快

分享技术:基于ASP.NET MVC+漂亮UIBootstrap的敏捷开发框架开发随笔一

公司业务量比较大,接了很多项目,为了缩短开发周期老板让我牵头搭建了一个敏捷开发框架. 我们主要的业务是做OA.CRM.ERP一类的管理系统,一个通用的后台搭出来,再配合一些快速开发的组件开发效率能提高很多. 另外老板一再强调要支持APP开发,一次开发能部署到安卓和IOS上. 作为开篇之作,先介绍一下该框架的功能点及技术点,后续的文章再按功能详细讲解. 献上<在线体验Demo地址>希望大家也能从中得到一些启发. 体验地址:http://www.learun.cn/adms/index.html 

Nancy之Forms验证

授权几乎是所以系统都不可或缺的部分,在Nancy中怎么授权呢?我们这篇博文来说一下Nancy的Forms授权. 首先在NuGet上安装Nancy.Authentication.Forms Nancy的Forms验证得实现IUserMapper接口,用户类实现IUserIdentity接口(为了方便,我把DB的User,Model的User全合成一个User) User.cs using Nancy.Security; using System; using System.Collections.

DotNet 资源

DotNet 资源 目录 API 应用框架(Application Frameworks) 应用模板(Application Templates) 人工智能(Artificial Intelligence) 程序集处理(Assembly Manipulation) 资源(Assets) 认证和授权(Authentication and Authorization) 自动构建(Build Automation) 缓存(Caching) CLI CLR CMS 代码分析和度量(Code Analys