J'ai entendu dire que quelqu'un a été interrogé sur le modèle de conception?Suivez - moi et répondez avec le code source mybatis, expert technique d'Ali

Reste debout toute la nuit. 2021-08-20 00:16:15 阅读数:41

ai entendu dire que quelqu
 public MapperProxyFactory(Class
mapperInterface)
{
this.mapperInterface = mapperInterface;
}
public Class
getMapperInterface
()
{
return mapperInterface;
}
public Map
getMethodCache
()
{
return methodCache;
}
@SuppressWarnings(
"unchecked")
protected T newInstance(MapperProxy
mapperProxy)
{
return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(),
new Class[] { mapperInterface },
mapperProxy);
}
public T newInstance(SqlSession sqlSession) {
final MapperProxy
mapperProxy =
new MapperProxy
(sqlSession, mapperInterface, methodCache);
return newInstance(mapperProxy);
}

}

Ici,Passe d'abord.T newInstance(SqlSession sqlSession) La méthode obtient un MapperProxyObjet,Puis appelezT newInstance(MapperProxy mapperProxy) Générer un objet Proxy et retourner .
Et voir MapperProxyCode,Vous pouvez voir ce qui suit:

  • 1.
  • 2.
  • 3.

publicclass MapperProxy<T> implements InvocationHandler, Serializable {

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try {
if (Object.class.equals(method.getDeclaringClass())) {
return method.invoke(this, args);
} elseif (isDefaultMethod(method)) {
return invokeDefaultMethod(proxy, method, args);
}
} catch (Throwable t) {
throw ExceptionUtil.unwrapThrowable(t);
}
final MapperMethod mapperMethod = cachedMapperMethod(method);
return mapperMethod.execute(sqlSession, args);
}

}

 Très typique. ,LeMapperProxyClasse implémentéeInvocationHandlerInterface, Et implémente l'interface invokeMéthodes.
