diff --git a/src/main/java/run/halo/app/core/extension/Plugin.java b/src/main/java/run/halo/app/core/extension/Plugin.java
index 53701e51b..67803f3d5 100644
--- a/src/main/java/run/halo/app/core/extension/Plugin.java
+++ b/src/main/java/run/halo/app/core/extension/Plugin.java
@@ -16,7 +16,6 @@ import org.pf4j.PluginState;
import org.springframework.lang.NonNull;
import run.halo.app.extension.AbstractExtension;
import run.halo.app.extension.GVK;
-import run.halo.app.plugin.BasePlugin;
/**
* A custom resource for Plugin.
@@ -74,7 +73,8 @@ public class Plugin extends AbstractExtension {
*/
private String requires = "*";
- private String pluginClass = BasePlugin.class.getName();
+ @Deprecated
+ private String pluginClass;
private Boolean enabled = false;
diff --git a/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java b/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java
index 0205a0596..d02254392 100644
--- a/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java
+++ b/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java
@@ -173,7 +173,7 @@ public class PluginReconciler implements Reconciler {
private void ensureSpecUpToDateWhenDevelopmentMode(PluginWrapper pluginWrapper,
Plugin oldPlugin) {
- if (!RuntimeMode.DEPLOYMENT.equals(pluginWrapper.getRuntimeMode())) {
+ if (RuntimeMode.DEPLOYMENT.equals(pluginWrapper.getRuntimeMode())) {
return;
}
YamlPluginFinder yamlPluginFinder = new YamlPluginFinder();
diff --git a/src/main/java/run/halo/app/plugin/BasePlugin.java b/src/main/java/run/halo/app/plugin/BasePlugin.java
index b0476792a..7568fd836 100644
--- a/src/main/java/run/halo/app/plugin/BasePlugin.java
+++ b/src/main/java/run/halo/app/plugin/BasePlugin.java
@@ -35,7 +35,7 @@ public class BasePlugin extends Plugin {
return applicationContext;
}
- public HaloPluginManager getPluginManager() {
+ private HaloPluginManager getPluginManager() {
return (HaloPluginManager) getWrapper().getPluginManager();
}
}
diff --git a/src/main/java/run/halo/app/plugin/BasePluginFactory.java b/src/main/java/run/halo/app/plugin/BasePluginFactory.java
new file mode 100644
index 000000000..805f7e99f
--- /dev/null
+++ b/src/main/java/run/halo/app/plugin/BasePluginFactory.java
@@ -0,0 +1,48 @@
+package run.halo.app.plugin;
+
+import java.util.Optional;
+import lombok.extern.slf4j.Slf4j;
+import org.pf4j.Plugin;
+import org.pf4j.PluginFactory;
+import org.pf4j.PluginWrapper;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.beans.factory.support.DefaultListableBeanFactory;
+
+/**
+ * The default implementation for PluginFactory.
+ *
Get a {@link BasePlugin} instance from the {@link PluginApplicationContext}.
+ *
+ * @author guqing
+ * @since 2.0.0
+ */
+@Slf4j
+public class BasePluginFactory implements PluginFactory {
+
+ @Override
+ public Plugin create(PluginWrapper pluginWrapper) {
+ return getPluginContext(pluginWrapper)
+ .map(context -> {
+ try {
+ return context.getBean(BasePlugin.class);
+ } catch (NoSuchBeanDefinitionException e) {
+ log.info(
+ "No bean named 'basePlugin' found in the context create default instance");
+ DefaultListableBeanFactory beanFactory =
+ context.getDefaultListableBeanFactory();
+ BasePlugin pluginInstance = new BasePlugin(pluginWrapper);
+ beanFactory.registerSingleton(Plugin.class.getName(), pluginInstance);
+ return pluginInstance;
+ }
+ })
+ .orElse(null);
+ }
+
+ private Optional getPluginContext(PluginWrapper pluginWrapper) {
+ try {
+ return Optional.of(ExtensionContextRegistry.getInstance())
+ .map(registry -> registry.getByPluginId(pluginWrapper.getPluginId()));
+ } catch (IllegalArgumentException e) {
+ return Optional.empty();
+ }
+ }
+}
diff --git a/src/main/java/run/halo/app/plugin/HaloPluginManager.java b/src/main/java/run/halo/app/plugin/HaloPluginManager.java
index 6107b9f8f..f99868db7 100644
--- a/src/main/java/run/halo/app/plugin/HaloPluginManager.java
+++ b/src/main/java/run/halo/app/plugin/HaloPluginManager.java
@@ -14,6 +14,7 @@ import org.pf4j.ExtensionFinder;
import org.pf4j.PluginDependency;
import org.pf4j.PluginDescriptor;
import org.pf4j.PluginDescriptorFinder;
+import org.pf4j.PluginFactory;
import org.pf4j.PluginRepository;
import org.pf4j.PluginRuntimeException;
import org.pf4j.PluginState;
@@ -80,6 +81,11 @@ public class HaloPluginManager extends DefaultPluginManager
return pluginApplicationInitializer.getPluginApplicationContext(pluginId);
}
+ @Override
+ protected PluginFactory createPluginFactory() {
+ return new BasePluginFactory();
+ }
+
@Override
public void afterPropertiesSet() {
this.pluginApplicationInitializer = new PluginApplicationInitializer(this);
diff --git a/src/main/java/run/halo/app/plugin/PluginApplicationInitializer.java b/src/main/java/run/halo/app/plugin/PluginApplicationInitializer.java
index a9f9b5ebd..01545f8e2 100644
--- a/src/main/java/run/halo/app/plugin/PluginApplicationInitializer.java
+++ b/src/main/java/run/halo/app/plugin/PluginApplicationInitializer.java
@@ -66,6 +66,8 @@ public class PluginApplicationInitializer {
AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);
stopWatch.stop();
+ beanFactory.registerSingleton("pluginWrapper", haloPluginManager.getPlugin(pluginId));
+
populateSettingFetcher(pluginId, beanFactory);
log.debug("Total millis: {} ms -> {}", stopWatch.getTotalTimeMillis(),
diff --git a/src/main/java/run/halo/app/plugin/YamlPluginDescriptorFinder.java b/src/main/java/run/halo/app/plugin/YamlPluginDescriptorFinder.java
index 342fb52a6..373daaab9 100644
--- a/src/main/java/run/halo/app/plugin/YamlPluginDescriptorFinder.java
+++ b/src/main/java/run/halo/app/plugin/YamlPluginDescriptorFinder.java
@@ -50,7 +50,7 @@ public class YamlPluginDescriptorFinder implements PluginDescriptorFinder {
DefaultPluginDescriptor defaultPluginDescriptor =
new DefaultPluginDescriptor(pluginId,
spec.getDescription(),
- spec.getPluginClass(),
+ BasePlugin.class.getName(),
spec.getVersion(),
spec.getRequires(),
spec.getAuthor(),
diff --git a/src/test/java/run/halo/app/core/extension/reconciler/PluginReconcilerTest.java b/src/test/java/run/halo/app/core/extension/reconciler/PluginReconcilerTest.java
index bc378c720..d5a7dbc08 100644
--- a/src/test/java/run/halo/app/core/extension/reconciler/PluginReconcilerTest.java
+++ b/src/test/java/run/halo/app/core/extension/reconciler/PluginReconcilerTest.java
@@ -19,6 +19,7 @@ import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.pf4j.PluginState;
import org.pf4j.PluginWrapper;
+import org.pf4j.RuntimeMode;
import run.halo.app.core.extension.Plugin;
import run.halo.app.extension.ExtensionClient;
import run.halo.app.extension.controller.Reconciler;
@@ -53,6 +54,7 @@ class PluginReconcilerTest {
pluginReconciler = new PluginReconciler(extensionClient, haloPluginManager, jsBundleRule);
when(haloPluginManager.getPlugin(any())).thenReturn(pluginWrapper);
+ when(pluginWrapper.getRuntimeMode()).thenReturn(RuntimeMode.DEPLOYMENT);
when(haloPluginManager.getUnresolvedPlugins()).thenReturn(List.of());
}
diff --git a/src/test/java/run/halo/app/plugin/YamlPluginFinderTest.java b/src/test/java/run/halo/app/plugin/YamlPluginFinderTest.java
index 8283c10d6..f57498666 100644
--- a/src/test/java/run/halo/app/plugin/YamlPluginFinderTest.java
+++ b/src/test/java/run/halo/app/plugin/YamlPluginFinderTest.java
@@ -92,7 +92,7 @@ class YamlPluginFinderTest {
}
],
"requires": ">=2.0.0",
- "pluginClass": "run.halo.app.plugin.BasePlugin",
+ "pluginClass": null,
"enabled": false,
"extensionLocations": null,
settingName: null,