为什么我喜欢打标签来配置AOP
1. 配置多很混乱,代码里面很难分辨出来哪些是AOP容器(比如属性注入)
2. 对于代码生成器生成的代码里面还需要手动加到配置里面
3. 连java spring现在都是清一色的注解来代替xml,这个就是趋势所在
 
我基于Autofac开发了一个基于标签来配置AOP的扩展
 
NUGET :Install-Package Autofac.Annotation
 
开源地址:
帮忙点个star 谢谢!
 
特色
1.打个Bean标签就能注入到AOP
2.打个Autowired标签自动装配注入
3.打个Value标签自动注入配置值(Soure标签配合使用)具体使用方法看下面的例子
4.支持拦截器
5.更多等你发现
 
如何使用
 
  1. var builder = new ContainerBuilder();
  2.  
  3. // 注册autofac打标签模式
  4. builder.RegisterModule(new AutofacAnnotationModule(typeof(AnotationTest).Assembly));
  5. //如果需要开启支持循环注入
  6. //builder.RegisterModule(new AutofacAnnotationModule(typeof(AnotationTest).Assembly).SetAllowCircularDependencies(true));
  7. var container = builder.Build();
  8. var serviceB = container.Resolve<B>();
 
AutofacAnnotationModule有两种构造方法
  1. 可以传一个Assebly列表 (这种方式会注册传入的Assebly里面打了标签的类)
  2. 可以传一个AsseblyName列表 (这种方式是先会根据AsseblyName查找Assebly 然后在注册)
 
支持的标签说明
 
Bean标签
说明:只能打在class上面 把某个类注册到autofac容器 例如:
1.无构造方法的方式 等同于 builder.RegisterType();
  1. //把class A 注册到容器
  2. [Bean]
  3. public class A
  4. {
  5. public string Name { get; set; }
  6. }
 
2.指定Scope [需要指定AutofacScope属性 如果不指定为则默认为AutofacScope.InstancePerDependency]
  1. [Bean(AutofacScope = AutofacScope.SingleInstance)]
  2. public class A
  3. {
  4. public string Name { get; set; }
  5. }
 
3.指定类型注册 等同于 builder.RegisterType().As()
  1. public class B
  2. {
  3.  
  4. }
  5. //将class A6以父类B注册到容器
  6. [Bean(typeof(B))]
  7. public class A6:B
  8. {
  9.  
  10. }
 
4.指定名字注册 等同于 builder.RegisterType().Keyed("a4")
  1. [Bean("a4")]//注册A4到容器 并给他起了一个名字叫a4 假设容器有多个A4被注册就可以用这个名字来区别自动装配
  2. public class A4
  3. {
  4. public string School { get; set; } = "测试2";
  5. }
 
 
5.其他属性说明
  • InjectProperties 是否默认装配属性 【默认为true】
  • InjectPropertyType 属性自动装配的类型
    1. Autowired 【默认值】代表打了Autowired标签的才会自动装配
    2. ALL 代表会装配所有 等同于 builder.RegisterType().PropertiesAutowired()
  • AutoActivate 【默认为false】 如果为true代表autofac build完成后会自动创建 具体请参考 autofac官方文档
  • Ownership 【默认为空】 具体请参考 autofac官方文档
  • Interceptor 【默认为空】指定拦截器的Type
  • InterceptorType 拦截器类型 拦截器必须实现 Castle.DynamicProxy的 IInterceptor 接口, 有以下两种
    1. Interface 【默认值】代表是接口型
    2. Class 代表是class类型 这种的话是需要将要拦截的方法标virtual
  • InterceptorKey 如果同一个类型的拦截器有多个 可以指定Key
  • InitMethod 当实例被创建后执行的方法名称 类似Spring的init-method 可以是有参数(只能1个参数类型是IComponentContext)和无参数的方法
  • DestroyMetnod 当实例被Release时执行的方法 类似Spring的destroy-method 必须是无参数的方法
 
  1. [Bean(InitMethod = "start",DestroyMetnod = "destroy")]
  2. public class A30
  3. {
  4. [Value("aaaaa")]
  5. public string Test { get; set; }
  6.  
  7. public A29 a29;
  8.  
  9. void start(IComponentContext context)
  10. {
  11. this.Test = "bbbb";
  12. a29 = context.Resolve<A29>();
  13. }
  14.  
  15. void destroy()
  16. {
  17. this.Test = null;
  18. a29.Test = null;
  19. }
  20. }
 
  1. public class B
  2. {
  3.  
  4. }
  5.  
  6. [Bean(typeof(B),"a5")]
  7. public class A5:B
  8. {
  9. public string School { get; set; } = "测试a5";
  10. public override string GetSchool()
  11. {
  12. return this.School;
  13. }
  14. }
 
