@PostConstruct 该注解被用来修饰一个非静态的 void() 方法。被 @PostConstruct 修饰的方法会在服务器加载 Servlet 的时候运行,并且只会被服务器执行一次。@PostConstruct 在构造函数之后执行,init() 方法之前执行。@PostConstruct 注解的方法将会在依赖注入完成后被自动调用。
执行顺序如下:
Constructor >> @Autowired >> @PostConstruct
public class FileUtil {
private static FileUtil fileUtil;
@Autowired
private AssetRepository assetRepository;
@PostConstruct
public void init() {
fileUtil = this;
fileUtil.assetRepository = this.assetRepository;
}
}
Spring Team 推荐的写法
private final AssetRepository assetRepository;
public AssetResource(AssetRepository assetRepository) {
this.assetRepository = assetRepository;
}
比 autowired 注解安全。
private UserDao userDao;
@Autowired
public void setUserDao (UserDao userDao) {
this.userDao = userDao;
}
@Autowired
private AssetRepository assetRepository;
@Resource
默认按照 byName 自动注入,由 J2EE 提供,需要导入 javax.annotation.Resource
它有两个重要的属性 name 和 type,而 Spring 将 @Resource 注解的 name 属性解析为 bean 的名字,而 type 属性则解析为 bean 的类型
所以,如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略
如果 name 和 type 属性都未指定,则默认 byName 注入,byName 未找到时,会继续采用 byType 注入
@Autowired
采用 byType 自动注入,由 Spring 提供,需要导入org.springframework.beans.factory.annotation.Autowired
默认情况要求对象必须存在,如果需要为 null,可以设置它的 required=true
如果接口存在多个实现类,我们依然可以 byName 自动注入:通过与 @Qualifier 搭配使用
即先 byType,byType 匹配到多个时,再通过 byName
@PostConstruct 注解
@Autowired 警告