实现自定义注解主要分三个步骤:

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的更多相关文章

  1. 自定义注解实现(spring aop)

    1.基本概念 1.1 aop 即面向切面编程,优点是耦合性低,能使业务处理和切面处理分开开发,扩展和修改方面,当引入了注解方式时,使用起来更加方便. 1.2 应用场景 打日志.分析代码执行时间.权限控 ...

  2. springboot aop 自定义注解方式实现完善日志记录(完整源码)

    版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 一:功能简介 本文主要记录如何使用aop切面的方式来实现日志记录功能. 主要记录的信息有: 操作人,方法名,参数,运行时间,操作类型 ...

  3. springboot aop 自定义注解方式实现一套完善的日志记录(完整源码)

    https://www.cnblogs.com/wenjunwei/p/9639909.html https://blog.csdn.net/tyrant_800/article/details/78 ...

  4. 自定义注解日志功能与shrio框架冲突的问题

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w ...

  5. Spring Boot实现自定义注解

    在Spring Boot项目中可以使用AOP实现自定义注解,从而实现统一.侵入性小的自定义功能. 实现自定义注解的过程也比较简单,只需要3步,下面实现一个统一打印日志的自定义注解: 1. 引入AOP依 ...

  6. 使用AOP实现方法执行时间和自定义注解

    环境:IDEA2018+JDK1.8+SpringBoot 第一步:在pom文件中引入依赖(度娘有很多(*^▽^*)): <!--引入AOP的依赖--><dependency> ...

  7. ssm+redis 如何更简洁的利用自定义注解+AOP实现redis缓存

    基于 ssm + maven + redis 使用自定义注解 利用aop基于AspectJ方式 实现redis缓存 如何能更简洁的利用aop实现redis缓存,话不多说,上demo 需求: 数据查询时 ...

  8. 如何通过自定义注解实现AOP切点定义

    面向切面编程(Aspect Oriented Programming, AOP)是面向对象编程(Object Oriented Programming,OOP)的强大补充,通过横切面注入的方式引入其他 ...

  9. 利用Spring AOP自定义注解解决日志和签名校验

    转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...

  10. AOP通过反射获取自定义注解

    自定义注解: @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component publ ...

随机推荐

  1. 基于MassTransit.RabbitMQ的延时消息队列

    1 nuget包 <PackageReference Include="MassTransit.RabbitMQ" Version="8.0.2" /&g ...

  2. CentOS 8.x下编译php 7.4、php5.6、php5.3多版本报错处理教程

    一.编译安装php 7.4.x 参考CentOS 8.0.1905编译安装Nginx1.16.1+MySQL8.0.18+PHP7.3.10 1.安装编译工具及库文件(使用yum命令安装) yum i ...

  3. PLC入门笔记8

    梯形图基础电路 起保停电路 多点起保停电路 互锁控制电路 周期闪烁电路 这应该是等价的!! 定时器的接力电路 同 延时接通,延时断开电路 同 保持信号变脉冲信号电路 定时器TON 接通延时变断开延时电 ...

  4. Java 实现汉字按照首字母分组排序

    一.实现思路: 1.将数据list 进行排序Collections,排序后是按照汉字字母排序的 2.循环找出26个字母,以字母为key,以list中相同首字母的数据为值(集合) 二.代码实现: // ...

  5. Day03_Class01

    用户交互Scanner Scanner对象 基本语法 Scanner sc = new Scanner(System.in); 通过Scanner类的next()与nextLine()方法获取输入的字 ...

  6. Python笔记(1)——字符串(Python编程:从入门到实践)

    字符串 一.使用方法修改字符串大小写 1. 方法:变量.tittle():首字母大学显示字符串中的每个英文单词 2. 方法:变量.upper():字符串全改为大写 3. 方法:变量.lower():将 ...

  7. SQL语句底层执行顺序

    1. SELECT 语句的完整结构 SQL92语法: SELECT ...,....,(存在聚合函数) FROM ...,...,... WHERE 多表的连接条件 AND 不包含聚合函数的过滤条件 ...

  8. 查看app包名

    操作步骤: 1.cmd中输入命令:adb shell am monitor 2.启动需要获取包名的应用

  9. 图的基本操作 (c语言)

    图的基本操作:创建 删除 遍历 创建:邻接矩阵和邻接表 十字链表 下面代码是邻接矩阵的定义和邻接表的创建 遍历:深度优先遍历(一条路走到黑) 广度优先遍历(树的层次遍历) 具体代码: #include ...

  10. LeetCode 94. 二叉树的中序遍历()

    原题解 题目 约束 题解 方法一 class Solution { public: void inorder(TreeNode* root, vector<int>& res) { ...