《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.
原文地址:https://www.cnblogs.com/jssj/p/12437289.html