@Autowired如何使用反射工作,以及如何调用适当的设置方法

时间:2019-01-10 08:46:48

标签: spring dependency-injection inversion-of-control ioc-container

我的主要问题是我可以使用Reflection API并且可以在User bean类中调用setter方法。但是我只有Only UserBean对象。我不知道要调用哪个setter方法。我想提取我的User Bean对象中的所有信息,并使用反射方法来调用合适的方法。

//->这是我的用户Bean类

public class User {

 private String name;
 private int age;

private String getName() {
    return name;
}
private void setName(String name) {
    this.name = name;
}
private int getAge() {
    return age;
}
private void setAge(int age) {
    this.age = age;
}

 void callMethod() { System.out.println("Name :- "+name+" Age :-"+age); }

 @Override
  public String toString() { return "User [name=" + name + ", age=" + age + "]";}
}

// --->这是我的主要方法

public class TestCase {

public static Object getBean(String beanClassName) throws Exception
{
    Class klass = Class.forName(beanClassName);
    Object obj = klass.newInstance();            
    Method[] b = klass.getDeclaredMethods();

    String MethodName1 = "setName";
    String MethodName2 = "setAge";
    String name ="sanket";
    int age = 21;

    for(int i=0;i<b.length;i++)
    {
        if(b[i].getParameterTypes().toString().equals(MethodName1))
        {
             b[i].setAccessible(true);
             b[i].invoke(obj,name); 
        }
        if(b[i].getName().equals(MethodName2))
        {
             b[i].setAccessible(true);
             b[i].invoke(obj,age);  
        }
    }


    return obj;
}

public static void main(String ars[]) throws Exception
{
    Object obj1 = getBean("www.Fouth.User");

    System.out.println(obj1.toString());
}
}

我的情况是,我可以手动调用setter方法,因为我可以调用方法名称的setter方法库。

我想要提取User Bean类中的信息,并根据值确定要调用的设置器。

在春季@AutoWired就是这样做的。他们如何识别要调用和注入依赖项的setter。

1 个答案:

答案 0 :(得分:0)

Spring通过找出用@Autowired@Inject@Resources等进行注释的setter来识别要注入依赖的setter。

然后,通过检查setter参数的类型来找出要注入setter的值,并注入具有相同类型的bean。

如果多个bean具有相同的类型,则检查bean名称。它将使用@Qaulifer@Resources注入与注入点中配置的名称相同的bean。

如果仍有多个需要注入的bean,则会发生NoUniqueBeanDefinitionException

如果没有满足注入的bean,则会发生NoSuchBeanDefinitionException