Spring应用于组件注册的注解 Posted 2023-01-03 peterchan1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring应用于组件注册的注解相关的知识,希望对你有一定的参考价值。
在将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应用于组件注册的注解的主要内容,如果未能解决你的问题,请参考以下文章
如何将一个组件注册到容器中?Bean注解一招解决-
spring注解-组件注册
Spring注解之组件注册
spring注解之组件注册
spring注解-组件注册
spring 注解驱动开发组件注册