`
leh627
  • 浏览: 23407 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

自定义annotation 实现注入功能(笔记,以备后查)

阅读更多
1.Annotation  class
package com.test;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.FIELD,ElementType.METHOD })//允许在method 和 field 使用annotation
public @interface ServiceInject {
   Class name();
}


2. service 接口,及2个实现方法
package com.test;

public interface ITestService {
        public String save();
}


package com.test;

public class TestService_1 implements ITestService {

	public String save() {
		return this.getClass().getSimpleName() +" class was invoked";
	}

}


package com.test;

public class TestService_2 implements ITestService {

	public String save() {
		return this.getClass().getSimpleName()+" class was invoked";
	}

}


3. 模拟的拦截器
package com.test;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class SimilarToTheInterceptor {
	public static void scanAllFieldsAndMethods(Object obj) {
		Field[] fields = obj.getClass().getDeclaredFields();// 获取所有类型的field
		Method[] methods = obj.getClass().getMethods(); // 方法一般是public 
		for (Field f : fields) {
			if (f.isAnnotationPresent(ServiceInject.class)) {
				ServiceInject ie = f.getAnnotation(ServiceInject.class);
				Class name = ie.name();
				boolean flag = f.isAccessible();//保存当前field的修饰类型
				try {
					f.setAccessible(true);//强制field 可以访问
					f.set(obj, f.getType().cast(name.newInstance()));//使用cast 强制转换类型
					f.setAccessible(flag);//还原当前field 的修饰类型,避免被不非法使用
				} catch (IllegalArgumentException e) {
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				} catch (InstantiationException e1) {
					e1.printStackTrace();
				}

			}
		}
		for (Method m : methods) {//set注入
			if (m.isAnnotationPresent(ServiceInject.class) && m.getName().indexOf("set")!=-1)  {
				ServiceInject ie = m.getAnnotation(ServiceInject.class);
				Class name = ie.name();
				try {
					m.setAccessible(true);
					m.invoke(obj, name.newInstance());
				} catch (IllegalArgumentException e) {
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				} catch (InstantiationException e1) {
					e1.printStackTrace();
				} catch (InvocationTargetException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}
		}
	}

}



4.模拟的Action
package com.test;


@SuppressWarnings("unused")
public class TestAction {
	@ServiceInject(name = TestService_1.class)
	public ITestService testService1;
	
	private ITestService testService2;
   

	public void saveDate1() {
		System.out.println("==========Saved======"+testService1.save());
	}
	public void saveDate2() {
		System.out.println("==========Saved======"+testService2.save());
	}


	@ServiceInject(name = TestService_2.class)
	public void setTestService2(ITestService testService2) {
		this.testService2 = testService2;
	}
	
}



5. 测试类
package com.test;

public class Main {
	public static void main(String[] args) {
          TestAction  action = new TestAction();
          SimilarToTheInterceptor.scanAllFieldsAndMethods(action);// 模拟拦截器功能
          action.saveDate1();
          action.saveDate2();
	}
}



6. 结果:
==========Saved======TestService_1 class was invoked
==========Saved======TestService_2 class was invoked
分享到:
评论

相关推荐

    学习Spring笔记_AOP_Annotation实现和XML实现

    Spring框架是Java开发中不可或缺的一部分,它以其强大的依赖注入(DI)和面向切面编程(AOP)功能而闻名。这篇“学习Spring笔记_AOP_Annotation实现和XML实现”主要探讨了如何在Spring中利用注解和XML配置来实现AOP...

    学习Spring笔记_Annotation(注解)_Component

    通过`@Before`、`@After`、`@Around`等注解,可以在特定方法调用前后插入自定义代码,实现如日志记录、性能监控等功能。 7. **源码分析**:深入理解Spring注解的工作原理,需要查看其源码。通过阅读Spring的源码,...

    java5.0新特性总结--Annotation系统学习整理笔记

    1. `@Override`:指示方法是重写父类的方法,编译器会进行检查以确保确实覆盖了父类的方法,避免因拼写错误而引发的意外。 2. `@Deprecated`:标记已过时的API,编译器会发出警告,提醒开发者使用其他替代方法。 3...

    MLDN学习笔记 —— Annotation

    《MLDN学习笔记——Annotation》这篇博文主要探讨的是在编程领域中,特别是Java语言中,关于Annotation(注解)的深入理解和应用。Annotation是Java语言提供的一种元数据,它为程序提供了额外的信息,这些信息可以被...

    spring--day02笔记.doc

    Spring框架_day02笔记 Spring框架是Java平台上一个开源的应用程序框架,用于开发企业级应用程序。该框架提供了一个以Bean为中心的配置文件,并提供了依赖注入(Dependency Injection,DI)机制来管理应用程序中的...

    java学习笔记JDK6课件之十七

    Java学习笔记JDK6课件第17章主要讲解了注解(Annotation)的使用,注解是Java语言中一种非常重要的元数据机制,它允许程序员在源代码中嵌入额外的信息,这些信息可以被编译器、IDE或运行时环境读取,以实现特定的功能...

    Spring技术内幕 学习笔记

    标题中的“Spring技术内幕 学习笔记”表明这是一份关于深入理解Spring框架核心机制的资料集合,主要关注Spring框架的内部工作原理和高级用法。描述中的“NULL”没有提供额外信息,但我们可以通过标签“源码”和...

    spring框架案例学习文档笔记

    - **模拟目标**:本节主要是理解Spring框架的核心功能——依赖注入(Dependency Injection, DI),并通过自定义的方式模拟其实现。 - **DI概念**:DI是一种软件设计模式,它提倡将组件之间的依赖关系由外部注入,而...

    传智播客 Spring 完全文档 笔记总结

    - **实现原理**:通过反射机制生成代理对象,该对象实现了目标对象的所有接口,并能在调用目标方法前后添加自定义的行为。 ##### 1.2 使用 CGLIB 生成代理 - **CGLIB**:CGLIB 是一个高性能的代码生成库,它可以...

    java常用框架学习笔记

    SpringMVC提供了强大的表单验证功能,可以通过注解或自定义校验器来实现。 ##### 8.7 SpringMVC异常处理 SpringMVC支持异常处理机制,可以通过控制器方法或全局异常处理器来处理异常。 ##### 8.8 SpringMVC拦截器...

    spring学习笔记(六)

    但如果你想禁用此功能,可以在配置文件中设置 `<context:annotation-config>` 或者在Java配置类上使用 `@EnableAutoConfiguration` 注解。 8. **备用候选者(Primary)**: - 如果有多个bean符合自动装配的条件,...

    Spring学习笔记

    ### Spring学习笔记知识点详解 #### 一、面向接口(抽象)编程的概念与好处 - **概念**:面向接口编程是一种编程范式,它强调通过接口(即定义一组方法的规范而不实现具体逻辑)来设计软件架构。这种方式的核心是将...

    初学ssh整合项目笔记

    SSH整合是指将Spring、Struts2和Hibernate这三个流行的开源Java框架进行集成,以构建高效、模块化的Web应用程序。这三个框架分别负责不同的职责:Spring作为应用的基石,提供依赖注入(DI)和面向切面编程(AOP);...

    java的笔记资料文档

    2. **类与对象**:Java是一种面向对象的语言,它以类为构造单元,通过创建对象来实现功能。了解类的定义、封装、继承和多态性是理解Java OOP(面向对象编程)的关键。 3. **异常处理**:Java提供了异常处理机制,用...

    学习spring时的笔记 二

    - **AOP(Aspect Oriented Programming)**: 面向切面编程,一种编程范式,旨在通过预编译方式和运行期动态代理实现程序功能的统一维护。 ##### 2. AOP的核心概念 - **切面(Aspect)**: 表示关注点的模块化,比如事务...

    spring学习文档及源码笔记

    - **Controller**:控制器处理用户请求,通常由开发者自定义,实现特定业务逻辑。 - **Model**:模型对象,包含了应用程序的数据。 - **View**:视图负责展示数据,Spring MVC 支持多种视图技术,如 JSP、...

    狂神说笔记,个人觉得不赖

    反射在许多场景下都非常有用,比如在框架开发中,Spring框架就大量使用反射来实现依赖注入;在测试工具中,如JUnit,反射可以用于对私有方法进行测试;在动态代理中,反射可以创建并操作代理对象。然而,由于反射...

    spring笔记

    除了传统的XML配置方式外,Spring还支持通过注解(Annotation)来进行依赖注入。这种方式更加简洁、易于理解和维护。 1. **在`applicationContext.xml`文件中添加命名空间和Schema**: ```xml xmlns:xsi=...

Global site tag (gtag.js) - Google Analytics