Как @Autowired работает с использованием Reflection и как вызывать соответствующий метод Setter - PullRequest
0 голосов
/ 10 января 2019

Моя главная проблема заключается в том, что я могу использовать Reflection API и вызывать метод setter в своем классе пользовательских бинов. Но у меня есть только объекты UserBean. Я не знаю, какой метод установки вызывать. Я хочу извлечь всю информацию в моем объектном компоненте пользователя и вызывать соответствующий метод, используя Reflection.

// -> Этот класс бина "Мой пользователь"

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

В моем случае я могу вызвать метод установки вручную, потому что я могу вызвать основы метода установки имени метода.

Я хочу извлечь информацию из класса пользовательских бинов и определить на основе значения, какой установщик вызывается.

Весной @AutoWired это делает. Как они определят, какой установщик вызывать и вводить зависимость.

1 Ответ

0 голосов
/ 10 января 2019

Spring определяет, какие сеттеры для внедрения зависимостей, выясняя, какие сеттеры помечены @Autowired, @Inject, @Resources и т. Д.

Затем выясняется, какое значение нужно ввести в установщик, проверяя тип аргументов установщика и вводит компонент с таким же типом.

Если несколько бинов имеют одинаковый тип, он проверяет имя бина. Он будет внедрять компонент, имя которого совпадает с именем, заданным в точке ввода с помощью @Qaulifer или @Resources.

Если все еще есть несколько бинов, которые удовлетворяют инъекции, происходит NoUniqueBeanDefinitionException.

Если нет бобов, удовлетворяющих инъекции, NoSuchBeanDefinitionException происходит.

...