Aop 工具类
Introeuct
JFinal Aop 提供了一个 Aop 工具类,可以方便的进行各种操作
使用
1、Aop
get(...)
Aop.get(...) 可以在任意时空创建对象并且对其进行依赖注入,例如:
Service service = Aop.get(Service.class);
以上代码会创建 Service 对象,如果 Service 中使用了 @Before 配置过拦截器,那么会生效,如果 Service 中的属性使用了 @Inject,则会被注入依赖对象。
import java.util.HashMap;
import java.util.Map;
public class IndexService {
public Map<String, String> index() {
Map<String, String> ret = new HashMap<>();
ret.put("data", "Hello 4");
return ret;
}
}
import java.util.Map;
import com.litongjava.jfinal.aop.Aop;
import com.litongjava.annotation.RequestPath;
import com.litongjava.tio.web.hello.service.IndexService;
@AController
@RequestPath("/")
public class IndexController {
@RequestPath()
public Map<String,String> index() {
return Aop.get(IndexService.class).index();
}
}
执行后返回的数据是
{"data":"Hello 4"}
这两个类构成了一个简单的 MVC (Model-View-Controller) 结构。
IndexService
类:- 这是一个服务类,包含一个
index
方法,用于创建并返回一个Map<String, String>
类型的数据。在这个方法中,它向Map
中添加了一个键值对"data": "Hello 4"
。
- 这是一个服务类,包含一个
IndexController
类:- 这是一个控制器类,标记了
@RequestPath("/")
,表明它处理根路径(/
)的 HTTP 请求。 - 其中的
index
方法通过Aop.get(IndexService.class).index()
调用IndexService
的index
方法。
- 这是一个控制器类,标记了
Aop.get
方法的作用是从 AOP(面向切面编程)容器中获取 IndexService
类的实例。这意味着 IndexService
类可能被作为一个单例来管理,它的实例化与生命周期可能由 AOP 框架来控制,而非手动创建。这种做法允许 IndexService
拥有如依赖注入、拦截器等 AOP 功能。
当 Aop.get 方法时,如果荣器中不存在对于的对象,Aop 容器会创建后在返回 当 IndexController
的 index
方法被调用时,它会返回 IndexService.index
方法生成的 Map
,即 {"data": "Hello 4"}
。
inject(...)
Aop.inject(...) 可以在任意时空对目标对象进行注入,该方法相对于 Aop.get(...) 方法少一个对象创建功能:
Service service = new Service(...);
Aop.inject(service);
以上代码将会对 Service 类中使用 @Inject 注解过的属性进行依赖注入。
beans
获取 Aop 容器中的所有 bean
String[] beans = Aop.beans();
2、AopManager
AopManager 用于管理 Aop 的各种配置
addMapping(...)
addMapping 用于建立接口、抽象类到其实现类之间的映射关系,例如:
AopManager.me().addMapping(Service.class, MyService.class);
通过上面的映射,下面的代码将会为 Serivce 创建 MyService 对象,而非 Service 对象:
// 这里获取到的是 MyService 对象
Aop.get(Service.class);
// 这里被注入的是 MyService 对象
@Inject
Service service;
AopManager.me().addMapping(...) 的用途是为接口、抽象类指定被注入的具体实现类。
ddSingletonObject(...)
由于 Aop 创建对象时不支持为构造方法传递参数,所以还需提供 addSingletonObject(...) 添加单例对象:
// Service 类的构造方法中传入了两个参数
Service service = new Service(paraAaa, paraBbb);
AopManager.me().addSingletonObject(service);
上面代码添加完成以后,可以在任何地方通过下面的方式获取单例对象:
// 获取时使用单例对象
service = Aop.get(Service.class);
// 注入时也可以使用前面配置的单例对象
@Inject
Service service;
在添加为单例对象之前还可以先为其注入依赖对象:
Service service = new Service(paraAaa, paraBbb);
// 这里是对 Service 进行依赖注入
Aop.inject(service);
// 为单例注入依赖以后,再添加为单例供后续使用
AopManager.me().addSingletonObject(service);
手动添加一个类到 Bean 容器中
AopManager.me().addSingletonObject(bean);
添加一个实现带有接口的实现类到 Bean 容器中
AopManager.me().addMapping(SharedPreferences.class, sharedPreferences.getClass());
AopManager.me().addSingletonObject(sharedPreferences);
AopManager.me().addMapping(SharedPreferences.class, sharedPreferences.getClass());
AopManager.me()
:这通常获取AopManager
的单例实例。AopManager
可能是一个管理 AOP 行为和配置的类。addMapping(SharedPreferences.class, sharedPreferences.getClass())
:这个方法调用可能是在告诉 AOP 框架,当遇到SharedPreferences
类型的依赖注入请求时,应该实例化sharedPreferences.getClass()
返回的类。这里SharedPreferences
是一个接口或类,而sharedPreferences.getClass()
是具体的实现类。
AopManager.me().addSingletonObject(sharedPreferences);
addSingletonObject(sharedPreferences)
:这个方法调用可能是在告诉 AOP 框架,sharedPreferences
对象应该被视为单例,并且在 AOP 框架的上下文中管理。这意味着当有依赖注入请求SharedPreferences
类型的实例时,框架会提供这个已经创建的sharedPreferences
实例。
setAopFactory(...)
setAopFactory(...) 用于用户扩展出 AopFactory 实现类,实现更多扩展性功能,例如 jboot 项目中对于注入远程访问对象的扩展:https://gitee.com/JbootProjects/jboot/blob/master/src/main/java/io/jboot/aop/JbootAopFactory.java ,JbootAopFactory.java 中的 doInjectRPC 即注入远程过程调用的实现类。