实现自定义注解,实现ioc与aop
实现自定义注解主要分三个步骤:
1.定义自己的注解类。
注解类默认继承Annotation接口。
且注解内的属性默认public(要给别人用的)
属性可以定义默认值也就是不给你的属性传值也会拥有默认。
注解里只允许基本类型,加上枚举,注解,String。
/**
* author: Badfsiher(yhy)
* date 2020/6/17 20:51
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.TYPE,ElementType.METHOD})
@Documented
public @interface MyService {
String value();
public String name() default "my service !";
}
/**
* author: Badfsiher(yhy)
* date 2020/6/17 21:12
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.FIELD})
@Documented
public @interface MyAutowired {
String value() default "my ioc Autowired";
String name();
Class clazz();
}
/**
* author: Badfsiher(yhy)
* date 2020/6/17 21:12
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.FIELD})
@Documented
public @interface MyTransactional {
}
然后解释一下我是用的注解上的几个元注解含义。
@Retention这个标志这需要在什么时候执行,也就三种编译时,解释时,运行时。
@Target这个主要定义你的注解使用的范围在方法属性,类名上等可以多个范围。
@Documented这个是标识可以输出到javadoc文档中
2.使用自定义注解标记实用位置
根据自己定义的注解适用范围为自己的类或者属性做好自己的注解
/**
* author badfisher
*/
@MyService
@MyTransactional
public class TransferServiceImpl implements TransferService { @MyAutowired(name="AccountDao",clazz = JdbcAccountDaoImpl.class)
private AccountDao accountDao;
@MyAutowired(name="TransactionManager",clazz = TransactionManager.class)
private TransactionManager transactionManager; public TransferServiceImpl() throws SQLException {
}
3.获取自己标记的方法和类完成相应的逻辑。
public static <T> T getClass(String clazz) throws Exception{
//扫描需要的类
Class result = null;
try {
result = Class.forName(clazz);
} catch (ClassNotFoundException e) {
System.out.println("类加载失败!");
e.printStackTrace();
}
//获取所有属性
Field[] fields = result.getDeclaredFields();
T res = (T) result.getDeclaredConstructor().newInstance();
//接口名称
String intfceName = "";
for (Field field : fields){
// 获取属性上
MyAutowired myAutowired = field.getAnnotation(MyAutowired.class);
if (myAutowired != null){
intfceName =myAutowired.name();
Object object = getClass(myAutowired.clazz());
map.put(intfceName,object);
if (!field.isAccessible())
field.setAccessible(true);
try {
field.set(res,object);
} catch (IllegalAccessException e) {
e.printStackTrace();
System.out.println("MyAutowired the " + field.getName() + "failed!!");
}
}
}
map.put(intfceName,res);
return res;
}
// 对外提供获取实例对象的接口(根据id获取)
public static Object getBean(String id) {
return map.get(id);
}
中间考虑到注入的类中还有存在依赖那么我们会继续对他进行检查知道这一条业务所有类反射出来。
事物方面,获取注解后使用动态代理可以很简单控制方法。
/**
* Jdk动态代理
*/
public Object getJdkProxy(Object obj) { // 获取代理对象
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null; try{
// 开启事务(关闭事务的自动提交)
transactionManager.beginTransaction(); result = method.invoke(obj,args); // 提交事务 transactionManager.commit();
}catch (Exception e) {
e.printStackTrace();
// 回滚事务
transactionManager.rollback(); // 抛出异常便于上层servlet捕获
throw e;
}
return result;
}
}); }
以上就是相关整体功能实现和主要代码了。
实现自定义注解,实现ioc与aop的更多相关文章
- 自定义注解实现(spring aop)
1.基本概念 1.1 aop 即面向切面编程,优点是耦合性低,能使业务处理和切面处理分开开发,扩展和修改方面,当引入了注解方式时,使用起来更加方便. 1.2 应用场景 打日志.分析代码执行时间.权限控 ...
- springboot aop 自定义注解方式实现完善日志记录(完整源码)
版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 一:功能简介 本文主要记录如何使用aop切面的方式来实现日志记录功能. 主要记录的信息有: 操作人,方法名,参数,运行时间,操作类型 ...
- springboot aop 自定义注解方式实现一套完善的日志记录(完整源码)
https://www.cnblogs.com/wenjunwei/p/9639909.html https://blog.csdn.net/tyrant_800/article/details/78 ...
- 自定义注解日志功能与shrio框架冲突的问题
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w ...
- Spring Boot实现自定义注解
在Spring Boot项目中可以使用AOP实现自定义注解,从而实现统一.侵入性小的自定义功能. 实现自定义注解的过程也比较简单,只需要3步,下面实现一个统一打印日志的自定义注解: 1. 引入AOP依 ...
- 使用AOP实现方法执行时间和自定义注解
环境:IDEA2018+JDK1.8+SpringBoot 第一步:在pom文件中引入依赖(度娘有很多(*^▽^*)): <!--引入AOP的依赖--><dependency> ...
- ssm+redis 如何更简洁的利用自定义注解+AOP实现redis缓存
基于 ssm + maven + redis 使用自定义注解 利用aop基于AspectJ方式 实现redis缓存 如何能更简洁的利用aop实现redis缓存,话不多说,上demo 需求: 数据查询时 ...
- 如何通过自定义注解实现AOP切点定义
面向切面编程(Aspect Oriented Programming, AOP)是面向对象编程(Object Oriented Programming,OOP)的强大补充,通过横切面注入的方式引入其他 ...
- 利用Spring AOP自定义注解解决日志和签名校验
转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...
- AOP通过反射获取自定义注解
自定义注解: @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component publ ...
随机推荐
- software engineering homework 2
博客信息 沈阳航空航天大学计算机学院2020软件工程作业 作业要求 https://edu.cnblogs.com/campus/sau/Computer1701-1705/homework/1058 ...
- 后台调用 WEBAPI 几种方式
示例是调用谷歌短网址的API. 1. HttpClient方式: public static async void DoAsyncPost() { DateTime dateBegin = DateT ...
- PVE联网及更换国内源
一.PVE联网 第一次安装PVE,正常情况下PVE的IP是在我们上网的网段的.没有网络有可能是没有配置DNS服务器地址或DNS地址是软路由网关地址.解决方法有3种: 1:设置DHCP自动获取网络地址和 ...
- 生成Funnel漏斗图
-----------第一步----------- import jsonlist_p = [{"action":"浏览商品","PV":5 ...
- Java mysql查询数据库重复数据(单个或多个字段)
查询表重复数据: SELECT * FROM 表1 f WHERE (f.字段1,f.字段2) in (SELECT 字段1,字段2 FROM 表1 GROUP BY 字段1,字段2 HAVING c ...
- org.nutz.http.Http忽略https SSL证书验证
访问的是一个https get请求,报错需要SSL证书验证,以下方法直接跳过 boolean check = Http.disableJvmHttpsCheck(); // 忽略https的证书检查
- Unity 安装的编辑器版本不见了 记录问题
新的一天打开unity 报错,然后再打开就找不到我之前安装的编辑器版本了 (猜测是我不正常关闭的原因吧,不懂这个) 之前在网上找到过解决办法,后来找不到了.趁现在还记得,记录一下 先把进程停了 再把缓 ...
- bitmap_find_next_zero_area_off函数
备注:
- 语法分析~LL1的实现
语法分析之 LL1分析法实现 一.设计目的 根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析.本次实验的目的主要是加深对预测分析LL(1)分析法的理解. 二.设计要求 程序输入/ ...
- Mysql_5.7编译部署
自述 - 概述:数据库是"按照数据结构来组织.存储和管理数据的仓库".是一个长期存储在计算机内的.有组织的.可共享的.统一管理的大量数据的集合:本文主要介绍mysql_5.7的部署 ...