`
uule
  • 浏览: 6358891 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

AutowiredAnnotationBeanPostProcessor

 
阅读更多

AutowiredAnnotationBeanPostProcessor

 

当 Spring 容器启动时,AutowiredAnnotationBeanPostProcessor 将扫描 Spring 容器中所有 Bean,当发现 Bean 中拥有@Autowired 注释时就找到和其匹配(默认按类型匹配)的 Bean,并注入到对应的地方中去。  

 

interface Member

               java.lang.reflect.Member 

               API 

             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

              API

 

              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());

  

分享到:
评论

相关推荐

    Spring Ioc源码分析系列--@Autowired注解的实现原理.doc

    预处理阶段,AutowiredAnnotationBeanPostProcessor 会对标注了 @Autowired 的 Bean 进行预处理,调用 postProcessMergedBeanDefinition() 方法对 Bean 的定义进行修改。然后,在真正的注入阶段,...

    Spring 源码(14)Spring Bean 的创建过程(5).doc

    总的来说,`SmartInstantiationAwareBeanPostProcessor`接口及其实现类`AutowiredAnnotationBeanPostProcessor`在Spring Bean的创建过程中起着至关重要的作用,它们使得Spring能够智能地解析构造函数,根据注解完成...

    Spring注解详解

    这将隐式地向 Spring 容器注册 `AutowiredAnnotationBeanPostProcessor`、`CommonAnnotationBeanPostProcessor`、`PersistenceAnnotationBeanPostProcessor` 和 `RequiredAnnotationBeanPostProcessor`。 方式三:...

    spring注解

    这将隐式地向 Spring 容器注册 `AutowiredAnnotationBeanPostProcessor`、`CommonAnnotationBeanPostProcessor`、`PersistenceAnnotationBeanPostProcessor` 和 `RequiredAnnotationBeanPostProcessor`。 3. 使用...

    Spring由类型(Type)自动装配源码

    这个过程是通过`AutowiredAnnotationBeanPostProcessor`类来实现的,它是Spring对@Autowired注解的处理者。 @Autowired注解可以用于字段、方法和构造器,表示需要自动装配的依赖。Spring容器在实例化bean后,会对带...

    springMVC详解以及注解

    ### SpringMVC与注解...Spring 2.5版本中,提供了四大主要的注解BeanPostProcessor:`AutowiredAnnotationBeanPostProcessor`、`CommonAnnotationBeanPostProcessor`、`PersistenceAnnotationBeanPostProcessor` 和 `...

    SpringIOC问题-回复1

    在启动时,会有一个AutowiredAnnotationBeanPostProcessor后置处理器,处理这些注解,解决循环引用问题。 - 对于自我引用(A引用A)的情况,如果未指定`required=false`,Spring会尝试查找匹配的bean,找不到时抛出...

    Spring3注解介绍.docx

    这个元素会注册四个BeanPostProcessor,包括`AutowiredAnnotationBeanPostProcessor`、`CommonAnnotationBeanPostProcessor`、`PersistenceAnnotationBeanPostProcessor`和`RequiredAnnotationBeanPostProcessor`。...

    IOC创建流程.xmind

    - AutowiredAnnotationBeanPostProcessor:处理自动注入 - AnnotationAwareAspectJAutoProxyCreator:来做AOP功能; - xxx.... - 增强的功能注解: AsyncAnnotationBeanPostProcessor - .... 2. 事件驱动模型...

    Spring基于注释(Annotation)的配置.pdf

    ### Spring基于注释...`&lt;context:annotation-config/&gt;`是Spring提供的一个配置选项,它可以自动注册多个BeanPostProcessor,包括`AutowiredAnnotationBeanPostProcessor`、`CommonAnnotationBeanPostProcessor`、`...

    第14章:网络编程(day20).zip

    [[03 08:58:22,539 INFO ] org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.(AutowiredAnnotationBeanPostProcessor.java:153) - JSR-330 'javax.inject.Inject' annotation ...

    spring注解使用

    为了使 `@Autowired` 能够生效,需要在 Spring 的配置文件中加入 `AutowiredAnnotationBeanPostProcessor` 的 Bean 定义: ```xml &lt;bean class="org.springframework.beans.factory.annotation....

    Spring2.5 注解介绍(3.0通用)

    1. **显式注册**: 在XML配置中添加`&lt;bean&gt;`标签,如`&lt;bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/&gt;`,用于处理`@Autowired`注解。 2. **使用`...

    3Spring使用annotation方式autowire

    深入Spring源码,我们可以看到`AutowiredAnnotationBeanPostProcessor`扮演了关键角色。它是Spring的后处理器,负责处理`@Autowired`、`@Qualifier`等注解。 1. `AutowiredAnnotationBeanPostProcessor`初始化 在...

    spring IOC学习源码

    4. **InstantiationAwareBeanPostProcessors**:在bean实例化之后,但属性注入之前进行处理,如AutowiredAnnotationBeanPostProcessor。 5. **DependencyDescriptor**:描述bean依赖的类,用于依赖解析。 通过分析...

    spring中Autowired和Qulifier注解

    在源码层面,`@Autowired`的处理主要发生在`AutowiredAnnotationBeanPostProcessor`类中,这是一个Bean后处理器,负责在Bean初始化后进行依赖注入。而`@Qualifier`的信息则被用来辅助`...

    Spring2.5详细注解.doc

    1. AutowiredAnnotationBeanPostProcessor:提供对 Spring 特有的 Autowired 和 Qualifier 注释。 2. CommonAnnotationBeanPostProcessor:用于支持 JSR 250 的注释。 3. PersistenceAnnotationBeanPostProcessor:...

    Spring学习笔记(6)----编码剖析Spring依赖注入的原理

    在处理`@Autowired`时,`AutowiredAnnotationBeanPostProcessor`起着关键作用。这个类实现了Bean后处理器接口,会在Bean实例化后对`@Autowired`进行处理。它会遍历Bean的属性,根据类型匹配其他Bean,如果找到匹配的...

    spring注解文档

    - `&lt;bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"&gt;`也可以手动注册这个处理器,处理`@Autowired`注解。 5. **请求映射(@RequestMapping)** `@...

Global site tag (gtag.js) - Google Analytics