Autowired 自动装配
可以打在Field Property 构造方法的Parameter上面 其中Field 和 Property 支持在父类
 
  1. [Bean]
  2. public class A16
  3. {
  4. public A16([Autowired]A21 a21)
  5. {
  6. Name = name;
  7. A21 = a21;
  8. }
  9.  
  10. [Autowired("A13")]
  11. public B b1;
  12.  
  13. [Autowired]
  14. public B B { get; set; }
  15.  
  16. //Required默认为true 如果装载错误会抛异常出来。如果指定为false则不抛异常
  17. [Autowired("adadada",Required = false)]
  18. public B b1;
  19. }
 
Value 和 PropertySource
 
PropertySource类似Spring里面的PropertySource 可以指定数据源 支持 xml json格式 支持内嵌资源
1.json格式的文件
  1. {
  2. "a10": "aaaaaaaaa1",
  3. "list": [ 1, 2, 3 ],
  4. "dic": {
  5. "name": "name1"
  6. },
  7. "testInitField": 1,
  8. "testInitProperty": 1,
  9. }
 
  1. [Bean]
  2. [PropertySource("/file/appsettings1.json")]
  3. public class A10
  4. {
  5. public A10([Value("#{a10}")]string school,[Value("#{list}")]List<int> list,[Value("#{dic}")]Dictionary<string,string> dic)
  6. {
  7. this.School = school;
  8. this.list = list;
  9. this.dic = dic;
  10.  
  11. }
  12. public string School { get; set; }
  13. public List<int> list { get; set; }
  14. public Dictionary<string,string> dic { get; set; }
  15.  
  16. [Value("#{testInitField}")]
  17. public int test;
  18.  
  19. [Value("#{testInitProperty}")]
  20. public int test2 { get; set; }
  21.  
  22. //可以直接指定值
  23. [Value("")]
  24. public int test3 { get; set; }
  25. }
2. xml格式的文件
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <autofac>
  3. <a11>aaaaaaaaa1</a11>
  4. <list name="0">1</list>
  5. <list name="1">2</list>
  6. <list name="2">3</list>
  7. <dic name="name">name1</dic>
  8. </autofac>
  1. [Bean]
  2. [PropertySource("/file/appsettings1.xml")]
  3. public class A11
  4. {
  5. public A11([Value("#{a11}")]string school,[Value("#{list}")]List<int> list,[Value("#{dic}")]Dictionary<string,string> dic)
  6. {
  7. this.School = school;
  8. this.list = list;
  9. this.dic = dic;
  10.  
  11. }
  12. public string School { get; set; }
  13. public List<int> list { get; set; }
  14. public Dictionary<string,string> dic { get; set; }
  15. }
3.不指定PropertySource的话会默认从工程目录的 appsettings.json获取值

