AOP 还在配置吗改用打标签模式吧!

为什么我喜欢打标签来配置AOP

1. 配置多很混乱,代码里面很难分辨出来哪些是AOP容器(比如属性注入)

2. 对于代码生成器生成的代码里面还需要手动加到配置里面

3. 连java spring现在都是清一色的注解来代替xml,这个就是趋势所在

我基于Autofac开发了一个基于标签来配置AOP的扩展

NUGET :Install-Package Autofac.Annotation

开源地址:

https://github.com/yuzd/Autofac.Annotation

帮忙点个star 谢谢!

特色

1.打个Bean标签就能注入到AOP

2.打个Autowired标签自动装配注入

3.打个Value标签自动注入配置值(Soure标签配合使用)具体使用方法看下面的例子

4.支持拦截器

5.更多等你发现

如何使用

var builder = new ContainerBuilder();

// 注册autofac打标签模式
builder.RegisterModule(new AutofacAnnotationModule(typeof(AnotationTest).Assembly));
//如果需要开启支持循环注入
//builder.RegisterModule(new AutofacAnnotationModule(typeof(AnotationTest).Assembly).SetAllowCircularDependencies(true));
var container = builder.Build();
var serviceB = container.Resolve<B>();

AutofacAnnotationModule有两种构造方法

  1. 可以传一个Assebly列表 (这种方式会注册传入的Assebly里面打了标签的类)
  2. 可以传一个AsseblyName列表 (这种方式是先会根据AsseblyName查找Assebly 然后在注册)

支持的标签说明

Bean标签

说明:只能打在class上面 把某个类注册到autofac容器 例如:

1.无构造方法的方式 等同于 builder.RegisterType();

//把class A 注册到容器
[Bean]
public class A
{
    public string Name { get; set; }
}

2.指定Scope [需要指定AutofacScope属性 如果不指定为则默认为AutofacScope.InstancePerDependency]

 [Bean(AutofacScope = AutofacScope.SingleInstance)]
    public class A
    {
        public string Name { get; set; }
    }

3.指定类型注册 等同于 builder.RegisterType().As()

    public class B
    {

    }
    //将class A6以父类B注册到容器
    [Bean(typeof(B))]
    public class A6:B
    {

    }

4.指定名字注册 等同于 builder.RegisterType().Keyed("a4")

    [Bean("a4")]//注册A4到容器 并给他起了一个名字叫a4 假设容器有多个A4被注册就可以用这个名字来区别自动装配
    public class A4
    {
        public string School { get; set; } = "测试2";
    }

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 必须是无参数的方法
  [Bean(InitMethod = "start",DestroyMetnod = "destroy")]
    public class A30
    {
        [Value("aaaaa")]
        public string Test { get; set; }

        public A29 a29;

        void start(IComponentContext context)
        {
            this.Test = "bbbb";
            a29 = context.Resolve<A29>();
        }

        void destroy()
        {
            this.Test = null;
            a29.Test = null;
        }
    }
    
    public class B
    {

    }

    [Bean(typeof(B),"a5")]
    public class A5:B
    {
        public string School { get; set; } = "测试a5";
        public override string GetSchool()
        {
            return this.School;
        }
    }

Autowired 自动装配

可以打在Field Property 构造方法的Parameter上面 其中Field 和 Property 支持在父类

    [Bean]
    public class A16
    {
    public A16([Autowired]A21 a21)
        {
            Name = name;
            A21 = a21;
        }

        [Autowired("A13")]
        public B b1;

        [Autowired]
        public B B { get; set; }

    //Required默认为true 如果装载错误会抛异常出来。如果指定为false则不抛异常
    [Autowired("adadada",Required = false)]
        public B b1;
    }

Value 和 PropertySource

PropertySource类似Spring里面的PropertySource 可以指定数据源 支持 xml json格式 支持内嵌资源

1.json格式的文件

{
  "a10": "aaaaaaaaa1",
  "list": [ 1, 2, 3 ],
  "dic": {
    "name": "name1"
  },
  "testInitField": 1,
  "testInitProperty": 1,
}
   [Bean]
    [PropertySource("/file/appsettings1.json")]
    public class A10
    {
        public A10([Value("#{a10}")]string school,[Value("#{list}")]List<int> list,[Value("#{dic}")]Dictionary<string,string> dic)
        {
            this.School = school;
            this.list = list;
            this.dic = dic;

        }
        public string School { get; set; }
        public List<int> list { get; set; }
        public Dictionary<string,string> dic { get; set; } 

    [Value("#{testInitField}")]
        public int test;

    [Value("#{testInitProperty}")]
        public int test2 { get; set; }

    //可以直接指定值
    [Value("2")]
    public int test3 { get; set; }
    }

2. xml格式的文件

<?xml version="1.0" encoding="utf-8" ?>
<autofac>
  <a11>aaaaaaaaa1</a11>
  <list name="0">1</list>
  <list name="1">2</list>
  <list name="2">3</list>
  <dic name="name">name1</dic>
