一、建立bean的三種方式java
使用bean註解直接注入ide
實現FactoryBeanthis
在其餘類中間接建立spa
1 @Configuration 2 public class MyConfig { 3 4 @Bean 5 @Scope("prototype") 6 public MyBean createBean(){ 7 return new MyBean(); 8 }
public class AppDemo { public static void main(String[] args){ AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(MyConfig.class); System.out.println(context.getBean("Mybean")); context.close(); } }
public class MyBean { }
@Scope bean默認爲單例的模式,使用Scop而註解能夠更換爲雙例prototype
context.getBean() 能夠經過類,和方法名進行獲取。方法名須要在Bean中加入方法名稱@Bean("createBean")code
AnnotationConfigApplicationContext 源碼中 有多種注入類的方式,截取其中的2點component
第二種方式
public class RunnableFactoryBean implements FactoryBean<jeep> { @Override public jeep getObject() throws Exception { return new jeep(); } @Override public Class<?> getObjectType() { return jeep.class; } @Override public boolean isSingleton() { return true; } }
@Bean public RunnableFactoryBean createRunnableFactoryBean(){ return new RunnableFactoryBean(); }
其中 FactoryBean 源碼以下,默認未單例模式blog
第三種方式繼承
public class CarFactory { public cat createCat(){ return new cat(); } }
須要建立一個cat類生命週期
在CarFactory中建立cat
在配置文件中configration中注入bean
main方法輸出類
---------------------------------------------------
Bean的初始化方法
@使用Bean直接 @Bean(init-method=「」,destoryMethod=「」)
@使用註解PostContruts,PreDestory
@繼承InitialazingBean,DispoableBean 重寫其方法
第一種方式
public class Dag { public void init(){ System.out.println("進行數據的初始化"); } public void destory(){ System.out.println("進行數據的銷燬工做"); } }
配置文件添加其下
@Bean(initMethod="init",destroyMethod = "destory") public Dag createDog(){ return new Dag(); }
直接在main打印輸出便可
第二種方法
public class Dog { @PostConstruct public void init(){ System.out.println("進行數據的初始化"); } @PreDestroy public void destory(){ System.out.println("方法進行數據的銷燬工做"); } }
在配置文件中將Dog類進行注入
@Bean public Dog createDogs(){ return new Dog(); }
在main中獲取Dog的初始化
第三種方法
public class Car implements InitializingBean,DisposableBean { @Override public void afterPropertiesSet() throws Exception { System.out.println("afterPropertiesSet-------"); } @Override public void destroy() throws Exception { System.out.println("須要關閉容量纔會執行的銷燬的方法"); } }
將Car類注入到容器
@Bean public Car creatCar(){ return new Car(); }
在main中打印輸出
-----------
Spring AnnotationConfigApplicationContext 掃包的方式
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) { this(); this.register(annotatedClasses); this.refresh(); } public AnnotationConfigApplicationContext(String... basePackages) { this(); this.scan(basePackages); this.refresh(); }
用第二種方式進行掃包
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(「加項目的路徑便可」);
列如
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(「com.demo.example」);
@ 如何排除不要的包
使用 componentScan註解
單首創建一個配置類
添加掃描註解
添加配置註解
@ComponentScan(basePackages="com.example.demo", excludeFilters =@ComponentScan.Filter(type= FilterType.ASSIGNABLE_TYPE,classes =cat.class )) @Configuration public class MyConfig2 { }
咱們來看下@ComponentScan 底層代碼有哪些內容
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) @Documented @Repeatable(ComponentScans.class) public @interface ComponentScan { @AliasFor("basePackages") String[] value() default {}; @AliasFor("value") String[] basePackages() default {}; Class<?>[] basePackageClasses() default {}; Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class; Class<? extends ScopeMetadataResolver> scopeResolver() default AnnotationScopeMetadataResolver.class; ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT; String resourcePattern() default "**/*.class"; boolean useDefaultFilters() default true; ComponentScan.Filter[] includeFilters() default {}; ComponentScan.Filter[] excludeFilters() default {}; boolean lazyInit() default false; @Retention(RetentionPolicy.RUNTIME) @Target({}) public @interface Filter { FilterType type() default FilterType.ANNOTATION; @AliasFor("classes") Class<?>[] value() default {}; @AliasFor("value") Class<?>[] classes() default {}; String[] pattern() default {}; } }
public enum FilterType { ANNOTATION, ASSIGNABLE_TYPE, ASPECTJ, REGEX, CUSTOM; private FilterType() { } }
裏面包含了包含,以及 排除的方法,須要制定排除的類型有5種方法,怎末用能夠看註解或者找度娘
咱們選擇第二種方法須要排除一個配置類
exCludeFilter=@Filter(type="ASSIGNABLE_TYPE",classes="一個配置類
--------------------------------
AnnotationConfigAppliactionContext
使用完畢後必定要關掉,不然在生命週期的時候會不執行destory銷燬方法。
裝載bean的2種方式
@Configration
@Component,controller,service等