AOP 还在配置吗改用打标签模式吧!的更多相关文章

  1. [10] AOP的注解配置

    1.关于配置文件 首先在因为要使用到扫描功能,所以xml的头文件中除了引入bean和aop之外,还要引入context才行: <?xml version="1.0" enco ...

  2. Spring AOP-xml配置

    在spring AOP(一)中介绍了AOP的基本概念和几个术语,现在学习一下在XML中如何配置AOP. 在XML中AOP的配置元素有以下几种: AOP配置元素 描述 <aop:config> ...

  3. TZ_05_Spring_基于AOP的xml配置

    1.分析    1>首先我们有一个Service需要增强 将Service增加一个日志(Logger)          2>写了一个日志的通知并且它可以对Service进行日志增强   ...

  4. Spring AOP及事务配置三种模式详解

    Spring AOP简述 Spring AOP的设计思想,就是通过动态代理,在运行期对需要使用的业务逻辑方法进行增强. 使用场景如:日志打印.权限.事务控制等. 默认情况下,Spring会根据被代理的 ...

  5. AOP切入点的配置

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  6. 【Autofac打标签模式】AutoConfiguration和Bean

    [ Autofac打标签模式]开源DI框架扩展地址: https://github.com/yuzd/Autofac.Annotation/wiki *:first-child { margin-to ...

  7. 【Autofac打标签模式】PropertySource和Value

    [ Autofac打标签模式]开源DI框架扩展地址: https://github.com/yuzd/Autofac.Annotation/wiki *:first-child { margin-to ...

  8. nginx 配置支持URL HTML5 History 模式 与 设置代理

    拾人牙慧:https://segmentfault.com/q/1010000007140360 nginx 配置支持URL HTML5 History 模式 location / { try_fil ...

  9. 【Autofac打标签模式】Component和Autowired

    [ Autofac打标签模式]开源DI框架扩展地址: https://github.com/yuzd/Autofac.Annotation/wiki Componet标签把类型注册到DI容器 1. 把 ...

随机推荐

  1. 467. [leetcode] Unique Substrings in Wraparound String

    467. Unique Substrings in Wraparound String Implement atoi to convert a string to an integer. Hint: ...

  2. 腾迅云CDN的使用

    一开始,我是想和七牛云一样,将腾迅云的对象存储作为网盘使用,不过在折腾的时间,搞不清楚腾迅云CDN的用法,最后看文档,看博客,大概了解了 这里讲两种用法,一种是结合对象存储,作一个静态网站或下载站,但 ...

  3. jenkins定位GitLab推送的最新Webhook中push event来自哪一个分支

    转载请标明出处:http://www.cnblogs.com/zblade/ 一.调研目的 jenkins可以和GitLab搭档,每当GitLab上有commit的时候,都可以触发jenkins执行相 ...

  4. 微信小程序开发05-日历组件的实现

    接上文:微信小程序开发04-打造自己的UI库 github地址:https://github.com/yexiaochai/wxdemo 我们这里继续实现我们的日历组件,这个日历组件稍微有点特殊,算是 ...

  5. Windows系统pip安装whl包

    1.确保PIP的存在 2.CMD命令进入C:\Python34\Scripts里面后再执行PIP命令安装pip install wheel     # D:   和cd  地址 3.把文件最好放在\S ...

  6. 基本 SQL 之增删改查(一)

    上篇文章,我们介绍了数据的基本 DDL 语句,你应当具备基本的创建数据库.数据表的 SQL 语句,以及表字段的基本数据类型的熟知. 那么本篇就来总结总结大家日常最频繁接触到的 DDM 语句,也就是基本 ...

  7. 1.Memcached 中文文档 - 概论(译官方文档)

    原文地址:memcached手册     https://github.com/memcached/memcached/wiki/Overview 简介 Free & open source, ...

  8. EasyUI List<T>转tree数据格式

    using System; using System.Collections; using System.Collections.Generic; using System.Linq; using S ...

  9. 从零开始学安全(四十一)●初识Wireshark

    wireshark:Beyond Compare是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直接与 ...

  10. SpringCloud-sleuth-zipkin链路追踪

    什么是Zipkin? 它是一个分布式链路跟踪系统它可以帮助收集时间数据,每个应用程序向Zipkin报告定时数据,Zipkin UI呈现了一个依赖图表来展示多少跟踪请求经过了每个应用程序:如果想解决延迟 ...