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="font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;line-height:14.65625px;background-color:#F8F8F8;">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-28 18:01:54

TinyIOC的相关文章

DotNet 资源大全

原文:DotNet 资源大全 转自:http://blog.jobbole.com/96676/ API 框架 NancyFx:轻量.用于构建 HTTP 基础服务的非正式(low-ceremony)框架,基于.Net 及 Mono 平台. ASP.NET WebAPI:快捷创建 HTTP 服务的框架,可以广泛用于多种不同的客户端,包括浏览器和移动设备. ServiceStack :架构缜密.速度飞快.令人愉悦的 web 服务. Nelibur:Nelibur 是一个使用纯 WCF 构建的基于消息

DotNet 资源大全中文版

原文:DotNet 资源大全中文版 转自:https://github.com/jobbole/awesome-dotnet-cn 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-dotnet 是由 quozd 发起和维护.内容包括:编译器.压缩.应用框架.应用模板.加密.数据库.反编译.IDE.日志.风格指南等. Awesome 系列虽然挺全,但基本只对收录的资源做了极为简要的介绍,如果有更详细的中文介绍,对相应开发者的帮助会更大.这

使用TinySpider实战抓取自己博客中的内容

因为做官网,没有内容,因此就想办法从OSChina中写的博客里弄点内容,这就要用到爬虫了. 然后就花了几分钟搞了一下,步骤如下: 第一步,写个方法抓目录: ? 1 2 3 4 5 6 7 8 9 10 11 public static void processCategory(String categoryId) {         Watcher watcher = new WatcherImpl();         Spider spider = new SpiderImpl();    

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

Awesome系列的.Net资源整理.awesome-dotnet是由quozd发起和维护.内容包括:编译器.压缩.应用框架.应用模板.加密.数据库.反编译.IDE.日志.风格指南等. 算法与数据结构(Algorithms and Data structures) Algorithmia -.NET 3.5及更高版本的算法和数据结构库. 算法包含复杂的算法和数据结构,如图,优先级队列,命令,撤消重做等. C# Algorithms - 标准数据结构和算法的C#即插即用类库项目. 它包含35多个数