</autofac>
    [Bean]
    [PropertySource("/file/appsettings1.xml")]
    public class A11
    {
        public A11([Value("#{a11}")]string school,[Value("#{list}")]List<int> list,[Value("#{dic}")]Dictionary<string,string> dic)
        {
            this.School = school;
            this.list = list;
            this.dic = dic;

        }
        public string School { get; set; }
        public List<int> list { get; set; }
        public Dictionary<string,string> dic { get; set; }
    }

3.不指定PropertySource的话会默认从工程目录的 appsettings.json获取值

原文地址:https://www.cnblogs.com/yudongdong/p/10285392.html

时间: 2024-09-30 20:40:26

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

spring相关—AOP编程—数学计算器情景示例讲解(包含注解配置AOP与XML配置AOP)

1.数学计算器 ①数学计算器接口[MathCalculator]            public void add(int i,int j);     public int sub(int i,int j);     public int multi(int i,int j);     public void divide(int i,int j);    ②提供简单实现:加减乘除运算[EasyImpl]    ③在简单实现的基础上让每一个计算方法都能够打印日志[LoginImpl]    

修改LigerUI的导航栏,改为Tab标签模式

LigerUI导航栏本身是没有tab标签模式的,但是实际上,很多时候标签能能更好的展示业务,将导航的内容按照类目进行划分,避免一个里面太多的情况. 下面是我改造后的效果图,如下: ligerui是一个不错的免费开源ui框架,功能还是很强大的,但是有些地方也做的不够好,比如表单的自适应布局,树,布局等等,但是相信会越来越好.这里给出我改造后代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "

【Autofac打标签模式】PropertySource和Value

[ Autofac打标签模式]开源DI框架扩展地址: https://github.com/yuzd/Autofac.Annotation/wiki *:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !important; } .markdown-body a:not([href]) { color: inherit; text-decoration: none;

360浏览器怎么设置多个窗口或多标签模式

笔者今天在使用360安全浏览器的时候.发现每打开一个链接都是一个单独的窗口. 于是上网查询怎么恢复之前的多标签模式,现将方法记录并分享于此. 1.首先打开360安全浏览器. 2.选择"菜单"-->工具-->切换到多标签模式,即可恢复成多标签模式,具体操作如下图所示:

Angularjs中的标签模式和html5模式

浏览$location的实例代码我们不难发现,每次的url中都会带一个#,这是因为angularjs默认使用的是标签模式,它和html5模式有什么区别? (1)标签模式 标签模式使用的是内部链接的技巧,URL后面紧跟一个#,angularjs本身不会重写<a>标签,也不需要服务器端的支持,链接后的URL样子基本是这样的: http://example.com/#/some/path?foo=bar&baz=xoxo (2)HTML5模式 标签模式的url看起来总是觉得不爽,html5模

【Autofac打标签模式】Aspect拦截器

[ Autofac打标签模式]开源DI框架扩展地址: https://github.com/yuzd/Autofac.Annotation/wiki 前提条件 自己new一个对象不能实现拦截器功能,必须得从DI容器拿到的对象才能具备拦截器功能 可以参考 我写的文章介绍 拦截器原理简单介绍 用了Castle.Core组件 把你想要实现拦截器的目标类生成一个代理类. 然后织入拦截器,有2种方式 class + 方法为virtual的方式 这种方式需要 从容器中是根据一个classType来获取到目标

[刘阳Java]_Spring AOP基于XML配置介绍_第9讲

基于注解配置的Spring AOP固然简单,但是这节我们会给大家介绍基于XML配置的AOP是如何应用的.为什么这么说了,因为后面我们还会介绍到Spring对Dao操作的事务管理(基于AOP的XML文件方式来配置事务) 1. 基于XML文件方式来配置Spring的AOP,则我们需要的一些基本元素如下 <aop:config.../>,此标签很重要.它是在XML里配置AOP功能的核心标签 all aspect and advisor elements must be placed within a

【Spring四】AOP之XML配置

AOP:Aspect Oriented  Programming 面向切面编程 面向切面编程的核心是动态代理设计模式.请先參见动态代理设计模式笔记. 以Hibernate保存一个对象到数据库为例,因为保存数据时须要开启事务,利用面向切面编程思想,将事务的处理分离出来.当作一个切面来处理. jdk的动态代理的缺点: 1.在拦截器中,切入点的推断是很复杂的 2.尽管实现了切面与目标类的松耦合,可是在拦截器中还得实现结合过程 一.springAOP的原理: 目标类:在目标类的方法调用的前后,我们须要增

spring aop的xml配置详解

在Spring配置文件中,所以AOP相关定义必须放在<aop:config>标签下,该标签下可以有<aop:pointcut>.<aop:advisor>.<aop:aspect>标签,配置顺序不可变. <aop:pointcut>:用来定义切入点,该切入点可以重用: <aop:advisor>:用来定义只有一个通知和一个切入点的切面: <aop:aspect>:用来定义切面,该切面可以包含多个切入点和通知,而且标签内部的