Spring,启动程序后顺序执行指定操作

启动执行类接口:

package test.core.startup;

public interface RunAfterStartToDo {

    Object startup();

}

启动执行类注解:

package test.core.startup;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface RunAfterStart {

    public int priority() default 7;

}

启动类处理:

package test.core.startup;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

import test.core.spring.ApplicationContextFactory;

@Component
public class RunAfterStartProcessor implements
        ApplicationListener<ContextRefreshedEvent> {

    static {
        System.out.println("auto loaded");
    }

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        if (event.getApplicationContext().getParent() == null) {
            ApplicationContext context = ApplicationContextFactory
                    .getApplicationContext();
            Map<String, Object> classMap = context
                    .getBeansWithAnnotation(RunAfterStart.class);
            TreeMap<Integer, List<RunAfterStartToDo>> map = new TreeMap<Integer, List<RunAfterStartToDo>>();
            for (Entry<String, Object> entry : classMap.entrySet()) {
                if (entry.getValue() != null) {
                    try {
                        RunAfterStartToDo startToDo = (RunAfterStartToDo) entry
                                .getValue();
                        RunAfterStart runAfterStart = startToDo.getClass()
                                .getAnnotation(RunAfterStart.class);
                        List<RunAfterStartToDo> list = map.get(runAfterStart
                                .priority());
                        if (list == null) {
                            list = new ArrayList<RunAfterStartToDo>();
                            map.put(runAfterStart.priority(), list);
                        }
                        list.add(startToDo);

                    } catch (Exception e) {
                        continue;
                    }
                }
            }

            for (Entry<Integer, List<RunAfterStartToDo>> entry : map.entrySet()) {
                System.out.println("Start to do priority " + entry.getKey());
                for (RunAfterStartToDo startToDo : entry.getValue()) {
                    startToDo.startup();
                }
            }
        }
    }
}

测试例子:

第一个

package test;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Component;

import test.core.startup.RunAfterStart;
import test.core.startup.RunAfterStartToDo;

@RunAfterStart
@Component
public class DoLoop implements RunAfterStartToDo {

    private static final Log log = LogFactory.getLog("SS");

    @Override
    public Object startup() {
        for (int i = 0; i < 10; i++) {
            log.info("hello loop at " + i);
            try {
                Thread.sleep(200l);
            } catch (InterruptedException e) {
                e.printStackTrace();
                break;
            }
        }
        return null;
    }

}

第二个

package test;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Component;

import test.core.startup.RunAfterStart;
import test.core.startup.RunAfterStartToDo;

@RunAfterStart(priority = 5)
@Component
public class PrintMessage implements RunAfterStartToDo {

    private static final Log log = LogFactory.getLog("TT");

    @Override
    public Object startup() {
        log.info("TT is in.");
        return null;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值