Git Product home page Git Product logo

spring-context-support's Introduction

A support module of spring-context

=====================

Current project that extends spring-context is based on Spring Framework 3.2.x +

Release version

<dependencies>

    ......

     <!-- Spring Framework -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.framework.version}</version>
    </dependency>

    <!-- Spring Context Extras -->
    <dependency>
        <groupId>com.alibaba.spring</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>1.0.11</version>
    </dependency>

    ......

</dependencies>

If your project failed to resolve the dependency, try to add the following repository:

    <repositories>
        <repository>
            <id>sonatype-nexus</id>
            <url>https://oss.sonatype.org/content/repositories/releases</url>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>

Document

TODO: Working in Process

spring-context-support's People

Contributors

dependabot[bot] avatar iwhalecloud-platform avatar mercyblitz avatar wuwen5 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

spring-context-support's Issues

NoSuchMethodError needsRefresh

start resin,find this error:{main} java.lang.NoSuchMethodError: org.springframework.beans.factory.annotation.InjectionMetadata.needsRefresh(Lorg/springframework/beans/factory/annotation/InjectionMetadata;Ljava/lang/Class;)Z
at com.alibaba.spring.beans.factory.annotation.AnnotationInjectedBeanPostProcessor.findInjectionMetadata(AnnotationInjectedBeanPostProcessor.java:234)
at com.alibaba.spring.beans.factory.annotation.AnnotationInjectedBeanPostProcessor.postProcessMergedBeanDefinition(AnnotationInjectedBeanPostProcessor.java:257)

with spring-beans-4.0.0.RELEASE.jar、spring-context-support-1.0.5.jar.

在方法上使用@NacosValue注解时,注入报空指针

版本信息:

  • spring-context-support:1.0.11
  • nacos-client:2.1.1
  • nacos-config-spring-boot-starter:0.2.11
  • nacos-spring-context:1.1.1

触发方式:

在方法上使用@NacosValue

private String value;

@NacosValue(value = "${nacos.test.value:default_value}",autoRefreshed = true)
void setValue(String value) {
    this.value = value;
    System.out.println("nacos测试刷新数据:" + value);
}

报错位置:

com.alibaba.spring.beans.factory.annotation.AbstractAnnotationBeanPostProcessor.AnnotatedMethodElement#inject

报错信息:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dubboServiceImpl': Injection of @NacosValue dependencies is failed; nested exception is java.lang.NullPointerException

报错原因:

变量pd为null,没有判空直接使用导致空指针

解决方案

判断如果pd为null则从member中获取
Class<?> injectedType = null != pd?pd.getPropertyType():((Method) this.member).getParameterTypes()[0];

完整方法

@Override
protected void inject(Object bean, String beanName, PropertyValues pvs) throws Throwable {

    Class<?> injectedType = pd?pd.getPropertyType():((Method) this.member).getParameterTypes()[0];

    Object injectedObject = getInjectedObject(attributes, bean, beanName, injectedType, this);

    ReflectionUtils.makeAccessible(method);

    method.invoke(bean, injectedObject);

}

ConfigurationBeanBindingPostProcessor无法对serialization-name类型的配置进行驼峰转换并注入属性

版本为:1.0.10

使用方式:

  1. application.properties的配置如下:
envoy.protocol.id=huangfu3
envoy.protocol.port=22123
envoy.protocol.serialization-name=123
  1. 对应的实体类如下:
    /**
     * 协议名称
     */
    private String protocolName = ProtocolNameEnum.NETTY.getName();

    /**
     * 序列化名称
     */
    private String serializationName = SerializationNameEnum.FAST_JSON.getName();

已经使用 @EnableConfigurationBeanBinding 进行绑定该实体类

但是上述配置无法注入 serialization-name 属性,当属性转变为 serializationName 注入成功

期望

spring 中默认会使用驼峰转换的方式,当配置中制定为 xx-xx的时候希望能够注入到 xxXx属性中!

现阶段的处理方式

手动实现一个BeanPostProcessor优先级高于 ConfigurationBeanBindingPostProcessor ,自己向BeanDefinition的attribute中增加一个 驼峰转换后的值,最后再经由ConfigurationBeanBindingPostProcessor 完成注入

FieldUtils may have concurrency issues

for example: String id=FieldUtils.getFieldValue(next, "id")

public class Base implements Serializable {
    private String id;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
}
public class Son extends Base implements Serializable {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
public class TestCase {

