我们可以看到IDEA的Spring板块中也显示了我们刚刚通过直接在类上添加@Component声明的Bean。
与@Component同样效果的还有@Controller、@Service和@Repository,但是现在暂时不提,讲到SpringMVC时再来探讨。
现在我们就有两种方式注册一个Bean了,那么如何实现像之前一样的自动注入呢,比如我们将Card也注册为Bean,我们希望Spring自动将其注入到Student的属性中:
- @Component
- public class Student {
- String name;
- int sid;
- Card card;
- }
因此,我们可以将此类型,也通过这种方式注册为一个Bean:
- @Component
- @Scope("prototype")
- public class Card {
- }
现在,我们在需要注入的位置,添加一个@Resource注解来实现自动装配:
- @Component
- public class Student {
- String name;
- int sid;
-
- @Resource
- Card card;
- }
这样的好处是,我们完全不需要创建任何的set方法,只需要添加这样的一个注解就可以了,Spring会跟之前配置文件的自动注入一样,在整个容器中进行查找,并将对应的Bean实例对象注入到此属性中,当然,如果还是需要通过set方法来注入,可以将注解添加到方法上:
- @Component
- public class Student {
- String name;
- int sid;
- Card card;
-
- @Resource
- public void setCard(Card card) {
- System.out.println("通过方法");
- this.card = card;
- }
- }
除了使用@Resource以外,我们还可以使用@Autowired(IDEA不推荐将其使用在字段上,会出现黄标,但是可以放在方法或是构造方法上),它们的效果是一样的,但是它们存在区别,虽然它们都是自动装配:
并且@Autowired可以配合@Qualifier使用,来指定一个名称的Bean进行注入:
- @Autowired
- @Qualifier("sxc")
- public void setCard(Card card) {
- System.out.println("通过方法");
- this.card = card;
- }
如果Bean是在配置文件中进行定义的,我们还可以在方法的参数中使用@Autowired来进行自动注入:
- @ComponentScan("com.test.bean")
- @Configuration
- public class MainConfiguration {
-
- @Bean
- public Student student(@Autowired Card card){
- Student student = new Student();
- student.setCard(card);
- return student;
- }
- }
我们还可以通过@PostConstruct注解来添加构造后执行的方法,它等价于之前讲解的init-method:
- @PostConstruct
- public void init(){
- System.out.println("我是初始化方法!1");
- }
注意它们的顺序:Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct
同样的,如果需要销毁方法,也可以使用@PreDestroy注解,这里就不做演示了。
这样,两种通过注解进行Bean声明的方式就讲解完毕了,那么什么时候该用什么方式去声明呢?