关于Spring的核心功能IOC/DI在前面几篇文章写过。
我们讲过,在xml配置文件中配置bean组件,显得太过繁琐,而且写的越多越乱。解决此问题Spring提供了注解:用于声明Bean,注入Bean属性等功能。
注意:
- 注解被编译器检查处理,编译器可以检查注解使用错误!
- 注解大多采用自动方式执行,减少配置,写的少做的多。
- 在源代码中直接书写,自己开发程序可以标注注解。
- 注解声明的组件和XML声明的组件地位平等。
我们如何像在xml配置文件中声明Bean组件?Spring提供了多个声明组件的注解,其功能是一样的。
@Component 其他情况下使用
@Service 在业务层组件上使用
@Controller 在控制器组件上使用
@Repository 在持久化层上使用
注:Spring建议按照软件的层次使用注解
1.加注解
拿User类来说,在User类上加@Component注解。
package entity;
import org.springframework.stereotype.Component;
@Component
public class User {
private String userName;
private Integer age;
private String sex;
private Phone phone;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Phone getPhone() {
return phone;
}
public void setPhone(Phone phone) {
this.phone = phone;
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", phone=" + phone +
'}';
}
}
注意此时我们直接获取User类是获取不到的,Spring提供了包扫描配置,就是说在创建Spring容器时,自动扫描该包下所有加注解的组件,扫描到就会自动创建Bean组件。xml配置头内容参考spring官网。
2.配置包扫描
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<--我的User类在entity包下-->
<context:component-scan base-package="entity"/>
</beans>
这时在创建Spring容器时,Spring会自动扫描entity包下的Spring注解,然后自动创建Bean组件。自动分配ID。id为类名,第一个小写。
可以自己测试一下,是否获取到该Bean组件。
@Test
public void componentScan(){
User user = cpx.getBean("user",User.class);
System.out.println(user);
}
3.@Autowired注解
xml配置中的自动注入,我们可以使用@Autowired注解。他的规则如下:
- 自动按照类型匹配组件,如果类型重复再按照组件名称匹配
- 如果没有匹配成功,就报运行错误
- 注解支持"Bean属性"注入和"对象属性"注入
@Component
public class User {
private String userName;
private Integer age;
private String sex;
@Autowired //根据类型匹配
private Phone phone;
getter、setter方法省略。
}
有人会问,如何根据名字进行匹配?答:直接在注解上加名字就OK了。
@Component("phone")
public class Phone {
private String phone = "12345678";
。。。
}
4.其他使用
我们在xml配置文件中写的生命周期管理,懒惰初始化,多例应该怎么实现?都是一样,还是使用注解的方式,无需在xml中配置。
@Component
@Scope("prototype") //设置多例
@Lazy //懒惰初始化
public class User {
private String userName;
private Integer age;
private String sex;
@Autowired //自动注入
private Phone phone;
@PostConstruct//初始化执行方法
public void init() {
System.out.println("正在初始化。。。");
}
@PreDestroy//销毁之前执行方法,注意设置为多例仍然不会执行该方法
public void destroy() {
System.out.println("正在销毁。。。");
}
。。。
}