De cette façon, Nous avons juste besoin d'écrire Mapper.javaClasse d'interface, Lorsque vous effectuez réellement Mapper Au moment de l'interface , Sera transmis à MapperProxy.invokeMéthodes
Cette méthode appelle ensuite sqlSession.cud>executor.execute>prepareStatementAttendez une série de méthodes,Terminé.SQL Exécution et retour .
##5、Mode combiné
Mode combiné combiner plusieurs objets pour former une structure arborescente pour représenter“Total-Section” Hiérarchie structurelle .
Mode combiné à un seul objet ( Sous - objet feuille ) Et combiner des objets ( Combiner des objets ) Cohérence , Il organise les objets dans une structure arborescente ,Peut être utilisé pour décrire la relation entre l'ensemble et la partie.
Et il brouille les éléments simples ( Sous - objet feuille ) Et des éléments complexes ( Objet conteneur )Le concept de,Permet au client de traiter des éléments complexes comme s'il s'agissait d'éléments simples,Cela permet au programme client de découpler la structure interne des éléments complexes.
Un point à noter lors de l'utilisation du mode combiné est également le point le plus critique du mode combiné:L'objet Leaf et l'objet composite implémentent la même interface.C'est pourquoi le mode combiné peut traiter les noeuds de feuille et d'objet de façon cohérente.
![](https://s2.51cto.com/images/20210819/1629388693661586.jpg)
Mybatis Soutenir la dynamique SQL La puissance de ,Comme celle ci - dessous.SQL:
![](https://s2.51cto.com/images/20210819/1629388694298737.jpg)
Il est utilisé ici. trim、if Élément isodynamique ,Il est possible de générer desSQL;
InDynamicSqlSource.getBoundSqlMéthode,AppelérootSqlNode.apply(context)Méthodes,applyLa méthode est l'interface que tous les noeuds dynamiques implémentent:

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

publicinterface SqlNode {
boolean apply(DynamicContext context);
}

 Pour réaliser SqlSource Tous les noeuds de l'interface ,Ce sont les noeuds individuels de l'arbre de mode combiné entier:
![](https://s2.51cto.com/images/20210819/1629388698318694.jpg)
La simplicité du modèle combinatoire est ,Tous les noeuds enfants sont du même type, Peut être exécuté Récursivement vers le bas ,Comme pourTextSqlNode,Parce que c'est le noeud foliaire le plus bas, Par conséquent, le contenu correspondant sera directement appendÀSQLDans la Déclaration:

  • 1.
  • 2.
  • 3.

@Override
public boolean apply(DynamicContext context) {
GenericTokenParser parser = createParser(new BindingTokenParser(context, injectionFilter));
context.appendSql(parser.parse(text));
returntrue;
}

Mais pourIfSqlNode, Il faut d'abord juger. , Si le jugement passe , L'élément enfant sera toujours appelé SqlNode,C'est - à - dire:contents.applyMéthodes, Réalisation de l'analyse récursive .

  • 1.

@Override
public boolean apply(DynamicContext context) {
if (evaluator.evaluateBoolean(test, context.getBindings())) {
contents.apply(context);
returntrue;
}
returnfalse;
}

##6、Mode de méthode du modèle
Le modèle de méthode est l'un des modèles les plus courants de tous,Est la technologie de base de la réutilisation de code basée sur l'héritage.
Les modèles méthodologiques nécessitent une collaboration entre les concepteurs qui développent des classes abstraites et des sous - classes spécifiques.Un concepteur est chargé de donner les contours et le squelette d'un algorithme,D'autres concepteurs sont chargés de donner les étapes logiques de cet algorithme.
Les méthodes qui représentent ces étapes logiques spécifiques sont appelées méthodes de base(primitive method);Et la façon dont ces méthodes de base sont regroupées est appelée la méthode du modèle(template method),Le nom de ce modèle de design vient de.
La classe Template définit le squelette d'un algorithme en action,Et reporter certaines étapes à la Sous - classe.Permet aux sous - classes de redéfinir certaines étapes spécifiques d'un algorithme sans modifier sa structure.
![](https://s2.51cto.com/images/20210819/1629388698816766.jpg)
InMybatisMoyenne,sqlSessionDeSQLMise en œuvre, Tout est confié à ExecutorRéalisé,Executor Contient les structures suivantes: :
![](https://s2.51cto.com/images/20210819/1629388706549414.jpg)
Dont:BaseExecutor La méthode du modèle est adoptée. , Il réalise la plupart des SQL Logique d'exécution ,Ensuite, les méthodes suivantes sont données à la Sous - classe pour la personnalisation complète:

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

protected abstract int doUpdate(MappedStatement ms, Object parameter) throws SQLException;

protected abstract List

doFlushStatements
(boolean isRollback)
throws SQLException

;

protectedabstract

List

doQuery
(MappedStatement ms, Object parameter, RowBounds rowBounds,
ResultHandler resultHandler, BoundSql boundSql)
throws SQLException

;

La classe de méthode template a plusieurs sous - classes pour implémenter, Différentes stratégies sont utilisées :
Simple.SimpleExecutor: Chaque exécution updateOuselect, Juste un. StatementObjet, Fermer immédiatement après utilisation StatementObjet.(C'est possible.StatementOuPrepareStatementObjet)
RéutilisationReuseExecutor:Mise en œuvreupdateOuselect,ParsqlEn tant quekeyTrouverStatementObjet, Utiliser quand il existe , Créer s'il n'existe pas , Après utilisation , Ne pas fermer StatementObjet, Au lieu de cela, Map Intérieur, Pour la prochaine utilisation .(C'est possible.StatementOuPrepareStatementObjet)
LotBatchExecutor:Mise en œuvreupdate(Non.select,JDBC Le traitement par lots n'est pas pris en charge select),Toutsql Tous ajoutés au lot (addBatch()), En attente de mise en œuvre uniforme (executeBatch()), Il cache plusieurs StatementObjet,ChaqueStatementLes objets sontaddBatch()À la fin., En attente d'exécution individuelle executeBatch() Par lots ;BatchExecutor L'équivalent de plusieurs barils entretenus ,Chaque seau contient beaucoup de ses propresSQL,C'est comme si le bleu de pomme contenait beaucoup de pommes, Beaucoup de tomates dans le bleu de tomate ,Enfin, Puis verser uniformément dans l'entrepôt .(C'est possible.StatementOuPrepareStatementObjet)
Comme dansSimpleExecutor C'est ce qui se passe. updateMéthodes:

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

@Override
public int doUpdate(MappedStatement ms, Object parameter) throws SQLException {
Statement stmt = null;
try {
Configuration configuration = ms.getConfiguration();
StatementHandler handler = configuration.newStatementHandler(this, ms, parameter, RowBounds.DEFAULT, null,
null);
stmt = prepareStatement(handler, ms.getStatementLog());
return handler.update(stmt);
} finally {
closeStatement(stmt);
}
}

##7、Mode adaptateur
Mode adaptateur(Adapter Pattern) :Convertir une interface en une autre que le client souhaite,Le mode adaptateur permet aux classes dont les interfaces sont incompatibles de travailler ensemble, Son alias est wrapper (Wrapper).
Le mode adaptateur peut être utilisé à la fois comme mode de structure de classe,Peut également être utilisé comme modèle de structure d'objet.
![](https://s2.51cto.com/images/20210819/1629388707148144.jpg)
InMybatsiDeloggingDans le sac,Il y a unLogInterface:

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

/**

  • @author Clinton Begin
    */
    publicinterface Log {

    boolean isDebugEnabled();

    boolean isTraceEnabled();

    void error(String s, Throwable e);

    void error(String s);

    void debug(String s);

    void trace(String s);

    void warn(String s);

}

Cette interface définitMybatis Méthode de journalisation directe ,EtLog Qui implémente l'interface? ?
MybatisFournit la mise en œuvre de plusieurs cadres de journalisation, Ces implémentations correspondent à ceci Log Méthode d'interface définie par l'interface ,Enfin, tous les cadres de journalisation externes ont été mis en place pourMybatis Adaptation du paquet log :
![](https://s2.51cto.com/images/20210819/1629388708864296.jpg)
Comme pourLog4jImpl En termes de réalisation , La mise en œuvre est détenue org.apache.log4j.LoggerExemples, Et toutes les méthodes de journalisation , Toutes les instances sont chargées de la mise en œuvre .

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

publicclass Log4jImpl implements Log {

privatestaticfinal String FQCN = Log4jImpl.class.getName();
private Logger log;
public Log4jImpl(String clazz) {
log = Logger.getLogger(clazz);
}
@Override
public boolean isDebugEnabled() {
return log.isDebugEnabled();
}
@Override
public boolean isTraceEnabled() {
return log.isTraceEnabled();
}
@Override
public void error(String s, Throwable e) {
log.log(FQCN, Level.ERROR, s, e);
}
@Override
public void error(String s) {
log.log(FQCN, Level.ERROR, s, null);
}
@Override
public void debug(String s) {
log.log(FQCN, Level.DEBUG, s, null);
}
@Override
public void trace(String s) {
log.log(FQCN, Level.TRACE, s, null);
}
@Override
public void warn(String s) {
log.log(FQCN, Level.WARN, s, null);
}

}

##8、Mode décorateur
Mode décoratif(Decorator Pattern) :Ajouter dynamiquement des tâches supplémentaires à un objet(Responsibility), En termes d'augmentation de la fonctionnalité de l'objet ,Le mode décoratif est plus flexible que l'implémentation de la Sous - classe Generate.
Son alias peut également être appelé wrapper (Wrapper), Même alias que le mode adaptateur , Mais ils sont adaptés à différentes situations .
Selon la traduction , Le motif décoratif est aussi appelé “ Mode peintre ”, C'est un modèle de structure d'objet .
![image.png](https://s2.51cto.com/images/20210819/1629388709845308.jpg)
InmybatisMoyenne, La fonction mise en cache est activée par l'interface racine Cache(org.apache.ibatis.cache.Cache)Définition.L'ensemble du système adopte le modèle de conception décorative,Les fonctions de base du stockage et de la mise en cache des données sontPerpetualCache(org.apache.ibatis.cache.impl.PerpetualCache) Mise en cache permanente ,Et puis, grâce à une série de décorationsPerpetualCacheMise en cache permanente pour des contrôles pratiques tels que la politique de mise en cache.
Comme le montre la figure ci - dessous::
![](https://s2.51cto.com/images/20210819/1629388710349714.jpg)
Pour la décoration PerpetualCache Ensemble de garnitures standard pour 8- Oui.(Tout est là.org.apache.ibatis.cache.decoratorsDans le sac):
FifoCache:Algorithme FIFO, Politique de recouvrement du cache
LoggingCache: Afficher les informations du journal pour les Hits du cache
LruCache:Algorithme le moins utilisé récemment, Politique de recouvrement du cache
ScheduledCache: Cache de programmation , Responsable du nettoyage programmé du cache
SerializedCache: Stockage de sérialisation et de désrialisation du cache
SoftCache:Mise en oeuvre d'une politique de gestion du cache fondée sur des références souples
SynchronizedCache: Décorateur de cache synchronisé , Utilisé pour empêcher l'accès simultané multithreadé
WeakCache:Stratégie de gestion du cache basée sur une faible référence
En plus, Et une décoration spéciale TransactionalCache: Cache transactionnel
Comme la plupart des cadres de persistance ,mybatisLe cache est également divisé en cache de niveau 1 et cache de niveau 2
Cache de niveau 1, Aussi appelé cache local ,- Oui.PerpetualCache Cache persistant de type , Enregistrer dans l'actionneur (BaseExecutor), Et l'actionneur SqlSession(DefaultSqlSession)Moyenne,Donc le cycle de vie du cache de niveau 1 est lié àSqlSessionC'est pareil..
Cache L2, Aussi appelé cache personnalisé ,C'est fait.CacheLes classes d'interfaces peuvent être utilisées comme cache secondaire, Il peut donc être configuré comme suit: encache Cache tiers pour etc. . Cache L2 à namespace L'espace de noms est son identité unique ,Est sauvegardé dansConfiguration Dans l'objet de configuration du noyau .
Le type par défaut d'objet de cache L2 estPerpetualCache,Si le cache configuré est le type par défaut,EtmybatisUne série de garnitures est automatiquement ajoutée en fonction de la configuration.
Cache L'ordre de référence entre les objets est :
SynchronizedCache–>LoggingCache–>SerializedCache–>ScheduledCache–>LruCache–>PerpetualCache
9、Mode Itérateur
Itérateur(Iterator)Mode, Aussi appelé curseur (Cursor)Mode.GOF Les définitions données sont les suivantes: :Fournir un moyen d'accéder à un conteneur(container) Éléments individuels de l'objet ,Sans exposer les détails intérieurs de l'objet.
![](https://s2.51cto.com/images/20210819/1629388711444051.jpg)
JavaDeIterator Est l'interface du mode Itérateur , Dès que cette interface est implémentée ,C'est l'équivalent du mode Itérateur appliqué:
![](https://s2.51cto.com/images/20210819/1629388711693579.jpg)
Par exemple,MybatisDePropertyTokenizer- Oui.property Classes lourdes dans le paquet , Cette classe sera reflectionD'autres classes du paquet sont fréquemment référencées à. Cette classe implémente IteratorInterface, Ce qui est souvent utilisé lors de l'utilisation IteratorDans l'interfacehasNextCette fonction.

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.

publicclass PropertyTokenizer implements Iterator<PropertyTokenizer> {
private String name;
private String indexedName;
private String index;
private String children;

public PropertyTokenizer(String fullname) {
int delim = fullname.indexOf('.');
if (delim > -1) {
name = fullname.substring(0, delim);
children = fullname.substring(delim + 1);
} else {
name = fullname;
children = null;
}
indexedName = name;
delim = name.indexOf('[');
if (delim > -1) {
index = name.substring(delim + 1, name.length() - 1);
name = name.substring(0, delim);
}
}
public String getName() {
return name;
}
public String getIndex() {
return index;
}

Enfin, partagez une vague de mon dictionnaire d'entrevue——Grande usine Internet de première ligneJavaBase de questions d'entrevue de base

Voici quelques - unes de mes pratiques personnelles,J'espère pouvoir vous aider:

 Cliquez sur《Grande usine Internet de première ligneJavaBase de questions d'entrevue de base》Disponible gratuitement,Ça fait longtemps.,C'est parfait pour passer en revue les questions d'entrevue,Y comprisJavaBase、Anomalie、Ensemble、Programmation simultanée、JVM、SpringSeau familial、MyBatis、Redis、Base de données、MiddlewareMQ、Dubbo、Linux、Tomcat、ZooKeeper、NettyAttendez un peu!,Et des mises à jour continues…MaisstarUn instant.!

image

283PageJavaNoyau avancépdfDocumentation

JavaSection:JavaBase,Ensemble,Concurrence,Multithreading,JVM,Mode de conception

Algorithme de structure des données:JavaAlgorithmes,Structure des données

Section du cadre Open Source:Spring,MyBatis,MVC,netty,tomcat

Partie distribuée:Conception architecturale,RedisCache,Zookeeper,kafka,RabbitMQ,équilibrage de la charge, etc.

Section des microservices:SpringBoot,SpringCloud,Dubbo,Docker

image

Et l'apprentissage de la lecture liée au code source

image

Copyright:Cet article est[Reste debout toute la nuit.]Établi,Veuillez apporter le lien original pour réimprimer,remercier。 https://fra.fheadline.com/2021/08/20210820001452783u.html