实现自定义注解,实现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 ...
随机推荐
- js获取当前日期的前七天,月份+日(数组)
1.定义一个空对象. let dayArr = []: 2.时间格式化 function formatterDate(date,fmt){ let nowDate = { yyy ...
- IDEA2021 在jsp文件中 写out报错
报错原因: 是因为没有关联好服务器: 解决方案 File --> Project structure --> Modules --> 选中当前的模板 --> Dependenc ...
- getElementsByClassName()获取不到值
在这种方式下,虽然使用了getElementsByClassName方法,但是并不能获得到值.从执行顺序上来说,在HTML还没有执行的时候JS就已经开始执行了,所以获得的值不能够获得到.因此,如果遇到 ...
- java不返回某些字段,包括 null
一.使用 fastjson 包. (1) SimplePropertyPreFilter 可以将需要的字段留下来. import com.alibaba.fastjson.JSON;import co ...
- vue iview前端直接上传OSS
1. 首先安装oss npm install ali-oss --save 2. // template部分 <Upload ref="upload" type=" ...
- 归纳了一下AD的快捷键
1:shift+s 键 切换单层显示 2:q 英寸和毫米 尺寸切换3:D+R进入布线规则设置.其中 Clearance 是设置最小安全线间距,覆铜时候间距的.比较常用4:CTRL+鼠标单击某个 ...
- Java学习笔记(二)环境
卸载JDK 1.删除java的安装目录 2.删除JAVA_HOME 3.删除path下关于java的目录 4.java -version 配置环境变量 1.我的电脑-->右键-->属性 ...
- Python subnet 操作物件
subnetcalc.py class SubnetCalc(object): def __init__(self, network, mask): self.network = network.sp ...
- circos plot in R
FIN=read.table(IN,header=TRUE) circos.clear() circos.par("start.degree" = 90) circos.initi ...
- Java中的方法增强
A:在不影响业务情况下,增强一个方法有几种方法呢? B:3种! A:哪三种呀? 一.继承类来重写方法: 1.要可以获取这个类的构造: class Man{ public void run(){ Sys ...