• 《Java Spring框架》扩展Spring案例(二)


    案例四:

    package accelerate1.LifeCycle;
    
    import org.springframework.context.SmartLifecycle;
    import org.springframework.stereotype.Component;
    
    @Component
    public class MyLifeCycle implements SmartLifecycle {
    
        boolean flag = false;
    
        @Override
        /**
         * isAutoStartup 返回值表示是否需要自动执行回调方法,true是;false否。
         * 因为Spring默认是需要手工执行的,Lifecycle接口甚至只能手工执行。
         */
        public boolean isAutoStartup() {
            return true;
        }
    
        @Override
        /**
         * 该方法用于调用Lifecycle的stop方法
         */
        public void stop(Runnable callback) {
            System.out.println("执行stop方法的内容");
            callback.run();   //callback.run 表示立刻停止
        }
    
        @Override
        public void start() {
            flag = true;
            System.out.println("执行start方法的内容");
        }
    
        @Override
        public void stop() {
        }
    
        @Override
        /**
         * 当isRunning方法返回值为false的时候才能调用start方法
         * 当isRunning方法返回值为true的时候才能调用stop方法
         */
        public boolean isRunning() {
            return flag;
        }
    
        @Override
        /**
         * 用于设置LifeCycle的执行优先度:值越小优先度越高。
         */
        public int getPhase() {
            return 0;
        }
    }
    package accelerate1.test;
    
    import accelerate1.app.AppConfig;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    public class Demo1 {
        public static void main(String[] args) {
            AnnotationConfigApplicationContext annotationConfigApplicationContext =
                    new AnnotationConfigApplicationContext(AppConfig.class);
            /** 因为是测试,主线程结束应用停止,监听不到stop方法。
             *  web项目停止,tomcat等web容器可以回调到stop方法。
             **/
            annotationConfigApplicationContext.stop();
        }
    }

    运行效果:

    案例五:

    package accelerate1.FactoryBean;
    
    public class Bing {
        public Bing(){
            System.out.println("-----bing-------");
        }
    }
    package accelerate1.FactoryBean;
    
    import org.springframework.beans.factory.FactoryBean;
    import org.springframework.stereotype.Component;
    
    @Component
    public class MyFactoryBean implements FactoryBean {
        @Override
        public Object getObject() throws Exception {
            return new Bing();
        }
    
        @Override
        public Class<?> getObjectType() {
            return null;
        }
    }
    package accelerate1.test;
    
    import accelerate1.app.AppConfig;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    public class Demo1 {
        public static void main(String[] args) {
            AnnotationConfigApplicationContext annotationConfigApplicationContext =
                    new AnnotationConfigApplicationContext(AppConfig.class);
            System.out.println(annotationConfigApplicationContext.getBean("myFactoryBean"));
        }
    }

    运行效果:

    Spring将第三方对象将给Spring管理有三种方式,上述案例是其中一种。

    1. 使用@Bean注解。

    2. 实现FactoryBean接口的getObject方法,该方法中将你的需要交给Spring的bean返回出来。

    3. 通过 AnnotationConfigApplicationContext 的API实现。 扫描包之前加入下方代码。

    annotationConfigApplicationContext.getBeanFactory().registerSingleton("bing",new Bing());

    案例六:

    package accelerate1.ann;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Acceleate {
    }
    package accelerate1.FactoryBean;
    
    import accelerate1.ann.Acceleate;
    
    @Acceleate
    public class Bing {
        public Bing(){
            System.out.println("-----bing-------");
        }
    }
    package accelerate1.scanner;
    
    import org.springframework.beans.factory.support.BeanDefinitionRegistry;
    import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
    import org.springframework.core.type.filter.TypeFilter;
    
    public class MyScanner extends ClassPathBeanDefinitionScanner {
    
        public MyScanner(BeanDefinitionRegistry registry) {
            super(registry);
        }
    
        @Override
        public void addIncludeFilter(TypeFilter includeFilter) {
            super.addIncludeFilter(includeFilter);
        }
    
    }
    package accelerate1.test;
    
    import accelerate1.FactoryBean.Bing;
    import accelerate1.ann.Acceleate;
    import accelerate1.app.AppConfig;
    import accelerate1.scanner.MyScanner;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.springframework.core.type.filter.AnnotationTypeFilter;
    
    public class Demo3 {
        public static void main(String[] args) {
            AnnotationConfigApplicationContext annotationConfigApplicationContext =
                    new AnnotationConfigApplicationContext();
            /**
             * 设置一个自己的注解给Spring 读取,这样就可以通过加自己的注解
             * 让Spring实现自己Bean。
             */
            MyScanner myScanner = new MyScanner(annotationConfigApplicationContext);
            myScanner.addIncludeFilter(new AnnotationTypeFilter(Acceleate.class));
            myScanner.scan("accelerate1");
    
            annotationConfigApplicationContext.register(AppConfig.class);
            annotationConfigApplicationContext.refresh();
            System.out.println(annotationConfigApplicationContext.getBean(Bing.class));
        }
    }

    运行结果:

    原来说明:上面所作事情,就是将自己写的注解放入includeFilters 中。如下图

    This moment will nap, you will have a dream; But this moment study,you will interpret a dream.
  • 相关阅读:
    罗素语录
    《一步一步写嵌入式操作系统》读书笔记1—Skyeye介绍、安装和HelloWorld
    在Raspberry Pi上安装XBMC
    Raspberry Pi上手
    axios案例
    php+mysql修改数据库数据
    将前台输入的“意见反馈”提交到后台数据库
    用JavaScript动态生成HTML(PHP+MYSQL)(2)
    用JavaScript动态生成HTML(PHP+MYSQL)(1)
    SQL课堂笔记--设计数据库
  • 原文地址:https://www.cnblogs.com/jssj/p/12437289.html
Copyright © 2020-2023  润新知