- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有很多千篇一律的 spring bean,不想在 xml 中显式定义每一个。所以我去了让我这样做的组件扫描路线。这很好,但我刚刚意识到 MyBeanPostProcessor 没有被调用用于使用组件扫描技术加载的 bean。 MyBeanPostProcessor 只是尝试对这些 bean 进行一些 setter 注入(inject)。下面的配置仅显示了我尝试过的这种方法,但它不起作用。还有其他关于如何对这些 bean 进行 setter 注入(inject)的想法吗?
我正在使用 Spring 2.5.5
谢谢,本
<context:component-scan base-package="us.benanderson"
use-default-filters="false"
annotation-config="false"
scope-resolver="us.benanderson.MyScopeResolver"
name-generator="us.benanderson.MyBeanNameGenerator">
<context:include-filter type="custom" expression="us.benanderson.MyTypeFilter" />
</context:component-scan>
<bean class="us.benanderson.MyBeanPostProcessor">
<property name="order" value="500" />
</bean>
最佳答案
这是我的测试用例,似乎有效(Spring 2.5.6)。为了简洁起见,我考虑过排除一些文件,但我决定反对。
Start.java(入口点)
package se.waxwing.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Start {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("se/waxwing/test/Context.xml");
context.getBean("customBean");
}
}
上下文.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:component-scan base-package="se.waxwing.test"
use-default-filters="false"
annotation-config="false"
scope-resolver="se.waxwing.test.MyScopeResolver">
<context:include-filter type="custom" expression="se.waxwing.test.MyTypeFilter" />
</context:component-scan>
<bean id="beanProcessor" class="se.waxwing.test.MyBeanPostProcessor" />
</beans>
CustomBean.java(这是我想要找到的 - 请参阅 MyTypeFilter)
package se.waxwing.test;
public class CustomBean {
public CustomBean() {
System.err.println("instantiating component");
}
}
MyBeanPostProcessor.java
package se.waxwing.test;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPostProcessor implements BeanPostProcessor {
public MyBeanPostProcessor() {
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.err.println("after " + beanName);
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.err.println("before " + beanName);
return bean;
}
}
MyScopeResolver.java
package se.waxwing.test;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.ScopeMetadata;
import org.springframework.context.annotation.ScopeMetadataResolver;
import org.springframework.context.annotation.ScopedProxyMode;
public class MyScopeResolver implements ScopeMetadataResolver {
@Override
public ScopeMetadata resolveScopeMetadata(BeanDefinition definition) {
ScopeMetadata result = new ScopeMetadata();
result.setScopedProxyMode(ScopedProxyMode.NO);
result.setScopeName("prototype");
return result;
}
}
MyTypeFilter.java
package se.waxwing.test;
import java.io.IOException;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.filter.TypeFilter;
public class MyTypeFilter implements TypeFilter {
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
return metadataReader.getClassMetadata().getClassName().equals(CustomBean.class.getCanonicalName());
}
}
这会产生以下输出:
2009-aug-26 15:44:02 org.springframework.context.support.AbstractApplicationContext prepareRefreshINFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@c1b531: display name [org.springframework.context.support.ClassPathXmlApplicationContext@c1b531]; startup date [Wed Aug 26 15:44:02 CEST 2009]; root of context hierarchy2009-aug-26 15:44:02 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitionsINFO: Loading XML bean definitions from class path resource [se/waxwing/test/Context.xml]2009-aug-26 15:44:02 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactoryINFO: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@c1b531]: org.springframework.beans.factory.support.DefaultListableBeanFactory@121f1d2009-aug-26 15:44:02 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletonsINFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@121f1d: defining beans [customBean,beanProcessor]; root of factory hierarchyinstantiating componentbefore customBeanafter customBean
因此,如您所见,customBean
bean 被我的类型过滤器找到,作为 bean 添加,并且当 applicationContext.getBean("customBean")
被调用一个新对象被实例化,然后它被传递到我的 post bean 处理器。
关于java - spring beanpostprocessor 不适用于组件扫描?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1121575/
我试图理解静态初始化、实例初始化、InitializingBean 和 BeanPostProcessor 的顺序,所以我创建了下面的示例,除了 BeanPostProcessor 没有被调用之外,一
使用 BeanPostProcessor 时出现问题。错误日志显示,productFactory 类中缺少方法 josh(),但该类确实有这样的方法,而且它是非静态的。下面是代码片段。 web.xml
这是我的 config.xml 我知道在使用组件扫描时,分配给 bean 的默认范围是“单例”,除非在 xml 配置中另行指定或使用注释 @
我知道 spring BeanPostProcessor 是如何工作的,但我确实没有得到任何 BeanPostProcessor 可能非常有帮助的场景。如果有人在他/她的应用程序中实现了 BeanPo
我试图理解 Spring 中的 BeanPostProcessor,但我不明白它的作用。 BeanPostProcessor 定义了在这些点调用的两个方法是否正确: 在初始化之前(init 方法或 a
我正在将 Spring 与 Spring Boot BOM 2.4.0 附带的遗留 Tomcat 应用程序(不是 Spring Boot)一起使用,问题类似于 Spring Expression La
我正在编写一个简单的函数,通过从 BeanPostProcessor 创建一个代理来记录 @Metric 注释的方法的性能: 公制.java @Retention(RUNTIME) @Target({
我有很多千篇一律的 spring bean,不想在 xml 中显式定义每一个。所以我去了让我这样做的组件扫描路线。这很好,但我刚刚意识到 MyBeanPostProcessor 没有被调用用于使用组件
在 Maven 中设置 Spring + Spring Data JPA + QueryDSL + JPA 2.0 + Hibernate 的配置时遇到了很多麻烦。我已经解决了很多问题,但是这个让我很
我正在学习 Spring Core 认证,我对 Spring 如何处理 bean 生命周期,尤其是 bean 后处理器有一些疑问。 所以我有这个架构: 我很清楚这意味着什么: 以下步骤发生在加载 Be
为了弄清楚Spring框架,我们需要分别弄清楚相关核心接口的作用,本文来介绍下BeanPostProcessor接口 BeanPostProcessor 该接口我们也叫后置处理器
我正在制作一个简单的程序来测试 bean 后处理器,但收到 NullPointerException。这是我写的代码 人员类别: public class Person { private Strin
我知道 bean 后处理器并且它正在工作,但我不确定它将如何帮助我们进行实际应用。在实际应用中下面的 define 方法中应该有什么? 1 Some configuration Code? 2 Som
使用 Spring 可以将 BeanPostProcessor 实现添加到上下文中,以便在使用依赖项初始化 bean 之前和之后有条件地替换、包装或代理 bean。 Google Guice 是否提供
我目前是 Spring 的新手。我试图遵循调用 PostConstruct 和 BeanPostProcessor 的顺序。 根据我的了解,以下是顺序:- BPP -> postProcessBefo
我试图了解 BeanFactoryPostProcessor 和 BeanPostProcessor 之间的区别。 我知道 BeanFactoryPostProcessor 对 bean 定义进行操作
我正在尝试创建一个 BeanPostProcessor 来将一些值注册到 Map。 如果我通过 xml 定义创建 bean 实例,BeanPostProcessor 工作正常,但如果我将 bean 定
我有一个实现 springs BeanPostProcessor 的类 A public class A implements BeanPostProcessor { private B b;
我正在尝试实现我自己的 BeanPostProcessor 实现。 @Component public class UserDetailsProcessor implements BeanPostPr
我正在执行 BeanPostProcessor 实现。我的 Bean 后处理器执行了 3 次。我在 init 方法之前额外调用了 2 次后处理器。我无法找到它发生的原因。请帮助我。 我的代码和配置文件
我是一名优秀的程序员,十分优秀!