AutowiredAnnotationBeanPostProcessor
当 Spring 容器启动时,AutowiredAnnotationBeanPostProcessor 将扫描 Spring 容器中所有 Bean,当发现 Bean 中拥有@Autowired 注释时就找到和其匹配(默认按类型匹配)的 Bean,并注入到对应的地方中去。
interface Member
java.lang.reflect.Member
Field,Method,Constructor都要继承的接口,它表示一个类中的元素
/** * Field,Method,Constructor都要继承的接口,它表示一个类中的元素 */ public interface Member { //表示类定义中全部(包括继承)的某类public元素 public static final int PUBLIC = 0; //表示当前类定义中(不包括继承)的全部某类元素 public static final int DECLARED = 1; //取得定义此元素的类 public Class getDeclaringClass(); //取得元素名 public String getName(); //取得元素修饰符 public int getModifiers(); }
interface AnnotatedElement
方法摘要
<T extends Annotation> T getAnnotation(Class<T> annotationClass)
如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
Annotation[]getAnnotations()
返回此元素上存在的所有注释。
Annotation[]getDeclaredAnnotations()
返回直接存在于此元素上的所有注释。
booleanisAnnotationPresent(Class<? extends Annotation> annotationClass)
如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。
class AccessibleObject
implements java.lang.reflect.AnnotatedElement
java.lang.reflect.AccessibleObject
AccessibleObject是 Field、Method 和 Constructor 对象的基类。
它提供了将反射的对象标记为在使用时取消默认Java 语言访问控制检查的能力。
对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用 Field、Method 或 Constructor 对象来设置或获得字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查。
interface Annotation
java.lang.annotation.Annotation
所有 annotation 类型都要扩展的公共接口
java.lang.Class annotationType();
返回此 annotation 的注释类型
java.beans.PropertyDescriptor
PropertyDescriptor类表示JavaBean类通过存储器导出一个属性。主要方法:
1、getPropertyType(),获得属性的Class对象。
2、getReadMethod(),获得用于读取属性值的方法;
getWriteMethod(),获得用于写入属性值的方法。
3 、setReadMethod(Method readMethod),设置用于读取属性值的方法;
setWriteMethod(MethodwriteMethod),设置用于写入属性值的方法;
//通过属性名获取对应的值,利用反射方法,如下: TestBean bean = new TestBean(); String propertyName = "field"; //给一个属性,获取值 PropertyDescriptor pd = new PropertyDescriptor(propertyName,bean.getClass()); Method methodGetX = pd.getReadMethod();//Read对应get()方法 Object reValue = methodGetX.invoke(bean); //给某个属性设置值,如下: String propertyName2 = "field";//给一个属性,设置值 PropertyDescriptor pd2 = new PropertyDescriptor(propertyName2,bean.getClass()); Method methodSetY = pd2.getWriteMethod();//Write对应set()方法 methodSetY.invoke(bean,3);
例子:
import java.beans.PropertyDescriptor; import java.lang.reflect.Method; public class Test { private String field; /** * @param field the field to set */ public void setField(String field) { this.field = field; System.out.println("set"); } /** * @return the field */ public String getField() { return ""; } public static void main(String[] args) throws Exception { Method method = new PropertyDescriptor("field", Test.class).getWriteMethod(); String clazz = new PropertyDescriptor("field", Test.class).getPropertyType().getName(); System.out.println("======="+clazz); Test a = new Test(); method.invoke(a, "aaa"); System.out.println(a.field); } }
结果:
=======java.lang.String
set
aaa
org.springframework.util.ReflectionUtils
反射操作类
ReflectionUtils.makeAccessible(method);
public static void makeAccessible(Method method) { if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers())) && !method.isAccessible()) { method.setAccessible(true); } }
Arrays.copyOf(elements, elements.length);
System.arraycopy(elements, head, a, 0, size());
相关推荐
预处理阶段,AutowiredAnnotationBeanPostProcessor 会对标注了 @Autowired 的 Bean 进行预处理,调用 postProcessMergedBeanDefinition() 方法对 Bean 的定义进行修改。然后,在真正的注入阶段,...
总的来说,`SmartInstantiationAwareBeanPostProcessor`接口及其实现类`AutowiredAnnotationBeanPostProcessor`在Spring Bean的创建过程中起着至关重要的作用,它们使得Spring能够智能地解析构造函数,根据注解完成...
这将隐式地向 Spring 容器注册 `AutowiredAnnotationBeanPostProcessor`、`CommonAnnotationBeanPostProcessor`、`PersistenceAnnotationBeanPostProcessor` 和 `RequiredAnnotationBeanPostProcessor`。 方式三:...
这将隐式地向 Spring 容器注册 `AutowiredAnnotationBeanPostProcessor`、`CommonAnnotationBeanPostProcessor`、`PersistenceAnnotationBeanPostProcessor` 和 `RequiredAnnotationBeanPostProcessor`。 3. 使用...
这个过程是通过`AutowiredAnnotationBeanPostProcessor`类来实现的,它是Spring对@Autowired注解的处理者。 @Autowired注解可以用于字段、方法和构造器,表示需要自动装配的依赖。Spring容器在实例化bean后,会对带...
在启动时,会有一个AutowiredAnnotationBeanPostProcessor后置处理器,处理这些注解,解决循环引用问题。 - 对于自我引用(A引用A)的情况,如果未指定`required=false`,Spring会尝试查找匹配的bean,找不到时抛出...
这个元素会注册四个BeanPostProcessor,包括`AutowiredAnnotationBeanPostProcessor`、`CommonAnnotationBeanPostProcessor`、`PersistenceAnnotationBeanPostProcessor`和`RequiredAnnotationBeanPostProcessor`。...
- AutowiredAnnotationBeanPostProcessor:处理自动注入 - AnnotationAwareAspectJAutoProxyCreator:来做AOP功能; - xxx.... - 增强的功能注解: AsyncAnnotationBeanPostProcessor - .... 2. 事件驱动模型...
### Spring基于注释...`<context:annotation-config/>`是Spring提供的一个配置选项,它可以自动注册多个BeanPostProcessor,包括`AutowiredAnnotationBeanPostProcessor`、`CommonAnnotationBeanPostProcessor`、`...
[[03 08:58:22,539 INFO ] org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.(AutowiredAnnotationBeanPostProcessor.java:153) - JSR-330 'javax.inject.Inject' annotation ...
为了使 `@Autowired` 能够生效,需要在 Spring 的配置文件中加入 `AutowiredAnnotationBeanPostProcessor` 的 Bean 定义: ```xml <bean class="org.springframework.beans.factory.annotation....
1. **显式注册**: 在XML配置中添加`<bean>`标签,如`<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>`,用于处理`@Autowired`注解。 2. **使用`...
深入Spring源码,我们可以看到`AutowiredAnnotationBeanPostProcessor`扮演了关键角色。它是Spring的后处理器,负责处理`@Autowired`、`@Qualifier`等注解。 1. `AutowiredAnnotationBeanPostProcessor`初始化 在...
4. **InstantiationAwareBeanPostProcessors**:在bean实例化之后,但属性注入之前进行处理,如AutowiredAnnotationBeanPostProcessor。 5. **DependencyDescriptor**:描述bean依赖的类,用于依赖解析。 通过分析...
在源码层面,`@Autowired`的处理主要发生在`AutowiredAnnotationBeanPostProcessor`类中,这是一个Bean后处理器,负责在Bean初始化后进行依赖注入。而`@Qualifier`的信息则被用来辅助`...
1. AutowiredAnnotationBeanPostProcessor:提供对 Spring 特有的 Autowired 和 Qualifier 注释。 2. CommonAnnotationBeanPostProcessor:用于支持 JSR 250 的注释。 3. PersistenceAnnotationBeanPostProcessor:...
在处理`@Autowired`时,`AutowiredAnnotationBeanPostProcessor`起着关键作用。这个类实现了Bean后处理器接口,会在Bean实例化后对`@Autowired`进行处理。它会遍历Bean的属性,根据类型匹配其他Bean,如果找到匹配的...
- `<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor">`也可以手动注册这个处理器,处理`@Autowired`注解。 5. **请求映射(@RequestMapping)** `@...