首页 > 解决方案 > @Autowired 如何使用反射以及如何调用适当的 Setter 方法

问题描述

我的主要问题是我可以使用反射 API,并且可以在我的 User bean 类中调用 setter 方法。但是我只有 UserBean 对象。我不知道要调用哪个 setter 方法。我想提取我的用户 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 方法基础。

我想在用户 Bean 类中提取信息,并根据要调用的 setter 的值来确定。

在春天,@AutoWired 就是这样做的。他们将如何识别调用哪个设置器并注入依赖项。

标签: springdependency-injectioninversion-of-controlioc-container

解决方案


Spring 通过确定哪些 setter 用 , 等注释来识别哪些 setter 注入@Autowired依赖@Inject@Resources

然后它通过检查 setter 参数的类型来确定将哪个值注入到 setter 中,并注入具有相同类型的 bean。

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

如果仍然有多个 bean 满足注入,NoUniqueBeanDefinitionException就会发生。

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


推荐阅读