我正在与Spring Boot一起使用JDBI。我遵循了本指南,这导致必须创建一个类:<code>JdbiConfig</code>,对于应用程序上下文中需要的每个dao,您必须添加:
@Bean
public SomeDao someDao(Jdbi jdbi) {
return jdbi.onDemand(SomeDao.class);
}
我想知道Spring Boot是否有办法创建一个定制的处理器来创建beans并将它们放入应用程序上下文中。我有两个想法:
@JdbiDao
注释DAO并编写一些东西来提取它们。我尝试过只是手动将这些注入到应用程序启动中,但问题是它们可能无法及时加载以进行注入,因为它们在类扫描期间无法识别。JdbiRoad
。然后用标准的@Repostory
注释接口,并创建一个自定义处理器,通过Jdbi#onDemand
这是我的两个想法,但我不知道有什么方法可以做到这一点。我被困在手动创建 Bean 上?这以前解决过吗?
策略是扫描dao接口的类路径,然后将它们注册为bean。
我们需要:BeanDefinitionRegistryPostProcessor 来注册额外的 bean 定义,需要一个 FactoryBean 来创建 jdbi dao bean 实例。
@JdbiDao
标记你的道对间@JdbiDao
public interface SomeDao {
}
public class JdbiDaoBeanFactory implements FactoryBean<Object>, InitializingBean {
private final Jdbi jdbi;
private final Class<?> jdbiDaoClass;
private volatile Object jdbiDaoBean;
public JdbiDaoBeanFactory(Jdbi jdbi, Class<?> jdbiDaoClass) {
this.jdbi = jdbi;
this.jdbiDaoClass = jdbiDaoClass;
}
@Override
public Object getObject() throws Exception {
return jdbiDaoBean;
}
@Override
public Class<?> getObjectType() {
return jdbiDaoClass;
}
@Override
public void afterPropertiesSet() throws Exception {
jdbiDaoBean = jdbi.onDemand(jdbiDaoClass);
}
}
public class JdbiBeanFactoryPostProcessor
implements BeanDefinitionRegistryPostProcessor, ResourceLoaderAware, EnvironmentAware, BeanClassLoaderAware, BeanFactoryAware {
private BeanFactory beanFactory;
private ResourceLoader resourceLoader;
private Environment environment;
private ClassLoader classLoader;
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
@Override
public void setBeanClassLoader(ClassLoader classLoader) {
this.classLoader = classLoader;
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false) {
@Override
protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
// By default, scanner does not accept regular interface without @Lookup method, bypass this
return true;
}
};
scanner.setEnvironment(environment);
scanner.setResourceLoader(resourceLoader);
scanner.addIncludeFilter(new AnnotationTypeFilter(JdbiDao.class));
List<String> basePackages = AutoConfigurationPackages.get(beanFactory);
basePackages.stream()
.map(scanner::findCandidateComponents)
.flatMap(Collection::stream)
.forEach(bd -> registerJdbiDaoBeanFactory(registry, bd));
}
private void registerJdbiDaoBeanFactory(BeanDefinitionRegistry registry, BeanDefinition bd) {
GenericBeanDefinition beanDefinition = (GenericBeanDefinition) bd;
Class<?> jdbiDaoClass;
try {
jdbiDaoClass = beanDefinition.resolveBeanClass(classLoader);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
beanDefinition.setBeanClass(JdbiDaoBeanFactory.class);
// Add dependency to your `Jdbi` bean by name
beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(new RuntimeBeanReference("jdbi"));
beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(Objects.requireNonNull(jdbiDaoClass));
registry.registerBeanDefinition(jdbiDaoClass.getName(), beanDefinition);
}
}
@SpringBootApplication
@Import(JdbiBeanFactoryPostProcessor.class)
public class Application {
}
在我的项目中有2个资源属性 1.application.properties 2. 应用开发.性能 此类使用开发的值属性 我使用 application-development.properties 作为我的项目资源 因此,我使用以下命令运行该项目: < code > mvn spring-boot:run-D spring . profiles . active = development 但是
我的Spring启动应用程序有问题。它似乎不加载自定义css文件。我把它放在资源/静态/css下,我也尝试过在资源/公共/css下,但它也不起作用。 我把我的项目留在git hub帐户上,这样你就可以检查出什么问题了。 GitHub项目 另外,当我打开chrome控制台下的登录页面时,会出现一个警告 资源被解释为样式表,但使用 MIME 类型文本/纯文本传输:“http://localhost:8
我想提供一个特定的Bean,以便这个Bean覆盖Spring Cloud AutoConfiguration类中的Bean。 我还尝试使用自动配置。但是甚至注释也被忽略。 我的配置类bean总是在KubernetesClientAutoConfiguration类中的bean之后实例化。因此,AutoConfiguration类不使用我的bean。 文档说:在任何时候,您都可以开始定义自己的配置,
我有一些不应该实例化的带有自定义注释的类(抽象类,它只是实际bean的子组件)。但是在这些类之上,在运行时,在上下文初始化阶段,我想在应用程序上下文中添加额外的bean。 因此,基本上我需要扫描类路径,处理结果,并将新bean引入curent应用程序上下文。 似乎是spring-mvc、spring-tasks和spring-integration在做这件事(我试着从源代码中学习--没有运气) 我
问题内容: 我有一些带有自定义注释的类,不应实例化(抽象类,它只是真实bean的子组件)。但是在此类的顶部,在运行时,在上下文初始化阶段,我想将额外的bean放入应用程序上下文中。 因此,基本上,我需要扫描类路径,处理结果,并将新bean引入当前的应用程序上下文中。 似乎spring-mvc,spring-tasks和spring-integration正在这样做(我试图从源中学习它-没运气) 我
问题内容: 我想创建自己的自定义范围bean,它将使用HTTP会话(类似于Flash作用域)。 根据Spring手册,我需要实现org.springframework.beans.factory.config.Scope接口 我的问题是如何在此bean中获取HTTP会话?我知道,如果我在ServletContext范围内创建bean,则将实现ServletContextAware接口。 请帮忙 :