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

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. Spring面试题大汇总

    1.Spring的IOC和AOP机制? 我们在使用spring框架其实就是为了实现IOC,依赖注入,和AOP,面向切面编程,主要有两种设计模式工厂模式和代理模式,IOC就是典型的工厂模式,通过sess ...

  2. VOIP(SIP)呼叫环境及流程试验

    宿主机:win11  IP: .1         PHONE: 102 虚拟机: v11     IP: .129     SIP SERVER 虚拟机: v10     IP: .128      ...

  3. testNG框架之我见

    testNG框架中会有一个xml文件夹,里面放xml文件,之后必须要在pom文件中配置 xml文件中有一个suite,在suite中可以配置parameter参数.test用例,还可以添加listen ...

  4. centos 发送邮件

    安装mailx yum install -y mailx 配置邮件服务器信息 vi /etc/mail.rc set from=xxxx@yyy.com set smtp=smtp.yyy.com s ...

  5. 2003031126-石升福-python数据分析第四周作业-第二次作业

    项目 matplotlib 博客名称 2003031126-石升福-Python数据分析第四周作业 班级链接 20级数据班 作业链接 第二次作业 要求 每道题要有题目,代码(使用插入代码,不会插入代码 ...

  6. cmake 实现交叉编译注意事项

    (1)确保安装交叉编译工具安装成功 在终端输入arm-linux-gnueabihf-g++ -v 或 arm-linux-gnueabihf-gcc -v ,能看到相应交叉C编译器和C++编译器的版 ...

  7. dosbox debugger

    通过中断看程序运行过程 最终目的是要找到数据保存位置,如何保存到文件的.

  8. 【前端工程化】使用Nexus 搭建前端 npm 私服

    参考文献1 - https://blog.51cto.com/lookingdream/3609619 参考文献2 - https://blog.csdn.net/u013278374/article ...

  9. echarts数据过小,log类型无法出现刻度线,并将y轴转为科学计数法

    方法仅供参考 可以更改logBase的值,数值越小刻度线越多,但也会出现,刻度值重复的问题,看各自需要,其次是对数据进行处理,全部变成大于1的数,最后在echarts的图表显示设置中更改回来 注意:对 ...

  10. OpenStack组件说明

    1.版本对应组件 2.Juno版本的核心组件