案例四:
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 中。如下图