FactoryBean @Resource против @Autowired - PullRequest
0 голосов
/ 05 мая 2020

Мои классы проекта в приложении весенней загрузки:

package com.example.demo;

public class FirstModel {
    public String getString(){
        return "first model";
    }
}
package com.example.demo;

public class SecondModel {
    public String getString(){
        return "second model";
    }
}

package com.example.demo;

import org.springframework.beans.factory.FactoryBean;

public class MyFactory implements FactoryBean {

    Class<?> clazz;

    @Override
    public Object getObject() throws Exception {
        if (clazz.equals(FirstModel.class)) return new FirstModel();
        else return new SecondModel();
    }

    @Override
    public Class<?> getObjectType() {
        return clazz;
    }
}
package com.example.demo;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfiguration {

    @Bean
    public MyFactory getMyFactory(){
        MyFactory myFactory = new MyFactory();
        myFactory.clazz = SecondModel.class;
        return myFactory;
    }
}
package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
public class HelloController {

    @Resource
    SecondModel secondModel;

    @RequestMapping("/")
    public String index() {
        return firstModel.getString();
    }

}

Почему, когда я вводю аннотацию @Resource, она работает нормально, но когда я использую @Autowired

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
public class HelloController {

    @Autowired
    SecondModel secondModel;

    @RequestMapping("/")
    public String index() {
        return secondModel.getString();
    }

}

Intellij Idea говорит, что

«Не удалось выполнить автоматическое подключение. Не найдены компоненты типа« SecondModel »», но когда я запускаю приложение, оно также отлично работает как @ Resource

Есть ли разница между обнаружением bean-компонентов @Resource и @Autowired во время компиляции или во время выполнения? Насколько я знаю, если в @Resource нет атрибутов, он работает как @Autowired по типу.

1 Ответ

0 голосов
/ 05 мая 2020

Чтобы использовать аннотацию @Autowired, должен присутствовать bean-компонент этого класса. Чтобы инициализировать глобальный компонент любого класса, вы должны применить @Service или подобные аннотации к этому классу.

Как в вашем случае Class SecondModel, например:

package com.example.demo;

@Service
public class SecondModel {
    public String getString(){
        return "second model";
    }
}

Есть другие аннотации, которые могут замените @Service, и это зависит от функциональности этого класса.

Как @Component или @Repository См. здесь для этого.

...