    public static void main(String[] args) {

        List<Son> records = new ArrayList<>();
        List<Son> records2 = new ArrayList<>();
        Random random = new Random();
        for (int i = 0; i < 1000; i++) {
            long l = random.nextLong();
            Son son = new Son();
            son.setId(l + "");
            records.add(son);
            Son son2 = new Son();
            son2.setId(l + "");
            records2.add(son2);
        }
        new Thread(() -> {
            Iterator<Son> iterator = records.iterator();
            while (iterator.hasNext()) {
                Son next = iterator.next();
                String id = FieldUtils.getFieldValue(next, "id");
            }
        }).start();

        new Thread(() -> {
            Iterator<Son> iterator = records2.iterator();
            while (iterator.hasNext()) {
                Son next = iterator.next();
                String id = FieldUtils.getFieldValue(next, "id");
            }
        }).start();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Exception in thread "Thread-1" java.lang.IllegalStateException: Could not access method or field: Class org.springframework.util.ReflectionUtils can not access a member of class com.Base with modifiers "private"
at org.springframework.util.ReflectionUtils.handleReflectionException(ReflectionUtils.java:107)
at org.springframework.util.ReflectionUtils.getField(ReflectionUtils.java:652)
at com.alibaba.spring.util.FieldUtils.getFieldValue(FieldUtils.java:72)
at com.alibaba.spring.util.FieldUtils.getFieldValue(FieldUtils.java:28)
at com.TestCase.lambda$main$1(TestCase.java:41)

Unsupported spring 3.2.5

Unsupported spring 3.2.5

org.springframework.beans.factory.annotation.InjectionMetadata#clear
org.springframework.beans.factory.annotation.InjectionMetadata#needsRefresh

@SInCE 3.2.13

InstantiationAwareBeanPostProcessorAdapter @Deprecated and remove in spring6

AbstractAnnotationBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter

can not start at spring6

Official description

@Deprecated
public abstract class InstantiationAwareBeanPostProcessorAdapter
extends Object
implements SmartInstantiationAwareBeanPostProcessor
Adapter that implements all methods on SmartInstantiationAwareBeanPostProcessor as no-ops, which will not change normal processing of each bean instantiated by the container. Subclasses may override merely those methods that they are actually interested in.
Note that this base class is only recommendable if you actually require InstantiationAwareBeanPostProcessor functionality. If all you need is plain BeanPostProcessor functionality, prefer a straight implementation of that (simpler) interface.

About "classValuesAsString" in "AbstractAnnotationBeanPostProcessor"

I was integrating dubbo-2.7.8 and nacos-client-2.0.2 , I found a problem in "spring-context-support-1.0.11.jar".

Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Class
	at org.apache.dubbo.config.spring.util.DubboAnnotationUtils.resolveServiceInterfaceClass(DubboAnnotationUtils.java:95) ~[dubbo-2.7.8.jar:2.7.8]
	at org.apache.dubbo.config.spring.util.DubboAnnotationUtils.resolveInterfaceName(DubboAnnotationUtils.java:78) ~[dubbo-2.7.8.jar:2.7.8]
	at org.apache.dubbo.config.spring.beans.factory.annotation.ServiceBeanNameBuilder.<init>(ServiceBeanNameBuilder.java:65) ~[dubbo-2.7.8.jar:2.7.8]
	at org.apache.dubbo.config.spring.beans.factory.annotation.ServiceBeanNameBuilder.create(ServiceBeanNameBuilder.java:78) ~[dubbo-2.7.8.jar:2.7.8]
	at org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor.buildReferencedBeanName(ReferenceAnnotationBeanPostProcessor.java:303) ~[dubbo-2.7.8.jar:2.7.8]
	at org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor.buildInjectedObjectCacheKey(ReferenceAnnotationBeanPostProcessor.java:292) ~[dubbo-2.7.8.jar:2.7.8]
	at com.alibaba.spring.beans.factory.annotation.AbstractAnnotationBeanPostProcessor.getInjectedObject(AbstractAnnotationBeanPostProcessor.java:404) ~[spring-context-support-1.0.11.jar:na]
	at com.alibaba.spring.beans.factory.annotation.AbstractAnnotationBeanPostProcessor$AnnotatedFieldElement.inject(AbstractAnnotationBeanPostProcessor.java:626) ~[spring-context-support-1.0.11.jar:na]
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:130) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
	at com.alibaba.spring.beans.factory.annotation.AbstractAnnotationBeanPostProcessor.postProcessPropertyValues(AbstractAnnotationBeanPostProcessor.java:179) ~[spring-context-support-1.0.11.jar:na]
	... 30 common frames omitted

I added dubbo-2.7.8 firstly, It implicitly dependent on spring-context-1.0.8
but when I added nacos-2.0.2. It needs spring-context-1.0.11, otherwise it will throw

Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Class
	at org.apache.dubbo.config.spring.util.DubboAnnotationUtils.resolveServiceInterfaceClass(DubboAnnotationUtils.java:95) ~[dubbo-2.7.8.jar:2.7.8]
	at org.apache.dubbo.config.spring.util.DubboAnnotationUtils.resolveInterfaceName(DubboAnnotationUtils.java:78) ~[dubbo-2.7.8.jar:2.7.8]
	at org.apache.dubbo.config.spring.beans.factory.annotation.ServiceBeanNameBuilder.<init>(ServiceBeanNameBuilder.java:65) ~[dubbo-2.7.8.jar:2.7.8]
	at org.apache.dubbo.config.spring.beans.factory.annotation.ServiceBeanNameBuilder.create(ServiceBeanNameBuilder.java:78) ~[dubbo-2.7.8.jar:2.7.8]
	at org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor.buildReferencedBeanName(ReferenceAnnotationBeanPostProcessor.java:303) ~[dubbo-2.7.8.jar:2.7.8]
	at org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor.buildInjectedObjectCacheKey(ReferenceAnnotationBeanPostProcessor.java:292) ~[dubbo-2.7.8.jar:2.7.8]
	at com.alibaba.spring.beans.factory.annotation.AbstractAnnotationBeanPostProcessor.getInjectedObject(AbstractAnnotationBeanPostProcessor.java:404) ~[spring-context-support-1.0.11.jar:na]
	at com.alibaba.spring.beans.factory.annotation.AbstractAnnotationBeanPostProcessor$AnnotatedFieldElement.inject(AbstractAnnotationBeanPostProcessor.java:626) ~[spring-context-support-1.0.11.jar:na]
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:130) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
	at com.alibaba.spring.beans.factory.annotation.AbstractAnnotationBeanPostProcessor.postProcessPropertyValues(AbstractAnnotationBeanPostProcessor.java:179) ~[spring-context-support-1.0.11.jar:na]
	... 30 common frames omitted

Finally, I found the difference between 1.0.11 and 1.0.8 is about com.alibaba.spring.beans.factory.annotation.AbstractAnnotationBeanPostProcessor#classValuesAsString
Maybe that is where the problem

Iterator 做无用功

registerBeans(BeanDefinitionRegistry registry, Class<?>... annotatedClasses) 方法中 本意是移除已经注册过的 annotatedClass

// Remove all annotated-classes that have been registered
Iterator<Class<?>> iterator = new ArrayList<Class<?>>(asList(annotatedClasses)).iterator();
while (iterator.hasNext()) {
    Class<?> annotatedClass = iterator.next();
    if (isPresentBean(registry, annotatedClass)) {
        iterator.remove();
    }
}

但是实际上 Iterator 在做无用功

testRegisterBeans() 中 重复向 registerBeans

image

提示

INFO support.DefaultListableBeanFactory - Overriding bean definition for bean 'annotatedBeanDefinitionRegistryUtilsTest': replacing [Generic bean: class [com.alibaba.spring.util.AnnotatedBeanDefinitionRegistryUtilsTest]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] with [Generic bean: class [com.alibaba.spring.util.AnnotatedBeanDefinitionRegistryUtilsTest]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null]

在 debug中 reader.register(annotatedClasses); 仍然注册了重复的bean ,
Iterator<Class<?>> iterator = new ArrayList<Class<?>>(asList(annotatedClasses)).iterator(); 然后 iterator.remove(); 是无意义的
image

AbstractAnnotationBeanPostProcessor无法装载含有多个参数的类问题

类路径:com.alibaba.spring.beans.factory.annotation.AbstractAnnotationBeanPostProcessor
方法:
private Class resolveInjectedType(Object bean, Field field) { Type genericType = field.getGenericType(); if (genericType instanceof Class) { // Just a normal Class return field.getType(); } else { // GenericType return resolveTypeArgument(getTargetClass(bean), field.getDeclaringClass()); } } @nullable public static Class resolveTypeArgument(Class clazz, Class genericIfc) {
ResolvableType resolvableType = ResolvableType.forClass(clazz).as(genericIfc);
if (!resolvableType.hasGenerics()) {
return null;
}
return getSingleGeneric(resolvableType);
}
resolveTypeArgument 遇到一个类有多个参数的时候,会导致报错;
建议resolveInjectedType返回类型为List<Class<?>> ,便于多个参数的情况下可以正常装到容器

org.apache.dubbo.config.ApplicationConfig#0" contains illegal character, only digit, letter, '-', '_' or '.' is legal

报错:Caused by: java.lang.IllegalStateException: Invalid name="org.apache.dubbo.config.ApplicationConfig#0" contains illegal character, only digit, letter, '-', '_' or '.' is legal.
按理说ConfigurationBeanBindingPostProcessor
有这个刷新,但是由于顺序问题,
ApplicationConfig.refresh也不行
因为DubboConfigDefaultPropertyValueBeanPostProcessor这个给id取值是org.apache.dubbo.config.ApplicationConfig#0,导致刷新失败。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.