
之前看过大神的 美团组件化方案 ,其中提到了通过servicelaoder进行解耦的思路,主要是通过配置接口及其实现类的方式坐到接口隔离作用,本文主要是实现此思路并延伸出通过加载自定义properties文件获取参数配置信息
通过查看ServiceLoader源码可知,ServiceLoader是通过加载META-INF/services/路径下的接口实现类,加载方式是通过读取配置文件并通过反射的方式获取类的实例
1配置文件读取,获取文件流
其中PREFIX = "META-INF/services/";
由此可见加载路径是META-INF文件夹下面的文件
2通过流获取实现类全路径
其中parseLine方法里面是做了类全路径名校验
思路:
1读取配置文件
2获取配置的类全名
3通过反射获取类的实例
我们的配置文件将写在assets文件夹下
通过查看apk包结构可以发现assets文件夹位置是与META-INF平级的,由此我们可以将系统的ServiceLoader加载文件路径改为assets路径
1配置文件读取,获取文件流
2通过流获取接口类与实现类的对应集合
由于接口类与实现类是一对一关系,所以通过Map以键值对的方式存储接口类与实现类,在系统ServiceLoader做简单修改:
3获取实现类
在上一步已经获取了所有接口类和实现类的集合,在此通过接口类全名来获取实现类全名,并通过反射的方式获取实现类实例:
到此我们自定义ServiceLoader已经初步实现,在实际开发中,我们一般只需要一个实例及单利,在此我们可以用Map将类的实例与接口类名绑定起来即可。
使用
加载properties配置参数的思路与ServiceLoader基本一致,只是获取配置参数可以通过java类Properties获取
1获取流
和自定义ServiceLoader获取流一致
2获取Properties实例
3获取value
4使用
1在查看Iterable 接口时无意中发现了default关键字,经查看资料显示为java8新加的,用于在接口中写默认的方法函数体
有兴趣的可以去 >
Dao是数据访问层,用来保存数据。
Service是业务逻辑处理的。
我们开发程序的目的是为了完成业务功能, 理想的情况下程序中的每一条语句都应该是与业务直接相关的, 例如程序中不应该出现连接数据库, 读取某个字段等纯技术性的 *** 作, 而应该是得到用户A的基本信息等具有业务含义的 *** 作 dao(data access object)层存在的意义在于将与数据持久化相关的函数调用剥离出去, 提供一个具有业务含义的封装层 原则上说, dao层与utils等帮助类的功能非常类似, 只是更加复杂一些, 需要依赖更多的对象(如DataSource, SessionFactory)等 如果不需要在程序中屏蔽我们对于特定数据持久层技术的依赖, 例如屏蔽对于Hibernate的依赖, 在dao层我们没有必要采用接口设计 一些简单的情况下我们甚至可以取消整个dao层, 而直接调用封装好的一些通用dao *** 作函数, 或者调用通用的EntityDao类等
程序开发的过程应该是从业务对象层开始的, 并逐步将纯技术性的函数调用剥离到外部的帮助类中, 同时我们会逐渐发现一些业务 *** 作的特定组合也具有明确的含义, 为了调用的方便, 我们会把它们逐步补充到service层中 在一般的应用中, 业务逻辑很难稳定到可以抽象出接口的地步, 即一个service接口不会对应于两个不同的实现, 在这种情况下使用接口往往也是没有必要的
在使用spring的情况下原则上应该避免使用getBean的调用方式, 应该尽量通过注入来获得依赖对象, 但有时我们难免需要直接获取业务对象, 在不使用接口的情况下可以采用如下方式
class TaskService{
public static TaskService getInstance(){
return (TaskService)BeanLoadergetBean(TaskServiceclass);
}
}
在程序中我们可以直接使用TaskServicegetInstance()来得到TaskService对象通过命名规范的约定, 我们可以从类名推导出spring配置文件中的对象名, 因而不需要使用一个额外的硬编码字符串名
1、@Transactional使用位置
Ⅰ 写在接口类上,该接口的所有实现类的所有方法都会有事务;
Ⅱ 写在接口方法上,该接口的所有实现类的该方法都会有事务;
Ⅰ 写在实现类上,该类中的所有方法都会有事务;
Ⅱ 写在实现类方法上,该方法上有事务。
建议:写在实现类或实现类的方法上。
2、PlatformTransactionManager
PlatformTransactionManager是Spring中的事务管理接口,具体如下:
3、DataSourceTransactionManager
Spring中JDBC事务管理实现类是DataSourceTransactionManager,所以我们使用MyBatis时,如果需要进行事务管理则配置该事务管理即可。
1、基础准备
jdbcproperties如下:
JdbcConfig如下:
2、测试
1、相关注解
配置类注解,定义在配置类上。
设置当前Spring环境中开启注解式事务支持。
接口、类、方法注解,定义在接口、类、方法上。
为当前业务层方法添加事务(如果设置在类或接口上方则类或接口中所有方法均添加事务)。
2、事务角色
发起事务方,在Spring中通常指代业务层开启事务的方法。
加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法。
3、@Transactional常用属性
true只读事务,false读写事务,增删改要设为false,查询设为true。
设置超时时间单位秒,在多长时间之内事务没有提交成功就自动回滚,-1表示不设置超时时间。
当出现指定异常进行事务回滚。
4、事务传播行为
比如上述测试案例中,我们给log方法上的@Transactional设置了传播属性为REQUIRES_NEW,表示当前事务协调员会自己开启一个事务。并不会因为transfer发生回滚而回滚。
Ⅰ REQUIRED(默认);
Ⅱ SUPPORTS;
Ⅲ MANDATORY;
Ⅳ REQUIRES_NEW;
Ⅴ NOT_SUPPORTED;
Ⅵ NEVER;
Ⅶ NESTED。
以上即为Spring AOP-事务管理的全部内容,感谢阅读。
以上就是关于android自定义serviceloader接口隔离及获取自定义properties参数配置全部的内容,包括:android自定义serviceloader接口隔离及获取自定义properties参数配置、java Connection 是个接口、java web项目中dao的接口,实现类和service接口,实现类区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)