@Order、@PostConstruct、@DependsOn注解使用

一、@Order注解

  1. 介绍:注解@Order或者接口Ordered的作用是定义Spring IOC容器中Bean的执行顺序的优先级;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Documented
public @interface Order {

	/**
	 * 默认是最低优先级,值越小执行顺序优先级越高
	 */
	int value() default Ordered.LOWEST_PRECEDENCE;
}
public interface Ordered {
    int HIGHEST_PRECEDENCE = -2147483648;
    int LOWEST_PRECEDENCE = 2147483647;

    int getOrder();
}
  1. 使用:通过值控制执行顺序;
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE) //值越小,执行优先级越高
public class Test {
}

二、@PostConstruct注解

  1. 介绍:@PostConstruct注解可以影响Servlet的生命周期,用来修饰一个非静态的void()方法;被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。

    PostConstruct() 在构造函数之后执行,init() 方法之前执行;
    PreDestroy() 方法在destroy() 方法之后执行;

  2. 使用:作用在非静态无返回值的方法上;

@PostConstruct
private void init() {
// 初始化
}
  1. 初始化顺序:Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)

三、@DependsOn注解

  1. 介绍:控制bean初始化顺序。比如有个场景需要bean B应该被先于bean A被初始化,我们可以在bean A上使用@DependsOn注解,告诉容器bean B应该先被初始化。
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DependsOn {
    String[] value() default {}; // 可以定义多个需要优先初始化的bean
}

  1. 使用:标注在带有@Component注解的类上面;或者标注在带有@Bean 注解的方法上面;
@DependsOn({"testB", "testC"})
@Component
public class TestA {
	// Bean TestA的初始化依赖于testB、testC,也就是说testB、testC会先于testA初始化
}
@Configuration
public class TestA {

    @Bean
    @DependsOn(value = "testB")
    public Test init() {
    }
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用@PostConstruct注解可以在Bean初始化之前自定义操作,比如读取数据库。具体实现步骤如下: 1. 在Spring配置文件中配置数据源和JdbcTemplate。 2. 在需要读取数据库的类中使用@PostConstruct注解标注一个方法。 3. 在该方法中使用JdbcTemplate执行SQL语句,将结果存储到缓存中。 4. 在需要使用缓存数据的方法中直接使用缓存数据即可。 举个例子,假设我们需要读取一个用户表的数据并将其存储到缓存中,具体实现步骤如下: 1. 在Spring配置文件中配置数据源和JdbcTemplate: ``` <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="root"/> <property name="password" value="root"/> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> ``` 2. 在需要读取数据库的类中使用@PostConstruct注解标注一个方法: ``` @Component public class UserCache { private Map<Integer, User> cache = new HashMap<>(); @Autowired private JdbcTemplate jdbcTemplate; @PostConstruct public void init() { String sql = "SELECT * FROM user"; List<User> userList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class)); for (User user : userList) { cache.put(user.getId(), user); } } public User getUserById(int id) { return cache.get(id); } } ``` 3. 在该方法中使用JdbcTemplate执行SQL语句,将结果存储到缓存中。 4. 在需要使用缓存数据的方法中直接使用缓存数据即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值