标签:value color public 判断 属性 构建 object 引入 ica
在将Spring框架应用于项目开发中时,繁多的xml配置文件会使项目的维护升级变得困难,特别是项目很大时,有时候会花掉大量的时间去定位相应的组件配置。为了解决这个问题,引入Spring框架中的强大注解变得很重要,同时,注解的学习更是为后期学习Spring Boot做好了铺垫。
@Configuration @Configuration注解用于定义配置类,并用于构建bean定义,初始化Spring容器,被标注的类类似于Spring的xml配置文件中的标签。
@Bean 给容器注册一个Bean;类型为方法返回值类型,id不指定时默认使用方法名作为id。
@ComponentScan 配置自动扫描相应的包。会自动扫描包路径下面的所有@Controller、@Service、@Repository、@Component 的类。包含的属性如下:
value:指定扫描的包路径。接收String数组。
@Filter:声明扫描包的过滤规则,可以按注解、类型、正则表达式等进行过滤。
@ComponentScans 如果是JDK8以上可以声明多个@ComponentScan进行配置,也可以在@ComponentScans中配置多个@ComponentScan。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 @Configuration @ComponentScan (value="com.jt" , includeFilters = { @Filter (type=FilterType.ANNOTATION,classes={Controller.class,Service.class})},useDefaultFilters=false) public class MainConfig { @Bean ("person1" ) public Person person(){ return new Person ("lishi" ,20 ); } }
@Scope 控制Bean的作用范围。
@Lazy 懒加载。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @Scope ("prototype" )@Lazy @Bean ("person" )public Person person(){ System .out .println ("获取Person...." ); return new Person ("张三" ,25 ); }
@Conditional(条件注解) 标注在方法上时,按照一定的条件进行动态转配,满足条件才给容器中注册Bean。标注在配置类上时,满足当前条件,这个类配置中的所有Bean才能生效。其中这个条件类必须实现Condition接口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @Conditional ({WindowsCondition.class})@Bean ("bill" )public Person person01(){ return new Person ("Bill Gates" ,60 ); } @Conditional ({LinuxCondition .class }) @Bean ("linus" ) public Person person02 (){ return new Person ("linus" ,40 ); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public class implements Condition { public boolean matches (ConditionContext context, AnnotatedTypeMetadata metadata) { ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); ClassLoader classLoader = context.getClassLoader(); Environment environment = context.getEnvironment(); BeanDefinitionRegistry registry = context.getRegistry(); boolean difinition = registry.containsBeanDefinition("person" ); String property = environment.getProperty("os.name" ); if (property.contains("linux" )){ return true ; } return false ; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class WindowsCondition implements Condition { public boolean matches (ConditionContext context, AnnotatedTypeMetadata metadata) { Environment environment = context.getEnvironment(); String property = environment.getProperty("os.name" ); if (property.contains("Windows" )){ return true ; } return false ; } }
@Import 快速给容器中注册组件。id默认是全类名。
1 2 3 4 ({Color.class }) public class MainConfig2 { }
ImportSelector:如果某个类实现了ImportSelector接口,通过重写接口中的方法selectImports,可以将需要注册的类的全类名返回给@Import注解,并实现批量注册。
1 2 3 4 ({MyImportSelector.class }) public class MainConfig2 { }
1 2 3 4 5 6 7 8 9 10 11 12 public class MyImportSelector implements ImportSelector { public String [] selectImports(AnnotationMetadata importingClassMetadata) { return new String []{"com.jt.bean.Color" ,"com.jt.bean.Red" }; } }
ImportBeanDefinitionRegistrar:手动注册Bean到容器中。
1 2 3 4 ({MyImportSelector.class ,MyImportBeanDefinitionRegistrar.class }) public class MainConfig2 { }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { boolean difinition = registry.containsBeanDefinition("com.jt.bean.Red" ); if (difinition){ RootBeanDefinition paramBeanDefinition = new RootBeanDefinition(RainBow.class); registry.registerBeanDefinition("com.jt.bean.RainBow" , paramBeanDefinition); } } }
使用FactoryBean注册组件 Spring提供了一个org.Springframework.bean.factory.FactoryBean的工厂类接口,用户可以通过实现该接口定制实例化bean的逻辑。
1 2 3 4 @Bean public ColorFactoryBean colorFactoryBean () { return new ColorFactoryBean(); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public class ColorFactoryBean implements FactoryBean <Color > {public Color getObject () throws Exception { System.out.println("ColorFactoryBean...getObject()..." ); return new Color(); } public Class<?> getObjectType() { return Color.class; } public boolean isSingleton () { return true ; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 @Test public void testImport(){ ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2 .class ); printBeans(applicationContext); Object object = applicationContext.getBean("colorFactoryBean" ); Object object 2 = applicationContext.getBean("colorFactoryBean" ); System.out .println(object ); System.out .println(object == object 2 ); Object object 3 = applicationContext.getBean("&colorFactoryBean" ); System.out .println(object 3 ); }
原文:大专栏 Spring应用于组件注册的注解(一)
Spring应用于组件注册的注解(一)
标签:value color public 判断 属性 构建 object 引入 ica
原文地址:https://www.cnblogs.com/peterchan1/p/11633167.html