shiro技术四大组件和运行原理是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shiro技术四大组件和运行原理是啥?相关的知识,希望对你有一定的参考价值。

subject:主体,可以是用户也可以是程序,主体要访问系统,系统需要对主体进行认证、授权。
securityManager:安全管理器,主体进行认证和授权都是通过securityManager进行。
authenticator:认证器,主体进行认证最终通过authenticator进行的。
authorizer:授权器,主体进行授权最终通过authorizer进行的。
认证执行流程
1、通过ini配置文件创建securityManager
2、调用subject.login方法主体提交认证,提交的token
3、securityManager进行认证,securityManager最终由ModularRealmAuthenticator进行认证。
4、ModularRealmAuthenticator调用IniRealm(给realm传入token)
去ini配置文件中查询用户信息
5、IniRealm根据输入的token(UsernamePasswordToken)从
shiro.ini查询用户信息,根据账号查询用户信息(账号和密码)
如果查询到用户信息,就给ModularRealmAuthenticator返回用户信息(账号和密码)
如果查询不到,就给ModularRealmAuthenticator返回null
6、ModularRealmAuthenticator接收IniRealm返回Authentication认证信息
如果返回的认证信息是null,ModularRealmAuthenticator抛出异常
参考技术A 搜一下:shiro技术四大组件和运行原理是什么?

Android N 四大组件的工作原理

参考技术A 本文侧重讲解android N 系统中四大组件的工作原理,不同系统原理略有差别。通过分析四大组件的工作流程加深对Android Framework的理解,也为插件化开发打下基础。

Activity
展示一个界面并和用户交互,它扮演的是一个前台界面的角色。

Service
计算型组件,用于后台执行一系列计算任务,工作在主线程,耗时操作需要另起线程, 分为启动状态和绑定状态。

BroadcastReceiver
消息型组件,主要用于不同组件或者不同应用之间的消息传递,它工作在系统内部,不适合执行耗时操作,操作超过5s,会出现ANR。

ContentProvider
数据共享型组件,用于向其他组件或者应用共享数据,主要执行CURD操作。

我们启动一个activity有两种方法,
第一种(Activity直接启动方式):
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);

第二种(Context启动方式)
Intent intent = new Intent(this, MainActivity.class);
getApplicationContext().startActivity(intent);

不同的启动方式Activity的工作流程有点差别。

两种启动都会调用到Instrumentation类中的execStartActivity的方法,系统最终是通过ActivityThread中的performLaunchActivity完成Activity的创建和启动。
performLaunchActivity方法主要完成以下工作:
1、通过ActivityClientRecord对象获取启动activity的组件信息
2、通过mInstrumentation对象的newActivity方法调用classloader完成activity的创建
3、通过r.packageInfo(LoadedApk 对象)的makeApplication方法尝试创建Application对象
4、创建ContextImpl对象并调用Activity的attach方法完成一些数据的初始化
5、调用Activity的onCreate方法

在Activity启动的过程中,App进程会频繁地与AMS进程进行通信:

App进程会委托AMS进程完成Activity生命周期的管理以及任务栈的管理;这个通信过程AMS是Server端,App进程通过持有AMS的client代理IActivityManager完成通信过程;
AMS进程完成生命周期管理以及任务栈管理后,会把控制权交给App进程,让App进程完成Activity类对象的创建,以及生命周期回调;这个通信过程也是通过Binder完成的,App所在server端的Binder对象存在于ActivityThread的内部类ApplicationThread;AMS所在client通过持有IApplicationThread的代理对象完成对于App进程的通信。

Service有两种启动方式,startService()和bindService(),两种状态可以并存:
startService流程

bindService流程

BroadcastReceiver的工作过程主要包括广播的注册、发送和接收:

动态注册过程:

发送过程

静态注册是由PackageManagerService(PMS)在应用安装的时候完成整个注册过程的,除广播以外,其他三大组件也都是在应用安装时由PMS解析并注册的。

每个进程的入口都是ActivityThead.main(),App的启动流程如下:

从源码中可以看出:
应用启动的入口为ActivityThread的main方法,main方法会创建ActivityThread实例并创建主线程消息队列。
attach方法中远程调用AMS的attachApplication方法,并提供ApplicationThread用于和AMS的通信。
attachApplication方法会通过bindApplication方法和H来调回ActivityThread的handleBindApplication,这个方法会先创建Application,再加载ContentProvider,然后才会回调Application的onCreate方法。

由上图可以看出,在ContentProvider的启动过程中伴随着app进程的启动。

ContentProvider的其他CURD操作如insert,delete,update跟query的流程类似。

以上是关于shiro技术四大组件和运行原理是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Service启动过程and新进程创建全过程源码分析

从源码的角度理解四大组件的工作过程——Android开发艺术探索笔记

四大组件之Service生命周期

第九章:四大组件的工作过程

Android四大组件——Service

安卓四大组件之服务服务的生命周期和启动方式