我们可以看到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不推荐将其使用在字段上,会出现黄标,但是可以放在方法或是构造方法上),它们的效果是一样的,但是它们存在区别,虽然它们都是自动装配:
- @Resource默认ByName如果找不到则ByType,可以添加到set方法、字段上。
- @Autowired默认是byType,可以添加在构造方法、set方法、字段、方法参数上。
并且@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声明的方式就讲解完毕了,那么什么时候该用什么方式去声明呢?
- 如果要注册为Bean的类是由其他框架提供,我们无法修改其源代码,那么我们就使用第一种方式进行配置。
- 如果要注册为Bean的类是我们自己编写的,我们就可以直接在类上添加注解,并在配置中添加扫描。