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框架是Java开发中不可或缺的一部分,它以其强大的依赖注入(DI)和面向切面编程(AOP)功能而闻名。这篇“学习Spring笔记_AOP_Annotation实现和XML实现”主要探讨了如何在Spring中利用注解和XML配置来实现AOP...
通过`@Before`、`@After`、`@Around`等注解,可以在特定方法调用前后插入自定义代码,实现如日志记录、性能监控等功能。 7. **源码分析**:深入理解Spring注解的工作原理,需要查看其源码。通过阅读Spring的源码,...
1. `@Override`:指示方法是重写父类的方法,编译器会进行检查以确保确实覆盖了父类的方法,避免因拼写错误而引发的意外。 2. `@Deprecated`:标记已过时的API,编译器会发出警告,提醒开发者使用其他替代方法。 3...
《MLDN学习笔记——Annotation》这篇博文主要探讨的是在编程领域中,特别是Java语言中,关于Annotation(注解)的深入理解和应用。Annotation是Java语言提供的一种元数据,它为程序提供了额外的信息,这些信息可以被...
Spring框架_day02笔记 Spring框架是Java平台上一个开源的应用程序框架,用于开发企业级应用程序。该框架提供了一个以Bean为中心的配置文件,并提供了依赖注入(Dependency Injection,DI)机制来管理应用程序中的...
Java学习笔记JDK6课件第17章主要讲解了注解(Annotation)的使用,注解是Java语言中一种非常重要的元数据机制,它允许程序员在源代码中嵌入额外的信息,这些信息可以被编译器、IDE或运行时环境读取,以实现特定的功能...
标题中的“Spring技术内幕 学习笔记”表明这是一份关于深入理解Spring框架核心机制的资料集合,主要关注Spring框架的内部工作原理和高级用法。描述中的“NULL”没有提供额外信息,但我们可以通过标签“源码”和...
- **模拟目标**:本节主要是理解Spring框架的核心功能——依赖注入(Dependency Injection, DI),并通过自定义的方式模拟其实现。 - **DI概念**:DI是一种软件设计模式,它提倡将组件之间的依赖关系由外部注入,而...
- **实现原理**:通过反射机制生成代理对象,该对象实现了目标对象的所有接口,并能在调用目标方法前后添加自定义的行为。 ##### 1.2 使用 CGLIB 生成代理 - **CGLIB**:CGLIB 是一个高性能的代码生成库,它可以...
SpringMVC提供了强大的表单验证功能,可以通过注解或自定义校验器来实现。 ##### 8.7 SpringMVC异常处理 SpringMVC支持异常处理机制,可以通过控制器方法或全局异常处理器来处理异常。 ##### 8.8 SpringMVC拦截器...
但如果你想禁用此功能,可以在配置文件中设置 `<context:annotation-config>` 或者在Java配置类上使用 `@EnableAutoConfiguration` 注解。 8. **备用候选者(Primary)**: - 如果有多个bean符合自动装配的条件,...
### Spring学习笔记知识点详解 #### 一、面向接口(抽象)编程的概念与好处 - **概念**:面向接口编程是一种编程范式,它强调通过接口(即定义一组方法的规范而不实现具体逻辑)来设计软件架构。这种方式的核心是将...
SSH整合是指将Spring、Struts2和Hibernate这三个流行的开源Java框架进行集成,以构建高效、模块化的Web应用程序。这三个框架分别负责不同的职责:Spring作为应用的基石,提供依赖注入(DI)和面向切面编程(AOP);...
2. **类与对象**:Java是一种面向对象的语言,它以类为构造单元,通过创建对象来实现功能。了解类的定义、封装、继承和多态性是理解Java OOP(面向对象编程)的关键。 3. **异常处理**:Java提供了异常处理机制,用...
- **AOP(Aspect Oriented Programming)**: 面向切面编程,一种编程范式,旨在通过预编译方式和运行期动态代理实现程序功能的统一维护。 ##### 2. AOP的核心概念 - **切面(Aspect)**: 表示关注点的模块化,比如事务...
- **Controller**:控制器处理用户请求,通常由开发者自定义,实现特定业务逻辑。 - **Model**:模型对象,包含了应用程序的数据。 - **View**:视图负责展示数据,Spring MVC 支持多种视图技术,如 JSP、...
反射在许多场景下都非常有用,比如在框架开发中,Spring框架就大量使用反射来实现依赖注入;在测试工具中,如JUnit,反射可以用于对私有方法进行测试;在动态代理中,反射可以创建并操作代理对象。然而,由于反射...
除了传统的XML配置方式外,Spring还支持通过注解(Annotation)来进行依赖注入。这种方式更加简洁、易于理解和维护。 1. **在`applicationContext.xml`文件中添加命名空间和Schema**: ```xml xmlns:xsi=...