文章目录
前言
最近碰到好多类似能让方法在服务/程序启动的时候执行自定发代码的方法,现在来总结下
一、CommandLineRunner
这个在我学习Java实现文件监听 FileFilterUtils相关使用的时候就说过了,复制一遍
@FunctionalInterface
public interface CommandLineRunner {
/**
* Callback used to run the bean.
* @param args incoming main method arguments
* @throws Exception on error
*/
void run(String... args) throws Exception;
}
简单来说,实现这个接口的run方法,就可以在项目启动时,执行run方法的内容,这里,我在run方法里定义了文件监听器的定义和绑定,和初始化文件路径(需要使用的路径如果不存在就创建)
下面是代码,需要注意的是,实现CommandLineRunner的类需要注入到Spring命名空间,@Component之类的(我这里程序需要,不知道不加行不行),如果有多个实现了这个接口的类,可以使用@Order(value=1)这样的来指定执行顺序
二、@PostConstruct
第二个就是我在碰到工具类Utils中注入Service运行时为null问题时,了解的,用法可以点击进去看看
@PostConstruct 点进去可以看到是来自package javax.annotation; 是Java自己的注解
源码中的注释
这个注解@PostConstruct的作用大概就是被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。
找了张网图⬇
三、实现InitializingBean接口
第三种是实现InitializingBean接口重写其afterPropertiesSet方法,实现DisposableBean接口重写destroy方法
InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。
具体代码查看Spring中的InitializingBean接口的使用,没去操作过
四、 @Bean(initMethod = “xxx”, destroyMethod = “xxx”)
最后一个就算我今天刚看到的,在使用@Bean注解定义bean的时候指定初始化方法
Java truelicense 实现License授权许可和验证
这个方法就是在服务开始的时候,把一个方法注册成bean,并通过指定initMethod属性来让这个方法在服务开始时执行,这里我用例在服务启动时安装证书。
Tisp: 不指定initMethod不会自动执行初始化方法
五、@Bean和@Component有什么不一样,都是创建bean
众所周知,@Bean是为目标创建一个bean。我不禁在想,这和@Component @Controller @Service @Repository @Configuration等一系列实际上是使用@Component来加入spring容器的方法有什么不一样
于是我总结了以下几个不一样的地方
第一点,@Component和@Bean做两件完全不同的事情,不应该混淆。
@Component(以及@Service和@Repository)用于使用类路径扫描自动检测和自动配置bean。在带注释的类和bean之间有一个隐含的一对一映射(即每个类一个bean)。这种方法对连接的控制非常有限,因为它纯粹是声明性的。
@Bean用于显式声明单个bean,而不是像上面那样让Spring自动声明。它将bean的声明与类定义解耦,并允许您按照选择的方式创建和配置bean。
意思就是,@Component是标记,然后等着spring扫描创建bean,@Bean是主动创建
第二点,@Componet 一般放在类上面,@Bean放在方法上面
相同点:@Componet /@Bean生成的bean都提供给autowire使用