第一,为什么要加@Component注解?
主要含义:
Bean 自动发现:
当 Spring 应用启动时,它会扫描带有 @Component 注解的类,并将它们注册为 Spring 容器中的 Bean。
这意味着这些类的实例将由 Spring 管理,可以被依赖注入(Dependency Injection)到其他 Bean 中。
依赖注入:
通过 @Autowired 或 @Inject 注解,可以将 Spring 管理的 Bean 注入到其他类中。
例如,如果工具类被标记为 @Component,则可以在其他类中通过 @Autowired 注解注入工具类的实例。
第二,那为什么有的工具类要加@Component,有的不加?
这里我给大家两个常用的实例
//JWT工具类
public class JwtUtil {
/**
* 生成jwt
* 使用Hs256算法, 私匙使用固定秘钥
*
* @param secretKey jwt秘钥
* @param ttlMillis jwt过期时间(毫秒)
* @param claims 设置的信息
* @return
*/
public static String createJWT(String secretKey, long ttlMillis, Map<String, Object> claims) {
//.......
}
public static Claims parseJWT(String secretKey, String token) {
//........
}
}
//阿里云 OSS 工具类
@Component
public class AliOssUtil {
@Autowired
private AliOssProperties aliOSSProperties;
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
public AliOssUtil() throws ClientException {
}
public String upload(MultipartFile file) throws IOException {
//......
}
}
以上两个例子一个是JWT工具类---JwtUtil,一个是阿里云oss工具类
明显可以观察到JwtUtil中的方法都是静态方法,而静态方法可以直接通过类名调用,不需要实例化对象。
第三,那为什么我们不能把工具类的方法都变为静态方法
在 Java 中,静态方法属于类级别,而不是实例级别(对象)。因此,静态方法不能直接使用依赖注入(如 @Autowired)来注入实例变量。这是因为依赖注入通常是在类的实例化过程中进行的,而静态方法不依赖于类的实例。
简而言之,如果此工具类需要注入其他实例变量,那么就不能使用静态方法